Facebook无疑是现在世界上最大的PHP站点,关于Facebook的技术架构可以在网上搜索到很多资料,今天我们来了解另外一个百万级PHP站点的网站架构:Poppen.de。

Poppen.de是德国的一家交友/ 聊天/ 视频 的SNS网站,对于该网站的统计数字有:1)200万的用户数,2)2万的并发用户数,3)每天产生30万的私信,4)25万的日登录用户数。这样的网站也就是个中型规模的网站,下面看看这个网站在技术应用及经验方面带来的东西。但它有一个很好的架构,融合了很多技术,如 Nigix、MySql、CouchDB、Erlang、Memcached、PHP、RabbitMQ(消息服务器),采用了Graphite作为网站的系统监 控,Red5作为视频服务,Tsung作为压力测试工具,选择的技术种类较多。而项目团队有11个开发人员,两个设计,两个系统管理员。该站点的商业模式采用免费增值模式,用户可以使用搜索用户、给好友发送消息、上载图片和视频等功能。

如果用户想享受不受限制发送消息和上载图片,那么就得根据需要支付不同类型的会员服务,视频聊天及网站其他服务也采用同样的策略。
Poppen.de 是德国的×××/约会网站,小朋友不要随便上哦,网站里的内容很开放,有很多怪叔叔(Gay),呵呵。与Facebook这样巨头网站相比算是一个小型网站了,但是通过Poppen.de网站这次对外的技术信息分享,可以看出网站有个不错的技术架构,让我们可以从中得到很多值得学习与借鉴的内容。
NSFW这个英文缩写常常出现在Blog中,表示某个站点含有露点或者极度暴力的内容,如果你在上班的时候打开这个网站你的同事经过你身边的时候估计会让你很尴尬,呵呵。所以目前我们通过普通方式是无法打开这个站点,如果你非要满足自己的好奇心的华可以自己想办法解决,我就不明说了。这里来个截图,如图所示:

百万级PHP站点Poppen.de的技术架构_休闲

技术架构描述

Nginx(web服务器)

Poppen.de 所有的服务都是基于Nginx服务上的,包括静态请求和动态请求。前端有两台Nginx服务器在高峰期提供每分钟15万次请求的负载,每个机器已经有四年寿命,并且只有一个CPU 和3GB RAM。Poppen.de拥有三台独立的图像服务器,由三台Nginx服务器为*.bilder.poppen.de提供每分钟8万次请求服务。

Nginx 架构中一个很酷的设计就是有很多请求是由Memcached处理的,因此请求从缓存中获取内容而不需要直接访问PHP机器。比如,用户信息页(user profile)是网站需要密集处理的内容,如果把用户信息页全部缓存到Memcached上,那么请求直接从Memcached上获取内容。对于缓存整个动态请求页面内容,这是一种方法,更常见的是使用squid、varnish来做。 Poppen.de的Memcached每分钟可以处理8000次请求。

架构中有三个Nginx图像服务器提供本地图像缓存,用户上载图像到一个中央文件服务器。而前端的nginx在请求时会做本机的cache处理(不知道它的请求是如何落到 nginx上的,如果是随机的,多台nginx本机cache的数据就重复了,有些浪费,但也最简单),对于图片量不大的情况倒是简单的处理方法。当向这三个Nginx之一中请求图像时,如果服务器本地中没有存在该图像,则从中央文件服务器下载到该服务器上作缓存并提供服 务。这种负载均衡的分布式图像服务器架构设计可以减轻主要存储设备的负载。

PHP-FPM(语言环境)

该网站运行在PHP- FPM上。共有28台双CPU、6GB内存的PHP机器,每个机器上运行100个PHP-FPM的工作线程。使用启用了APC的PHP5.3.x。 PHP5.3可以降低CPU和内存使用率的30%以上。

程序代码是基于Symfony1.2框架之上开发的。一是可以使用外部资源,二是 能够提高项目开发进度,同时在一个著名的框架上可以让新开发人员更容易加入到团队中来。虽然没有任何事情都是十全十美的,但可以从Symfony框架中得 到很多好处,让团队可以更多的精力放在Poppen.de的业务开发上去。

