来自High Scalability:http://highscalability.com/blog/2010/4/12/poppende-architecture.html
最近看到了一篇介绍一个德国的交友网站架构的文章,网站规模在High Scalability上只能算是个中等的了,不过对于绝大多数普通网站来说,比那些Facebook,Google的案例更有指导意义。这个网站的状况是这样的:
- 2.000.000 users
- 20.000 concurrent users
- 300.000 private messages per day
- 250.000 logins per day
- We have a team of eleven developers, two designers and two sysadmins for this project.
在国内除了屈指可数的几个大网站,一般的大网站也就是这样的一个规模了。文章里逐一说明了它用到的各种技术,和具体的应用形式和优劣。有些地方还是有些借鉴的价值的。
Nginx:似乎很多大网站都已经放弃了Apache而转向Nginx或者Lighttpd了,Poppen前端是2台四岁的老服务器用来支撑峰值为150,000/min的页面请求,另外有3台nginx服务器专门处理图片请求。他们的特别之处在于应用了nginx的memcached模块来实现前端的缓存,这样一来多台前端服务器可以共用同一份缓存,相对于squid或varnish的解决方案,由于同一个页面无需重复生成,就能节省Web应用近一半的运算量。图片服务器的文件保存在本地磁盘, 用户上传的图片集中在一台图片服务器上,另外的三台图片服务器接收到请求后,如果本地没有这个图片,就回到那一个上传图片的服务器去取,然后保存在本地。这里我觉得用豆瓣那样的分布式存储,空间利用上可能会更高效一些,但他们这种的方式更加Simple & Reliable。
PHP-FPM:他们的应用服务器是28台运行着PHP5.3的服务器,每台运行着100个PHP-FPM工作进程,安装了APC。网站是用Symfony1.2开发的,一开始开发速度还是比运行速度重要的,在后期再通过Profile找出性能瓶颈,修改框架的底层代码,通过缓存一些重复的计算,降低框架带来的性能损失。性能分析是使用Facebook开源的XHProf模块实现的,由于XHProf的性能损耗很小,完全可以安装在正式环境中,对真实运行的系统进行Profile,对于发现真正的热点会有很大的帮助。不过对于他们这个规模的访问量(峰值2500/s),还是没算上缓存,他们的服务器数量也太多了点儿,不知道是缓存没起啥作用,还是Symfony的性能损失太大。
MySQL:MySQL似乎是个不变的主角,Scale中最棘手的问题都是在数据库上。Poppen根据网站功能对数据库做了大体的划分。用户相关的数据放在一台服务器上,并且正在准备着进行Sharding,很自然的会用userId进行分区;用户论坛的数据放在由三台机器组成的主从数据库上;用户的custom message存放在4台机器组成的主从数据库上;另外用到了一个NDB集群存放一些写密集的记录用户交互活动的数据;数据库引擎主要用了MyISAM,一切为了速度,但是越来越多的Table Lock让他们开始考虑转向XtraDB。我的上一篇博客有关于MySQL各种引擎的介绍,可以作为参考。
Memcached:他们把Memcache用的挺狠,45G的内存用来存储Session,页面缓存,函数缓存(保存一些函数的执行结果)等,但由于Memcache的功能有限,他们也正准备用MongoDb或Redis Hash API来替代,这样缓存更新时可以更灵活一些。
RabbitMQ:一个用Erlang实现的AMQP(高级消息队列协议),用来做任务的异步处理,现在正在把越来越多的任务交给队列去处理:写日志、发邮件、发消息、图片上传、等等。另外还用到了PHP-FPM的一个比较酷的功能:fastcgi_finish_request(),这个函数可以在PHP执行过程中,先结束HTTP请求的处理,把结果返回给用户,然后PHP脚步继续执行,处理一些用户不需要看到反馈的善后工作,这样就可以给用户更快的页面响应。队列中任务的处理是由两台服务器上的80个PHP进程完成的,每个进程只处理一个任务,然后重启一个进程, 这样来避免资源的泄露。不过这儿还是个保留的可以改进性能的点。
CouchDB:一个Erlang实现的文档型的数据库,感觉和MongoDB类似,他们用来集中的记录日志,不知道为什么他们不选择MongoDB来做这个事。
Graphite:实时的系统状态监控程序。
RED5:据介绍是个Open Source Flash Server,我还不太了解这个概念,不知道Flash Server都提供什么Service,在Poppen是用来支持在线视频播放和视频聊天的。文章后面的介绍中,他们似乎对这个系统不怎么满意,准备转移到Oneteam Media Server,written in Erlang.
TSUNG:Poppen的人似乎对Erlang情有独钟,这个东西也是个Erlang写的,分布式性能测试工具。
One Comment
很不错的分享,要留名仔细阅读