百万级PHP网站架构工具箱

在了解过世界最大的PHP站点,Facebook的后台技术后,今天咱们来了解一个百万级PHP站点的网站架构:Poppen.de。 Poppen.de是德国的一个社交网站,相对Facebook、Flickr来讲是一个很小的网站,但它有一个很好的架构,融合了不少技术,如 Nigix、MySql、CouchDB、Erlang、Memcached、RabbitMQ、PHP、Graphite、Red5以及Tsung。php

Poppen.de目前有200万注册用户数、2万并发用户数、天天20万条私有消息、天天25万登陆次数。而项目团队有11个开发人员,两个设计,两个系统管理员。该站点的商业模式采用免费增值模式,用户可使用搜索用户、给好友发送消息、上载图片和视频等功能。前端

若是用户想享受不受限制发送消息和上载图片,那么就得根据须要支付不一样类型的会员服务,视频聊天及网站其余服务也采用一样的策略。数据库

Nginx缓存

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

Nginx 架构中一个很酷的设计就是有不少请求是由Memcached处理的,所以请求从缓存中获取内容而不须要直接访问PHP机器。好比,用户信息页(user profile)是网站须要密集处理的内容,若是把用户信息页所有缓存到Memcached上,那么请求直接从Memcached上获取内容。 Poppen.de的Memcached每分钟能够处理8000次请求。服务器

架构中有三个Nginx图像服务器提供本地图像缓存,用户上载 图像到一个中央文件服务器。当向这三个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

网站架构中Memcached应用至关多,超过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对两个版本进行性能分析,找出问题所在。

Red5

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

Tsung

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

相关文章
相关标签/搜索