Tagged—— 1亿用户,1000台服务器,50亿PV的优化史

标签: tagged 用户 服务器 | 发表时间:2011-08-21 18:18 | 作者:(author unknown) wangdei
出处:http://www.iteye.com



从诞生到拥有1000台服务器的五个优化步骤

2004年以来,Tagged已经从一个微不足道的社交实验产品成长为最大的社交网络之一,每月数百万计的用户在这个网站上与其他人接触和交往,创造了50亿次页面访问。下面每一个步骤为一个优化阶段,这迫使我们不断改进网站的架构,最终发展成一个庞大的、有影响力的平台。

V1:PHP Web应用,10万用户、15台服务器,2004年



Tagged 诞生于孵化器快速成型文化(通常每年会推出两个新概念,并寻觅其中的大赢家)时期。LAMP是这种工作的自然选择,它强调灵活性和快速开发周期,当时,Java开发主要是面向企业开发,Python吸引了很少的程序员,Perl不是我们想要的种类。此外,我们知道雅虎是PHP的大拥护者,所以如果需要,有可能在业务方面得到扩展。

在之前的项目中使用MySQL的经验,让我对这项技术爱恨交加。本着实验的精神,我们为Tagged购买了一些入门级的Oracle许可,看看是否能更好地工作。

值得注意的是,许多小网站仍像之前的Tagged一样,具有简约之美,无状态(stateless)的PHP和有状态(stateful)的Oracle之间的两种分歧是一个服务器中最复杂的部分。而其他的页面呈现计算能力很容易添加。

V2:缓存PHP Web应用,100万用户、20台服务器,2005年



即便Tagged拥有8台服务器,它还是有超乎我们想象的更多的网络流量,幸运的是,memcached带来了双重优势,既消除了超过90%的数据库读操作,随之也让有不同信息的社交网络页面变得快速。

从一开始,我们的对象缓存注重显式缓存更新,支持简单的技术,如删除无效的键,或终止基于定时器的陈旧数据。虽然代码更加复杂,但大幅度地降低了数据库负荷,加快了网站速度,尤其是当涉及经常更新的对象时更是如此。

我们的网站不断发展,随着搜索和社交发现(social discovery)功能的增加,其复杂性超出了标准的社交网络功能(朋友、个人网络档案、消息、通讯)。我的团队说服我使用Java构建搜索功能,以便我们能从Lucene库中受益。当得知运行得很好时,我松了一口气,我早期不大愿意使用JDK 1.0,现在却对这个平台产生了巨大的兴趣。

V3:数据库扩展,1千万用户、100台服务器,2006年



随着1千万的注册用户和随时都有数千人同时在线,我们即将开始我一直都担忧的改革。我们已经募集了资金,一直致力于网站发展,但是数据库的容量即将达到极限。我们一次又一次地进行缓存或SQL优化调整,但是我们服务器的CPU还是时不时地趋向100%。

网站扩张是个很好的解决方案,但multi-socket服务器硬件可能耗资数百万,所以我们选择Oracle RAC,这可以让我们使用标准的网络去连接多个大众化的Linux主机,以建立一个庞大的数据库。结合最新的CPU的优势,Oracle RAC的容量比我们的第一台数据库服务器增加了20倍,这可以让程序开发人员专心于新功能的建设。

通过将内存中大量数据集的数据统计到一起,Tagged开始提供个性化的用户匹配建议,这是使用PHP所做不到的,Java 逐步融入到我们的环境中了。

V4:数据库拆分,5千万用户、500台服务器,2007年



拆分数据库毫无疑问是最具挑战的工作,但也是Tagged优化过程中收效最大的工作。通过拆分多个数据库中的用户,我们终于发现了一个方法,在所有的地方,我们可以通过添加硬件来进行扩展。

在Tagged中,我们有一个规则,就是每个表拆分成横跨64个分区,我们严格按照这个规则,除非有非常令人信服的理由才除外。只有确实有益于高效保护玩家之间交易的游戏,才能垂直分区在一个单独的数据库中。

拆分现有的数据意味着要对数TB数据进行复杂的转换。起初,我们逐个进行处理,依靠程序代码来代替连接,但最终,我们发现这种方法中,应用程序核心的大量表的链接太过紧密。我们编写了迁移程序来生成SQL,导出、转换、重新加载数亿行数据、使用触发器跟踪源系统上的变化、逐步更新目标,最终使同步导致的停运时间在30分钟以内。

拥有许多数据库意味着许多的数据库连接,特别是我们增加了更多的“社交发现”功能,比如 Meet Me功能(我们的第一个约会功能),由于缺少Oracle连接池,PHP不堪重负。为了解决这个问题,我们编写了一个Java程序,负责运行查询的web服务,该服务也继续提供一个非常方便的监测点,便于很好地处理数据库故障。

V5:优化和扩展,8千万的用户、1000台服务器,2010



这里我们直接往前跨越几年。关键数据库扩展问题得到了解决,我们发现仅仅通过添加硬件就可以进行扩展。PHP和memcached继续很好地为我们服务,也支持网站功能快速开发。

在这期间,对扩展问题的考虑开始转向故障处理和解决越来越多易损部分产生的威胁。通过负载平衡器的健康检查和自动关闭无响应的服务,实现了对Web层的保护。我们还设计了弹性的核心部分,例如,如果memcached因连接过多而超负荷,一旦负荷被移除,它必须立即恢复。

Java在这期间扮演了一个极其重要的角色,部分原因是由于Java越来越被认可,专业人才越来越多,但是这也因此带来了更多的挑战。为了应对垃圾邮件和其他的弊端,我们的算法利用了大量的共享内存空间以及密集计算技术。社交游戏也得益于Java的性能和并发性控制,但代价是系统较复杂,我们现在需要管理比以前更多的不同的应用程序池。

