今天早上Facebook發生宕機事故,導致你們中的很多人不能訪問本站達2.5小時左右。這是我們在4年里遇到的最嚴重的一次宕機事故,我們首先要對這次事件表示歉意。我們同時也想把這次事故發生的更詳細的技術內幕透露出來,和大家一起分享這次大教訓。
導致這次事故演變成如此嚴重的事件的關鍵問題出在一個倒霉的錯誤狀態處理操作上。一個用來檢查配置數據的自動執行程序試圖修復這個錯誤結果卻帶來了更糟糕的破壞。
這個自動執行程序的目的是檢查緩存中的配置數據是否有效,并從持久存儲庫里取出數據更新到緩存。這項工作對處理緩存上的臨時問題運行正常,但當持久數據庫失效時,它就出問題了。
今天我們對一個配置數據的持久副本做了一點修改,讓它顯示為無效。這意味著每一個客戶機都能看到這個無效數據,并且試圖修復這個數據。因為修復過程牽涉到對數據庫集群的查詢,一下子這每秒鐘百萬次的查詢迅速把集群累垮。
更糟糕的是,每次一個客戶機試圖查詢數據庫失敗都認為是有一個無效數據,緩存里的相應的鍵值會被刪除。這意味著即使最初的問題被解決了,請求查詢的數據流仍然不會停止。直到數據庫無法為其中的某些請求進行查詢,而這又會給自己招致更多的查詢。我們進入了一個循環反饋圈,使數據庫無法恢復正常。
讓這個循環反饋圈停下來的辦法是很不情愿的——我們必須把所有通向數據庫集群的請求全部停下來,也就是關閉網站。當數據庫恢復正常,問題的根源被清除后,我們逐漸的開放用戶對網站的訪問。
這樣今天我們使得網站恢復了運行,我們現在已經關閉了那個試圖糾正配置數據的系統程序。我們正在對這個配置系統做新的設計,會參考Facebook上其它系統的設計模式,讓其能夠優雅的處理循環反饋圈和瞬間峰值。
我們再次對網站宕機表示歉意,我們希望你們能理解,我們對Facebook網站的性能和可靠性非常的重視。
原文轉自:http://www.aqee.net/more-details-on-todays-outage/