我在Quora上看到一个热门提问:“What have been Facebook’s greatest technical accomplishments?”
前Facebook基础架构软件部门工程总监Robert Johnson给出的回答得到了大多数人的认同:“我们搭建了使用Memcached缓存的MySQL数据库集群”。在一年前他离开Facebook时,这个集群已能面向超过一万亿个对象,每秒处理超过十亿个响应。
他详细说明了在这个工作中克服的一些挑战:
数据中心在时间上的高度一致性。这使得用户对facebook的操作在全世界的服务器上都是没有时延的,例如不会出现在你删除了某些内容后,这些数据仍会在其他的服务器上存在一小段时间的情况。对这个话题感兴趣的同学可移步Wired上一篇名为《透视Google资料库全球同步的秘密》的文章,文中详细阐述了Google在这方面的举措。
流量控制。为防止高峰期数据传输拥堵和数据丢失而对请求发送端设计的流量控制体系。
如何设计分布式缓存?分布式设计能够让系统并行地读取缓存,提高效率。在这个基础上,Facebook的系统根据任务量的不同选择不同的缓存形式,以节省空间并进一步提高读取速度。
容灾措施。在少数服务器无法响应时,随机地向不同的服务器发送请求直到收到响应为止,是个不错的做法。但如果有大量的服务器无法响应,这种做法会令剩下的服务器承载巨大的负荷。所以系统设计者会让这些服务器在过载前就停止对用户请求的响应,这种做法虽然会让用户感到不适,但做对于保证数据中心的稳定是至关重要的。很多人在双十一遇到淘宝/支付宝/银行页面无法响应也是采用了这个机制。
调度与监控。当服务器并行协作处理某项事件时,服务器之间能相互监控彼此的状况。
他还提到了Facebook针对Memcached和MySQL的改进。
其他得票数较高的答案中提到的技术有:
HipHop for PHP。这个项目旨在加速和优化PHP。它目前已支撑了大部分Facebook的Web流量。由于HipHop,Facebook Web服务器上的CPU使用平均减少了50%,从而大大减少了服务器的需求。
HayStack。Fackbook用于存储照片的系统,其存储照片的数量在千亿数量级。
Scribe。Facebook开源的日志收集系统,它能够从各种日志源上收集日志,存储到一个中央存储系统上,以便于进行集中统计分析处理。
The Graph API。该API提供了对人员、相册、事件等Facebook对象以及这些对象之间诸如朋友、标签、分享内容等链接之间的访问,通过一个统一而稳定URI来访问其表象。
我们知道,得票最高的“使用Memcached缓存的MySQL数据库集群”不仅是Facebook的巨大成就,Google、Amazon等公司都耗费大量精力在为“数据库集群”寻找最高效的解决方案,它并不是一个看上去“酷”和“新”的技术理念,但在产品背后,它支撑着功能,影响着体验。
这也是PingWest所认同的,作为一个具备全球视野、有洞见的在线科技媒体,我们不仅报道科技创业资讯和趋势,同时着力挖掘最有价值的产品背后的技术、设计方法与思考。
(责任编辑:蒙遗善)