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



从诞生到拥有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 

你可能感兴趣的:(Tagged,社交网络,php,java,优化,框架与架构)