与很多大型的网站一样,人人网的系统全部是由开源软件构建的。使用Nginx做前端接入,resin做容器,Memcached做通用cache,MySQL做数据库,使用Linux操作系统。
问:作为国内大型SNS站点的代表,我们知道人人网后台主要采用Java语言编写,同其他形式的站点相比,SNS站点在网站架构方面有什么样的特点?
黄晶:SNS网站用户数据量庞大且关系复杂,对实时性要求非常高,因此要求SNS网站架构要有很强的水平扩展性。
问:在后台语言的选择上,有其他大型SNS站点使用PHP,人人网则选择了Java,使用Java的优势在体现哪些方面?
黄晶:Java的优势体现在当项目日渐复杂的时候,可以通过Java良好的OO特性,保持非常好的模块性,在进行网站重构的时候比较方便,在代码量增大的时候也可保持良好的可管理性。
问:现在很多大型网站的后台都使用了大量的开源软件,人人网是否也是如此呢?咱们的开发团队是否也在开发自己的框架呢?
黄晶:人人网也使用了大量开源软件,比如MySQL、Memcached、ICE、Hadoop等,同时我们也根据业务需要研发了自己的框架,比如MVC框架,分布式KV存储系统。
问:一个网站在发展过程中,后台都会经历不断的重构,从初期的校内网、到现在的人人网,网站架构最大的变化在哪?
黄晶:从初期的校内网到现在人人网,最大的变化是:很多底层服务都从利用已有开源软件的搭建,变成了根据业务需要,由我们自己开发专门的服务所代替,这样能够提高资源利用程度,提高整个系统的可用性。
问:我们知道人人网的用户量非常庞大,在数据库方面,人人网采用了哪种数据库?除了高性能、可扩展性外,人人网对数据库的需求还有哪些?在整个后台系统架构中,往往数据库的性能也会出现瓶颈,从早期的校内网到现在,我们对数据库性能的优化方面都做了哪些大的改变?
黄晶:我们采用的数据库是MySQL,在需求方面,我们也非常关注高可用性。早期校内从单数据库,到主从接口,发展到后来垂直拆分,然后水平拆分,然后在每个节点上实现主-主提高可用性,到异地备份容灾。目前我们的数据库已经有非常强的水平扩展能力和非常高的可用性。
问:数据缓存在后台架构中同样非常重要,在数据库服务器、Web服务器以及两者之间,人人网都采用了哪些缓存手段?
黄晶:我们的数据库用到了部分自身缓存机制,比如尽可能利用innodb的pool和MySQL的Query Cache。在中间用到Memcached,以及基于ICE通讯框架由我们自己编写的包含业务逻辑处理能力的缓存服务,在我们自行开发的分布式KV系统中也会充分利用内存Cache加速。
问:上传照片或者图片是SNS网站用户很常用的一个功能,对于Web服务器来讲,图片是非常消耗资源的,那么目前人人网每天大概有要处理多少张图片?相比较其他数据而言,图片会占用大量存储空间,给服务器带来不小的压力,我们知道Facebook有着一套自己的图存储架构,咱们人人网在这方面是怎么做的呢?
黄晶:现在人人网每天要处理千万张级别的照片数量。我们使用由C++专门编写的Web服务来处理照片上传和压缩工作。存储是用一套分布式文件存储系统,在小文件很多的情况下,也会采用把小文件聚合为大文件的方式提高性能,这样的做法也便于大量小文件的备份。
问:目前SNS站点都有很强的实时性,用户能够第一时间看到好友都在做什么,像人人网以及Facebook等,还有即时聊天功能,我们是通过什么样的手段来最大限度的优化每一个页面,从而尽可能的减少服务器的请求时间,提高用户体验的呢?
黄晶:我们的做法是尽可能把数据放在内存中,提高数据存取速度。另外,复杂的页面采用并发机制,多线程同时从多个后台源取数据拼成页面。
数据层
使用MySQL ,同时使用Tokyo Cabinet(Key-value的存储引擎,简称TC)做一个数据冗余,TC代替MySQL做存储,例如搜索结果页的用户资料,但Tokyo Cabinet没有网络处理能力,需要使用Tokyo Tyrant以提供网络接入能力,并调用Tokyo Cabinet的API进行持久化存储
Tokyo Tyrant其实也是Tokyo Cabinet的作者开发的,主要是支持Memcached传输协议的网络接口,可以理解为Tokyo Tyrant处理网络连接,协议解析,然后调用Tokyo Cabinet的API来完成持久化存储
服务端
Web Server : Nginx, 使用Nginx的代理能力,做跨IDC的请求代理,同时与Java Server–Resin搭配,解决Resin网络连接处理能力弱的问题
Java Server: Resin 替代Tomcat作为Java服务器
代理服务器 : Squid 做图片文件的反向代理缓存
Linux服务器集群系统: LVS(Linux Virtual Server),使用它的4层的负载均衡,替代了很多硬件的负载均衡设备
框架
Java web框架: Struts,王兴同学一开始写校内网果然是用structs,现在的人人网开始慢慢舍弃原有的框架,并自己开发了一个web框架,传闻将来也会开源出来
搜索引擎框架: 基于Lucence提供搜索人的服务
网络框架:Netty,一个Java的网络框架,和apache的mina类似,但比mina更高效,用来提供一些小的服务
服务器系统监控
ganglia Ganglia是一个跨平台可扩展的,高性能计算系统下的分布式监控系统,如集群和网格
应用层缓存
Memcached 一个纯内存的key-value的cache系统,使用spymemcached作为java的Client
ICE : 一个跨语言的网络通讯框架,框架本身提供了强大的通讯能力,管理工具,负载均衡方案。