阅读更多



从诞生到拥有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
  • 大小: 5 KB
  • 大小: 41.9 KB
  • 大小: 42 KB
  • 大小: 43.3 KB
  • 大小: 50.3 KB
  • 大小: 67.2 KB
19
0
评论 共 9 条 请登录后发表评论
9 楼 a8680 2011-08-22 22:51
真羡慕有那么多机器,我们现在做的项目日UV 100万左右,PV 1000W左右,只有2台旧机器,8G内存。前台后台都在一起,MySQL数据库。。。天天申请硬件,一直申请不到。。。
8 楼 shanglo 2011-08-22 19:28
[flash=200,200][/flash]
7 楼 543089122 2011-08-22 19:25
引用
weilJava 写道
暗夜骑士0376 写道
Frankie199 写道
2004年就用PHP,至今尽然没有换过,PHP真来神器啊

哥们,这篇文章讲的是Java好不好

"当时,Java开发主要是面向企业开发,Python吸引了很少的程序员,Perl不是我们想要的种类。此外,我们知道雅虎是PHP的大拥护者,所以如果需要,有可能在业务方面得到扩展。 "  他们用的是PHP啊,在什么地方明确有提到java吗?


1、我的团队说服我使用Java构建搜索功能,以便我们能从Lucene库中受益。当得知运行得很好时,我松了一口气,我早期不大愿意使用JDK 1.0,现在却对这个平台产生了巨大的兴趣。

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

3、Java在这期间扮演了一个极其重要的角色,部分原因是由于Java越来越被认可,专业人才越来越多,但是这也

看文章不仔细,却还在那里争执。。。。
6 楼 weilJava 2011-08-22 17:13
暗夜骑士0376 写道
Frankie199 写道
2004年就用PHP,至今尽然没有换过,PHP真来神器啊

哥们,这篇文章讲的是Java好不好

"当时,Java开发主要是面向企业开发,Python吸引了很少的程序员,Perl不是我们想要的种类。此外,我们知道雅虎是PHP的大拥护者,所以如果需要,有可能在业务方面得到扩展。 "  他们用的是PHP啊,在什么地方明确有提到java吗?
5 楼 暗夜骑士0376 2011-08-22 10:19
Frankie199 写道
2004年就用PHP,至今尽然没有换过,PHP真来神器啊