网站性能优化使用XHProf,这是Facebook开源出来的一个类库。这个框架非常容易个性化和配置,能够可以缓存大部分高代价的服务器计算。

MySQL(数据库)

MySQL是网站主要的RDBMS。网站又几个MySql服务器:一台4CPU、32GB的服务器存储用户相关信息,如基本信息、照片描述信息等。这台机器已经使用了4 年,下一步计划会使用共享集群来替换它。目前仍基于这个系统上进行设计,以简化数据访问代码。根据用户ID进行数据分区,因为网站中大部分信息都是以用户 为中心的,如照片、视频、消息等。

有三台服务器按主-从-从配置架构提供用户论坛服务。一台从服务器负责网站自定义消息存储,到现在有 2.5亿条消息。另外四台机器为主-从配置关系。另外由4台机器配置成NDB族群专门服务于密集型写操作数据,如用户访问统计信息。

数据表设计尽量避免关联操作,尽可能缓存最多的数据。当然,数据库的结构化规范已经完全被破坏掉了。因此,为了更容易搜索,数据库设计创建了数据挖掘表。大部分表是MyISAM型表,可以提供快速查找。现在的问题是越来越多的表已经全表锁住了。Poppen.de正考虑往XtraDB存储引擎上迁移。

Memcached(缓存)

cache为王,Poppen.de有超过45GB的高速缓存和51个节点。缓存了Session会话、视图缓存以及函数执行缓存等。架构中有一个系统 当记录被修改时可以自动地把数据更新到缓存中去,其好处自然是减少了应用处理。未来改善缓存更新的可能方案是使用新的Redis Hash API或者MongoDB。

RabbitMQ(消息服务器)

在 2009年中开始在架构中使用RabbitMQ。这是一个很好的消息解决方案,便于部署和集中到这个架构中去,在LVS后运行了两台RabbitMQ服务 器。在上个月,已经把更多的东西集成到该队列中,意味着同一时刻有28台PHP服务器每天要处理50万次请求。发送日志、邮件通知、系统消息、图像上载等 更多的东西到这个队列中。

应用PHP-FPM中的fastcgi_finish_request()函数集成队列消息,可以把消息异步发 送到队列中。当系统需要给用户发送HTML或JSON格式响应时,就调用这个函数,这样用户就没有必要等到PHP脚本清理。

这个系统可以改善架构资源管理。例如,在高峰期服务每分钟可以处理1000次登录请求。这表示有1000并发更新用户表保存用户的登录时间。由于使用了 队列机制,可以 按相反的顺序来运行这些查询。如果需要提高处理速度,只需要增加更多的队列处理者即可,甚至可以增加更多的服务器到这集群中去,而不需要修改任何配置和部 署新节点。

CouchDB

日志存储CouchDB运行在一台机器上。在这台机器上可以根据模块/行为进行日志查询 /分组,或者根据错误类型等等。这对定位问题非常有用。在使用日志聚合服务CouchDB之前,不得不逐台登录到PHP服务器上设法日志分析定位问题,这 是非常麻烦的。而现在把所有的日志集中到队列中保存到CouchDB中,可以集中进行问题检查和分析。

Graphite(系统监控)

网站使用Graphite采集网站实时信息并统计。从请求每个模块/行为到Memcached的命中和未命中、RabbitMQ状态监控以及Unix负 载等等。Graphite服务平均每分钟有4800次更新操作。实践已经证实要监测网站发发生什么是非常有用的,它的简单文本协议和绘图功能可以方便地即 插即 用的方式用于任何需要监控的系统上。

一件很酷的事情是使用Graphite同时监控了网站的两个版本。一月份部署了Symfony框架新 版本,以前代码作为一个备份部署。这就意味着网站可能会面临性能问题。因此可以使用Graphite来对两个版本在线进行对比。

