`

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和untagged详解[文].pdf

    端口Tagged和Untagged详解 作为一名IT行业大师,我将为您详细解释端口Tagged和Untagged的概念及其处理过程。 端口Tagged和Untagged的定义 在IEEE802.1Q协议中,Tagged表示带有VLAN标记的数据帧,而Untagged表示不...

    交换机 tagged 与 untagged 的关系.

    交换机 tagged 与 untagged 的关系 交换机是计算机网络中的一种重要设备,它负责将数据包从一个网络设备传输到另一个网络设备。交换机可以根据不同的需求进行配置,以满足不同的网络环境和应用场景。在交换机中,...

    tagged与untagged区别

    tagged与untagged区别了解tagged,和untagged,掌握其中原理及应用

    agencywide_3rd_quarter_tagged_1.pdf

    agencywide_3rd_quarter_tagged_1.pdf

    windows做传真服务器所需文件

    在Windows操作系统中设置一个传真服务器是一项实用的技术,它允许企业或个人通过计算机发送和接收传真,而无需物理的传真机。以下将详细解释标题和描述中提到的与传真服务器相关的文件,以及它们在系统中的作用。 1...

    TaggedData_tagged_FSX_TaggedData_

    1. C++编程基础:由于文件名包含".cpp",这意味着源代码使用C++编写,因此需要熟悉C++语法和面向对象编程概念。 2. 游戏引擎接口:了解如何与FSX的游戏引擎进行通信,调用其提供的API来获取和设置数据。 3. 数据结构...

    RequestData_tagged_FSX_RequestData_源码

    标题中的"RequestData_tagged_FSX_RequestData_源码"表明这是一个关于微软模拟飞行(Microsoft Flight Simulator X,简称FSX)开发的项目,涉及到的数据获取功能。在这个项目中,开发者可能面临的问题是如何实时获取...

    iOS源码阅读必备知识之Tagged Pointer

    Tagged Pointer是iOS开发中的一种优化技术,特别用于存储小型对象,如NSNumber和NSDate。它在内存管理和性能提升方面有着显著的优势。本文将详细介绍Tagged Pointer的概念、引入原因以及其对程序性能的影响。 ...

    跨VLAN寻找PPPoE服务器.pdf

    跨VLAN寻找PPPoE服务器是一项网络配置技术,旨在解决多VLAN环境下用户通过PPPoE协议上网的问题。PPPoE(Point-to-Point Protocol over Ethernet)是一种在以太网上建立点对点连接的协议,通常用于宽带互联网接入,它...

    tagged:具有样式和继承支持的 Node.js 记录器

    npm install tagged var tagged = require ( 'tagged' ) ;tagged . add ( 'plain' , { trim : false } ) ;tagged . add ( 'em' , { style : 'i' , extend : 'plain' } ) ;tagged . add ( 'strong' , { style : 'b' ...

    blk-mq-tag.rar_MQ_tagged

    在Linux内核中,块设备多队列(Block Multi-Queue,简称blk-mq)是一项重要的性能优化技术,用于提高I/O性能。本压缩包"blk-mq-tag.rar_MQ_tagged"包含的源代码“blk-mq-tag.c”和“blk-mq-tag.h”专门涉及MQ...

    Hybrid故障处理与优化Hybrid基础知识.pptx

    例如,当一台服务器需要访问多个VLAN的资源时,可以通过Hybrid端口实现,而无需设置多个物理接口。Hybrid端口可以配置为Tagged或Untagged,其中Tagged数据帧携带VLAN标签,Untagged数据帧不携带标签,这使得网络管理...

    某保险公司用刀片服务器的以太网配置方案

    在第二个实例中,两台BL680c刀片服务器使用其内置的四个千兆网口,分别位于C7000机箱的1号和2号槽位。 #### 二、GbE2c以太网交换机的配置 GbE2c交换机作为连接刀片服务器的关键组件,在本配置方案中起到了至关重要...

    joomla-tagged-blog

    **1. Joomla! 模板系统** Joomla! 的强大之处在于其模板系统,它允许开发者自定义网站的外观和布局,无需触及核心代码。在这个项目中,开发者创建了一个新的模板,专门针对“类别博客”页面,引入了标签筛选功能。...

    显示FTP服务器或读数据库长字段中TIFF格式的ActiveX控件

    这个特定的ActiveX控件——"显示FTP服务器或读数据库长字段中TIFF格式的ActiveX控件"——是专为处理和展示TIFF(Tagged Image File Format)图像设计的。TIFF是一种广泛使用的位图图像格式,尤其在扫描和印刷行业中...

    C++基础知识简单汇总_终稿106__tagged1

    1. C++中的内存管理: - `new` 和 `delete` 是C++中的动态内存分配和释放操作,它们对应于C语言的 `malloc` 和 `free`。但是,`new` 返回的是对象的指针,而 `malloc` 只返回原始内存块的地址。 - `delete` 用于...

    Tagged Message Delivery Agent-开源

    它是一个本地邮件传递代理,这意味着它在邮件服务器上运行,负责接收、处理并转发邮件到用户的邮箱。TMDA的独特之处在于它使用了一种全面的反垃圾邮件策略,该策略融合了多种技术来确保只有合法的邮件能够到达用户的...

Global site tag (gtag.js) - Google Analytics