哥们,这篇文章讲的是Java好不好
4 楼 Frankie199 2011-08-22 08:54
2004年就用PHP,至今尽然没有换过,PHP真来神器啊
3 楼 fys124974704 2011-08-21 22:17
学习了!!!!
2 楼 achun 2011-08-21 21:44
这个指标很重要啊,看来100w是个分水岭
1 楼 foxty 2011-08-21 21:19
100w用户的时候,20台服务器,数据库服务器还是single的吗?

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • Axis2 接口生成wsdl工具

    webserice开发工具。Axis2不仅支持SOAP1.1和SOAP1.2,还集成了非常流行的REST WebService,同时还支持Spring、JSON等技术。

  • axis2根据wsdl生成java客户端代码

    axis2根据wsdl生成java客户端代码 D:\Software\axis2-1.6.2\bin>wsdl2java.bat -uri http://10.33.30.216:9099/facs/services/ResourceSynchroWebService?wsdl -o E:\wsdloutput -p com.util wsdl2java.bat -uri ...

  • WeBService AXIS2根据wsdl文件生成接口及接口的调用

    1、下载axis2-1.6.2-bin.zip 文件,并解压 2、配置环境变量 D:\开发文档\axis2-1.6.2\bin 3、将要转换的wsdl文件加放到bin目录下 4、shift + 鼠标右键 在此处打开命令窗口 5、在cmd窗口输入命令 wsdl...

  • webService通过axis编辑wsdl文件生成代码

    webService通过axis编辑wsdl文件生成代码

  • java axis wsdl_[webservice] axis 根据wsdl 生成 java 代码

    最近维护一个老系统,数据交换部分用 axis开发的。由于要添加新的功能,打算用Apache-...下面的这篇博客是参考资料,在Myeclipse中添加axis的jar包。axis.jarcommons-beanutils.jarcommons-codec-1.3.jarcommons-c...

  • axis2 1.6.2 生产wsdl客户端代码

    使用axis2 1.6.2 生成webservice wsdl客户端代码,快速便捷,方便操作。使用有问题可留言,如看到尽快回复

  • wsdl2java源码-Axis1WebService:Axis1WebService例子,通过wsdl文件生成服务器端代码并部署

    wsdl2java 源码 Axis1 通过wsdl文件生成服务器端代码并部署 ...在out(根据项目而定)目录生成server-config.wsdd,拷贝server-config.wsdd至项目WEB-INF中 启动项目 webservice信息 列出所有服务,点击某一个看

  • Axis2解析wsdl反向生成webservice客户端代码

    1、下载axis2-1.6.2.zip(http://archive.apache.org/dist/axis/axis2/java/core/ )并解压到你的任意盘下(最好下载的版本和项目中pom文件中的axis2的版本一致) 2、设置axis2的环境变量 3、把wsdl文件保存到本地 ...

  • Axis2发布webservice(3)--axis2生成wsdl文件,并利用wsdl文件来生成WebService的Java代码

    一、利用axis2生成wsdl文件 1、file->New->Other->Axis2 Code Generator 2、选择第2个,点击next 3,先点击add folder->浏览选择WebService项目下的bin文件夹,然后在fully Qualified Class name中填入类路径...

  • Springboot集成Axis2——通过wsdl生成webService

    Springboot集成Axis2——通过wsdl生成webService背景介绍下载Axis2使用wsdl2java工具执行代码生成服务端代码生成命令客户端代码生成命令生成服务端代码生成客户端代码 背景介绍 客户方需要通过WebService进行消息...

  • WebService系列之使用Axis调用第三方wsdl接口

    WebService系列之使用Axis调用第三方wsdl接口 Web Service是一个平台的,低耦合的,自包含的、基于可编程的web的应用程序,可使用开放的XML(标准通用标记语言下的一个子集)标准来描述、发布、发现、协调和配置这些...

  • 使用axis2解析wsdl生成Webservice客户端代码

    直接用dos命令生成代码,不需要把axis2插件安装到eclipse或者idea中最近做的大部分工作都是接口开发,之前做久了SAP的RFC接口模式的开发,Webservice的使用忘记了不少,所以记录一下,加深印象。安装axis2(下载请...

  • 用Axis2解析wsdl生成Webservice客户端Java代码

    1.下载axis2,地址http://www.apache.org/dyn/closer.lua/axis/axis2/java/core/1.7.9/axis2-1.7.9-bin.zip 2.设置axis2的环境变量 (配置系统变量) AXIS2_HOME = C:\software\axis2\axis2-1.7.9 Path = %AXIS2_...

  • 抛出无法找到主类:org.apache.axis.wsdl.WSDL2Java

    抛出无法找到主类:org.apache.axis.wsdl.WSDL2Java(Throws Could not find main class: org.apache.axis.wsdl.WSDL2Java)。 添加本文的jar包压缩包解压出来的所有jar包到当前使用的java.exe 命令的lib目录下的ext...

  • Axis2生成wsdl的一种方法

    a)下载axis2-1.6.1-war.zip,该文件用于将WebService发布到Web容器中。下载地址是: http://axis.apache.org/axis2/java/core/download.html b)将axis2-1.6.1-war.zip文件解压到 安装目录>\webapps文件夹下,启动...

  • 使用Axis2解析wsdl生成Webservice客户端Java代码

    直接用dos命令生成代码,不需要把axis2插件安装到eclipse或者idea中 最近做的大部分工作都是接口开发,之前做久了SAP的RFC接口模式的开发,Webservice的使用忘记了不少,所以记录一下,加深印象。 安装axis2(下载请...

  • spring boot 集成webservice axis(2) axis由wsdl或者xml生成客户端代码

    选择3.选择wsdl文件4.选择代码生成的位置5.在pom.xml中引入axis依赖或者在普通项目中引入jar包spring boot 集成webservice axis(1) eclipse axis插件安装spring boot 集成webservice axis(3) axis集成到项目...

  • 根据 axis2自动生成wsdl的java类,编写客户端

    因为发现很多人现在 对webservice的调用都是死记硬背,有些...根据 axis2自动生成wsdl的java类,编写客户端 1.首先必须安装java客户端(这是基础,就不说了) 2.查看webservice 这里随便找了2个用不同技术写的web...

  • axis idea 设置apache_webservice axis 使用idea从wsdl生成客户端和服务端代码

    因为webservice技术比较早,近几年随着restful等技术的兴起,已经不太流行了,使用idea生成的话,好像只有idea2018和之前的版本有效,本文讲一下如果利用idea通过wsdl文件生成webservice的客户端和服务端代码,以备...

  • 基于java的-28-“智慧食堂”设计与实现--LW-源码.zip

    提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

Global site tag (gtag.js) - Google Analytics