今天早上Facebook发生宕机事故,导致你们中的很多人不能访问本站达2.5小时左右。这是我们在4年里遇到的最严重的一次宕机事故,我们首先要对这次事件表示歉意。我们同时也想把这次事故发生的更详细的技术内幕透露出来,和大家一起分享这次大教训。
导致这次事故演变成如此严重的事件的关键问题出在一个倒霉的错误状态处理操作上。一个用来检查配置数据的自动执行程序试图修复这个错误结果却带来了更糟糕的破坏。
这个自动执行程序的目的是检查缓存中的配置数据是否有效,并从持久存储库里取出数据更新到缓存。这项工作对处理缓存上的临时问题运行正常,但当持久数据库失效时,它就出问题了。
今天我们对一个配置数据的持久副本做了一点修改,让它显示为无效。这意味着每一个客户机都能看到这个无效数据,并且试图修复这个数据。因为修复过程牵涉到对数据库集群的查询,一下子这每秒钟百万次的查询迅速把集群累垮。
更糟糕的是,每次一个客户机试图查询数据库失败都认为是有一个无效数据,缓存里的相应的键值会被删除。这意味着即使最初的问题被解决了,请求查询的数据流仍然不会停止。直到数据库无法为其中的某些请求进行查询,而这又会给自己招致更多的查询。我们进入了一个循环反馈圈,使数据库无法恢复正常。
让这个循环反馈圈停下来的办法是很不情愿的——我们必须把所有通向数据库集群的请求全部停下来,也就是关闭网站。当数据库恢复正常,问题的根源被清除后,我们逐渐的开放用户对网站的访问。
这样今天我们使得网站恢复了运行,我们现在已经关闭了那个试图纠正配置数据的系统程序。我们正在对这个配置系统做新的设计,会参考Facebook上其它系统的设计模式,让其能够优雅的处理循环反馈圈和瞬间峰值。
我们再次对网站宕机表示歉意,我们希望你们能理解,我们对Facebook网站的性能和可靠性非常的重视。
原文转自:http://www.aqee.net/more-details-on-todays-outage/