系統(tǒng)出了故障,我們又一次掉進(jìn)了坑里,好不容易爬出了坑,拍拍塵土繼續(xù)前行,卻忘了回頭看看這個(gè)坑當(dāng)初為啥我們就沒看見。每一次入坑出坑的過程都有或大或小的代價(jià),值得我們回頭看看。
系統(tǒng)故障
每一次系統(tǒng)故障多是因?yàn)槌绦蜻\(yùn)行失敗或錯(cuò)誤,偶爾也會(huì)有因?yàn)榄h(huán)境問題,比如:機(jī)器掉電、硬件故障、虛擬機(jī)錯(cuò)誤等。但即便是環(huán)境原因引發(fā)的系統(tǒng)故障,也是因?yàn)槌绦蚓帉懣紤]不足導(dǎo)致的。曾經(jīng)就碰到因?yàn)橛脖P故障導(dǎo)致服務(wù)假死(掛起)引發(fā)的系統(tǒng)故障,這就是程序的編寫并未考慮硬盤 I/O 阻塞導(dǎo)致的掛起問題。
實(shí)際上,現(xiàn)今程序運(yùn)行環(huán)境的可靠性并不如我們想象的高,而程序員很容易忽視這一點(diǎn)。之所以容易忽視是在于平時(shí)的開發(fā)、調(diào)試中我們很難遇到這些環(huán)境故障,而在一個(gè)部署規(guī)模稍大的分布式系統(tǒng)中這樣的環(huán)境故障就比較常見了。
互聯(lián)網(wǎng)企業(yè)多采用普通的 PC Server 作為服務(wù)器,這類服務(wù)器的可靠性大約在三個(gè) 9,換言之就是出故障的概率在千分之一。而實(shí)際在服務(wù)器上,出問題概率最高的可能是機(jī)械硬盤。
Backblaze 2014 年發(fā)布的硬盤統(tǒng)計(jì)報(bào)告指出,根據(jù)對(duì)其數(shù)據(jù)中心 38000 塊硬盤(共存儲(chǔ) 100PB 數(shù)據(jù))的統(tǒng)計(jì),消費(fèi)級(jí)硬盤頭三年出故障的幾率是 15%。
而在 Google 這種百萬級(jí)服務(wù)器規(guī)模的部署級(jí)別上,幾乎每時(shí)每刻都有硬盤故障發(fā)生。因而在開發(fā)大規(guī)模的分布式程序系統(tǒng)時(shí),面向失敗設(shè)計(jì)(Design For Failure)是一個(gè)最基礎(chǔ)的出發(fā)點(diǎn)。