Tagged社交网站扩展到上千个服务器过程中的5个快照

【伯乐在线导读】:本文作者 Johann Schleier-Smith,他是Tagged的联合创始人兼CTO。2004年 Tagged 还是一个微不足道的实验性社交网站,如今它已经成为最大的社交网络之一。

如今每个月,登录Tagged 网站的会员有数百万计,每月有50亿网页浏览量(PV), 会员们在这里参与各种社交活动并结交新朋友。这迫使我们逐步地提升我们的架构,使得平台能够胜任Tagged的飞速发展。根据Tagged网站首页的信息,可知其用户已超过1亿。

1. PHP web应用程序, 10万用户, 15台服务器, 2004年

Tagged诞生于一个孵化器的快速成型培养项目,该项目每年都会寻找两个获奖的创意并启动创业。 LAMP是实现这种创意的自然选择,它强调灵活性并能够快速适应变化,与此同时,Java的定位是大型企业级应用开发,Python得到程序员 的关注寥寥,Perl针对的并非此类项目。我们也了解到Yahoo是PHP的坚定支持者,因此当我们业务扩张时 LAMP应该能提供相应的支持。

编注:LAMP:Linux+Apache+Mysql+Perl/PHP/Python一组常用来搭建动态网站或者服务器的开源软件,本身都是各自独立的程序,但是因为常被放在一起使用,拥有了越来越高的兼容度,共同组成了一个强大的Web应用程序平台。参见LAMP词条。

之前项目使用MySQL的深刻经历让我对它爱恨交加。本着实验主义精神我们为Tagged购买一些基础的Oracle授权,想看看Oracle 能否让Tagged变得更好。很明显,许多小的web站点仍然在采用这样的结构。简洁之美正在于此。无组织的PHP和组织化的Oracle这两个方向的分 割在单个服务器上将最具技巧的部分浓缩在了一起,在此基础上添加额外的页面显示计算能力变得轻而易举。

2. 带高速缓存支持的PHP web应用程序, 100万用户, 20台服务器, 2005年

即使在只有8台服务器的时候,Tagged遇到的网络拥堵也超出我们大多数人的想象。幸运的是内存高速缓存带来了双重好处,它减少了90%的数据库读取并确保与其它信息打包在一起的社交网络页面可以快速呈现。

从一开始,我们的对象缓存策略就强调显式的缓存更新,支持例如删除无效的键值、定时器判定超时的过期数据等简单技术。这些技术虽然增加了代码复杂度,但确实有效地减少了数据载入并让站点保持快速访问,在涉及到需要频繁更新的对象时效果尤其明显。

我们的站点复杂度逐渐超过了通常的社交网络网站功能(朋友,评价,消息),我们还提供搜索和社会关系发现功能。我的团队劝我使用 Java来构建搜索,这样就可以利用Lucene库并从中受益。当我们可以对此运用自如时我松了口气,我对Java的态度从JDK1.0时的不 情愿变成热情地拥抱Java平台。

编注:Lucene:是一个开源的信息检索软件库,由Java编写,最初由Doug Cutting发布。

3. 数据库扩展, 1千万用户, 100台服务器, 2006年

当Tagged拥有1千万注册用户同时在线人数达到上千人的时候,我一直担心的问题出现了。那个时候我们刚刚筹集资金并致力于快速发展,但是数据库容量达到了极限。虽然我们马上陆续地增加数据缓存或者对SQL进行优化,但是我们的服务器CPU使用率还是常常逼近100%。

虽然增加服务器能够快速解决问题,但是带有multi-socket支持的服务器硬件需要上百万的投入,所以我们选择了Oracle RAC,这样可以在标准的网络环境下连接多台普通的Linux主机来构建一个大数据库。再配合最新的CPU,Oracle RAC可以在原来的基础上增加20倍数据存储容量,这使得应用程序工程师可以专注于新功能的开发。