发现新版本上的Unix负载表较高,于是使用XHProf对两个版本进行性能分析,找出问题所在。

如果你想尝试一下的话,具体的安装步骤参见:http://graphite.wikidot.com/installation
安装好以后的效果如图所示:

百万级PHP站点Poppen.de的技术架构_休闲_02

graphite图示

Red5

网站为用户也提供了两种类型的视频服务,一种是用户自己上载的视频,另外一种是视频聊天,用户视频互动和分享。到2009年年中,每月为用户提供17TB的流量服务。

Tsung

Tsung 是一个Erlang编写的分布式基准分析工具。 在Poppen.de网站中主要用于HTTP基准分析、MySQL与其他存储系统(XtraDB)的对比分 析。用一个系统记录了主要的MySQL服务器的流量,再转换成Tsung的基准会话。然后对该流量进行回放,由Tsung产生数以千计的并发用户访问实验 室的服务器。这样就可以在实验环境中与真实场景非常接近。

如图:

百万级PHP站点Poppen.de的技术架构_架构_03

tsung-report_s

如果你有兴趣的话,可以查看Tsung详细的用户手册:http://tsung.erlang-projects.org/user_manual.html

经验

1、背靠大树好乘凉,选择技术和工具时要挑成熟、活跃的社区,这样有问题也有途径及时解决。
2、了解你所使用的技术的优缺点,发挥它的优点,避开它的缺点。
3、扩展工具,让工具更好的满足你。
4、敢于尝试。可以看到,越是大公司,在技术选型时越是缩手缩脚,生怕外面的东西不成熟有问题,总相信自己能造成更好的自己能掌控的轮子。而看看 Poppen.de上面提到的东西,有多少是你不知道没用过的?再感慨一下,每天都有大量的开源项目出现,一些因为被人关注而众人拾柴,东西就存活下去, 一些尽管东西很好但因为无人问津,也就悄无声息的死去。
5、度量一切,对网站的各个模块、系统、流量等数字有清晰的认识。
6、经验积累、全面把握。不要等到上线时发现新模块的功能不是需要的,不要等到上线时发现模块性能不满足需求。

总结

下图为网友猜想的poppen.de的架构示意图:

百万级PHP站点Poppen.de的技术架构_架构_04

architecture_s

Poppen.de还做了些展望,比如将更多的使用erlang产品,这要是个国内的公司,估计很多人会膜拜的。而总结来说,Poppen.de分享的东西真是很实在很实用,是个很开放也很技术流的公司,对中小规模的网站来说是可充分借鉴的。

来至Javabloger的总结:

1.越来越多的网站由于业务的壮大,在寻求通过消息传递的,异步式架构的方案,在poppen.de中使用的RabbitMQ是Erlang编写的消息服务器,支持Java、C/C++、.Net 、PHP 等语言。

2.MySQL 的第三方引擎 XtraDB 受到越来越多人的认知,MyISAM依然有用武之地,只是老大难锁表问题一直没有很好的解决办法。

3.Graphite是一款不错的系统监控软件,对与一个网站来说监控其运行状态,观测硬盘、CPU的使用率,Memcached的命中率,客户的访问动向、来源,是一件比较重要的事情, 采用Python语言写的,个人感觉Python如果能得到更好的商业支持,将来的前景会比Java好。

4.CouchDB是Apache组织又一款经典产品,作为非关键性的数据进行存储是一个绝佳的方案,例如:系统中的日志。

5.Memcached 和 数据库之间会逐渐的多出一个产物,比如 MongoDB ,不会像现在这样缓存和数据库2者之间有这么大的跨度

6.凡是接触过 Erlang 的人,都会对其产生喜好,可见Erlang的势头。

7.MySQL 的 官方集群方案仍然不会被人看好,但是 MySQL 的 MMM 和 MSS 依然是经典。

8.Ngixn的性能强大和配置简单让他成为web服务器的新宠儿, 对一些图片的访问/读写还可以使用Ngixn的本地缓存 。