展望

现在,Tagged 每月有50亿的页面浏览量和数以百万计的成员。自从我们实现了可扩展设计,我们可以花费大量的精力在为用户更好地服务的功能创建上。我们拥有创建可扩展软件的高效工具,但我们想往更好的方面发展,所以目前将重点放在软件库、提高程序员的效率和生产力、Stig(我们即将推出的开源的、基于图形的、为大型社交网络、实时服务和云计算应用所设计的数据库项目)上。

VIA http://highscalability.com/blog/2011/8/8/tagged-architecture-scaling-to-100-million-users-1000-server.html


感谢 wangguo 投递这篇资讯

已有 5 人发表留言,猛击->>这里<<-参与讨论


ITeye推荐



相关 [tagged 用户 服务器] 推荐:

Tagged—— 1亿用户,1000台服务器,50亿PV的优化史

- wangdei - ITeye资讯频道
从诞生到拥有1000台服务器的五个优化步骤. 2004年以来,Tagged已经从一个微不足道的社交实验产品成长为最大的社交网络之一,每月数百万计的用户在这个网站上与其他人接触和交往,创造了50亿次页面访问. 下面每一个步骤为一个优化阶段,这迫使我们不断改进网站的架构,最终发展成一个庞大的、有影响力的平台.

kernel.org服务器遭入侵

- Lamo - Solidot
kernel.org网站首页发布公告,声称多台服务器在本月初(8月12日前)遭黑客攻击,他们在8月28日发现了入侵. 入侵者利用一位用户凭证获得了服务器根访问权限,他们正在调查黑客是如何提升权限的;系统启动脚本被加入了一个木马启动文件;ssh相关文件被修改. kernel.org声称,他们相信Linux kernel源代码库未受影响,因为git分布式版本控制系统的特性决定了它可以很容易注意到代码变化.

Ubuntu下赌ARM服务器

- Tim - Solidot
今日无数手机平板使用的低能耗处理器能否撑起未来的服务器市场. Canonical计划推出支持ARM架构的Ubuntu服务器版本. Ubuntu Linux并不是x86服务器市场的重量级选手,Red Hat才是. 但通过与ARM合作打造ARM服务器,Canonical正努力赢得更多市场份额. 计划于2011年10月发布的Ubuntu Server 11.10,将同步推出支持x86、x86-64和ARM架构的版本.

Windows 搭建VPN服务器

- 洋白菜 - iGFW
Windows XP搭建PPTP VPN. 普通用户,在家里也可以搭建自己的VPN. 需要将服务器端的电脑直接放置于外网访问下,若是ADSL拨号的话,可以用此电脑直接拨号,中间不接路由器. 若是接路由器的话,可以启用NAT(网络地址转换)中的DMZ,将该服务器IP地址填入此处,那么外网访问到本路由Wan口时,就会直接转到该服务器上.

浅谈web服务器—Nginx

- - CSDN博客推荐文章
常见的web服务器有apache,Nginx,lighttpd等. 但Nginx作为一款高性能的Http和反向代理服务器,由于其高效率、简配置等优势在业内被广泛使用. 目前Taobao、新浪、赶集网、金山、豆瓣网、网易新闻等众多知名互联网企业的服务器都是采用Nginx. 根据url的不同,将HTTP请求转发到后端的应用服务器集群.

centos linux 服务器安全

- - 操作系统 - ITeye博客
我们必须明白:最小的权限+最少的服务=最大的安全. 所以,无论是配置任何服务器,我们都必须把不用的服务关闭、把系统权限设置到最小话,这样才能保证服务器最大的安全. 下面是CentOS服务器安全设置,供大家参考. 一、注释掉系统不需要的用户和用户组. 注意:不建议直接删除,当你需要某个用户时,自己重新添加会很麻烦.

Java NIO服务器实例

- - ImportNew
我一直想学习如何用Java写一个 非阻塞IO服务器,但无法从网上找到一个满足要求的服务器. 我找到了 这个示例,但仍然没能解决我的问题. 还可以选择 Apache MINA框架. 但我的要求相对简单,MINA对我来说还稍微有点复杂. 所以在MINA和一些教程(参见 这篇和 这篇)的帮助下,我自己写了一个非阻塞IO服务器.

angularjs与服务器交互

- - CSDN博客Web前端推荐文章
真正的应用需要和真实的服务器进行交互,移动应用和新兴的Chrome桌面应用可能是个例外,但是对于此外的所有应用来说,无论你是想把数据持久化到云端,还是需要与其他用户进行实时交互,都需要让应用与服务器进行交互. 为了实现这一点,Angular提供了一个叫做$http的服务. 它提供了一个可扩展的抽象方法列表,使得与服务器的交互更加容易.

AngularJS与服务器交互

- - JavaScript - Web前端 - ITeye博客
        对于AJAX应用(使用XMLHttpRequests)来说,向服务器发起请求的传统方式是:获取一个XMLHttpRequest对象的引用、发起请求、读取响应、检查状态码,最后处理服务端的响应. }else if(xmlhttp.status == 400) { //或者可以是任何以4开头的状态码.

公共 DNS 服务器 IP 地址 及各省DNS服务器

- - 企业架构 - ITeye博客
公共 DNS 服务器 IP 地址. 名称 DNS 服务器 IP 地址. 全国各地电信 DNS 服务器 IP 地址. 名称 DNS 服务器 IP 地址. 全国各地联通 DNS 服务器 IP 地址. 名称 DNS 服务器 IP 地址. Apple TV DNS 服务器 IP 地址. 名称 DNS 服务器 IP 地址.