当我们需要将个性化的寻人匹配功能与内存中大量的数据结合时,Java再一次成为了系统的合适选择,而这是PHP不可能完成的。

4. 数据库分片,5千万用户, 500台服务器, 2007年

在Tagged扩展的过程中,数据分片毫无疑问是挑战最大但也是回报最大的技术。通过对多个数据库中的用户数据进行分隔,我们最终找到一种设 计,它能保证在扩展系统时仅仅需要添加硬件设备。在Tagged设计中,我们制定了每个数据表被分片在64个分区上,除非有令人信服的理由否则这个默认设 置不允许例外。只有对玩家之间交互有性能要求的游戏才会采用在一个单独的数据库内进行垂直分区。

编注:数据分片:一种分布式计算,通过业务逻辑将不同的分类的数据保存到不同的数据库(具有相同的表结构)中。可以简单看作是一种负载均衡技术,因为每个表中的 数据少了, 查询速度就快了,系统能承受的负载也就大了。很多大公司都在用这种技术,比如Google, Facebook, Wikipedia等等。参考数据分片。

对现有的数据分片意味着在上TB的数据之间进行复杂的转换。一开始我们针对产品功能逐个进行分片处理,通过应用程序代码来取代数据库 JOIN。但是,我们逐渐发现有很多与核心应用程序相关的表之间关系过于紧密没有办法使用这种方法进行分片。最终,通过编写数据库移植程序来生成SQL, 我们实现了对数以亿计的数据行导出、转换并重新加载,并采用触发器对源系统进行变化跟踪并增量地更新目标系统,所以最终的系统同步在30分钟内得以完成。

编注:1TB = 1024GB

多个数据库意味着有多个数据库连接。尤其是当我们添加更多”社交发现“功能的时候,比如”Meet Me”--我们第一个约会功能,由于缺乏Oracle的连接池支持,在进行数据分片时PHP完全不能胜任。为了应对这种情况,我们编写一个Java程序提 供数据查询的web service服务,同时该程序还可以非常方便地进行数据监控并能很好地处理数据库异常。

5. 优化及扩展, 8千万用户,1000台服务器,2010年

这里我们略过几年。随着数据库扩展这一关键问题的解决,我们可以直接通过添加硬件来解决扩展的问题。在快速地功能开发过程中PHP和内存缓存机制依旧发挥 着重要作用。这段时间里随着系统脆弱部分的不断增加,我们关注的重点从对扩展性的考虑转移到尽量减少系统错误。为保护web层我们采取了负载均衡检查和自 动关闭不响应服务来减少错误。与此同时,我们也对核心组件进行适应性扩展,例如,如果内存缓存因为连接过多而超载,它必须能够在负载解除的时候马上恢复。

随着接受程度的增加并且语言本身越来越成熟,也因为我们面对的越来越多的挑战,Java扮演的角色变得越来越重要。为了对付垃圾邮件和其他恶意访问,我们 的算法利用了大量的共享内存空间以及计算密集型技术。社交游戏同时也受益于Java的性能以及并发控制机制,但这是以复杂性作为代价,现在我们需要管理比 以前更多不同的应用程序缓冲池。

未来的发展

时至今日,Tagged每个月为它的百万用户提供50亿页面浏览量PV。我们的设计可以方便地进行扩展,因此可以把更多的精力投入到开新功能以便更好地为用户提供服务。现有的工具可以高效地开发具有可扩展性的软件,但是我们希望可以做得更好,因此现在我们把投资的重点转移到软件库的开发、程序员的效率和生产率的提高,以及即将发布的针对大型社交网络、实时服务以及云应用设计的开源图形数据库项目Stig。

打赏支持我翻译更多好文章,谢谢!

打赏译者

打赏支持我翻译更多好文章,谢谢!

任选一种支付方式

1 收藏 评论

关于作者:唐尤华

做自己喜欢的,编程、喝茶、看世界 个人主页 · 我的文章 · 18 ·    

相关文章

可能感兴趣的话题



直接登录
跳到底部
返回顶部