一文讀懂?dāng)?shù)據(jù)的可靠性和持久性
掃描二維碼
隨時(shí)隨地手機(jī)看文章
越是基本而關(guān)鍵的概念,越容易誤解滿天飛。像“可靠性”這種被不斷提及的名詞,如果仔細(xì)分辨就會(huì)發(fā)現(xiàn)里面充斥著各種似是而非的誤解和誤用。
一、持久性、可用性,傻傻分不清
我們一般所說的“可靠性”,其實(shí)是個(gè)比較模糊的概念,里面包含持久性和可用性兩個(gè)層面的意思。
打開AWS S3的介紹頁(yè)面(https://aws.amazon.com/cn/s3/details/),會(huì)看到這樣一句話:
“設(shè)計(jì)目的是在指定年度內(nèi)為對(duì)象提供99.999999999% 的持久性和 99.99% 的可用性。”
這是一句很嚴(yán)謹(jǐn)?shù)谋硎觯绻阋呀?jīng)完全理解這句話的意思,就可以直接跳過本節(jié)往下看了。
但如果你似懂非懂還看著“持久性”這個(gè)詞不懷好意的怪笑,說明你不僅歪腦筋太多,而且當(dāng)初數(shù)據(jù)庫(kù)基礎(chǔ)知識(shí)沒學(xué)好,這里的持久性概念,就是從數(shù)據(jù)庫(kù)的持久性概念借鑒來的。
持久性和可用性的含義,可以用下面這個(gè)圖來理解。
這個(gè)圖只是簡(jiǎn)要的說明含義,實(shí)際系統(tǒng)中還有集群、容災(zāi)等等各種環(huán)節(jié),為了不分散焦點(diǎn),無關(guān)本質(zhì)的部分都略去不提。
簡(jiǎn)單的說,數(shù)據(jù)可訪問就叫available——可用(這個(gè)翻譯很靠譜)。而數(shù)據(jù)暫時(shí)不可訪問,但是過段時(shí)間費(fèi)些力氣能找回來,這樣的狀態(tài)已經(jīng)不能叫available,但仍然屬于durable——持久(這個(gè)翻譯實(shí)在讓人抓狂,可是既然從早年數(shù)據(jù)庫(kù)領(lǐng)域就一直這么翻譯,現(xiàn)在已經(jīng)成了固定用法,手動(dòng)無奈)。只有數(shù)據(jù)徹底丟失,永遠(yuǎn)找不回來的狀態(tài),才超出durable的范圍。
可見,持久性比可用性更基礎(chǔ),前者是后者的必要非充分條件。從數(shù)值描述上,持久性≥可用性。
另外,討論持久性和可用性時(shí),需要限定邊界條件。孤立系統(tǒng)給出的量化指標(biāo),僅指裸奔時(shí)的表現(xiàn),實(shí)際使用中還要看外面披著什么樣的使用方式。
比如AWS S3給出的那個(gè)承諾,持久性99.999999999%的含義,就是每年100000000000個(gè)對(duì)象中,可能會(huì)有1個(gè)對(duì)象丟失。這當(dāng)然是個(gè)貌似很可靠的系統(tǒng),假設(shè)你租來1百億個(gè)對(duì)象,想等著看到其中一個(gè)崩潰的話,可能要等10年。
可是且慢,Stack Overflow上曾有個(gè)頑皮的提問者,他說如果往AWS S3上存1百億個(gè)文件,是不是10年之內(nèi)就可能出現(xiàn)文件丟失?
鑒于S3主要用于長(zhǎng)期數(shù)據(jù)歸檔,且在全球范圍用量之大,這個(gè)提問并不算抬杠。也就是說,霸道如AWS的11個(gè)9持久性,也未必足以支撐浩瀚的數(shù)據(jù)海洋直到地老天荒。
當(dāng)然這個(gè)提問者并不是真的發(fā)現(xiàn)了什么死結(jié),后面的應(yīng)答者很快就告訴他,只要在存文件的時(shí)候,增加一些校驗(yàn)容錯(cuò)機(jī)制,就能在S3對(duì)象崩掉幾個(gè)的時(shí)候仍然保持文件的完好無損。
對(duì)搞存儲(chǔ)的人來說,這個(gè)道理實(shí)在太容易理解了,就是在S3對(duì)象上做RAID嘛。這個(gè)模式可以推而廣之,但凡你對(duì)某個(gè)系統(tǒng)裸奔的可靠性不夠放心,就想辦法在上面“做RAID”即可,只要小心別用RAID-0擴(kuò)大故障概率就行。
總之,理解了持久性、可用性這些概念,并知道哪些受限于設(shè)備,哪些掌握于自身,以后再看到那種一味強(qiáng)調(diào)幾個(gè)9的產(chǎn)品宣傳,就不至于被輕易忽悠。
二、時(shí)間邊界和故障規(guī)律
一般談?wù)摮志眯院涂捎眯裕夹枰螂[或顯的在百分?jǐn)?shù)前面加個(gè)“年度”的限定。比如99%可用性,是指每年宕機(jī)時(shí)間不超過3.65天,即87.6小時(shí)。而99.9%可用性,就意味著每年宕機(jī)時(shí)間不超過8.76小時(shí)。人們常提的5個(gè)9高可用,即99.999%可用性,折算下來每年宕機(jī)時(shí)間才僅有5.256分鐘。
那么一個(gè)霸氣側(cè)漏的每年5個(gè)9高可用系統(tǒng),在100年時(shí)間里可用性是多少呢?理論上似乎是仍然足夠威風(fēng)的99.9%可用性(精確計(jì)算結(jié)果應(yīng)該是略小于99.90005%一丟丟),可是這顯然不太合常理。再?gòu)?qiáng)壯的硅基物種,在機(jī)房里負(fù)重蹲上100年,肯定早就徹底散架了。
所以持久性和可用性的另外一個(gè)隱含限定——正常壽命之內(nèi)??上?duì)硅基物種正常壽命的界定,也是真假信息混雜。
以最常出故障的磁盤設(shè)備為例,每個(gè)磁盤型號(hào)都有一個(gè)MTBF指標(biāo)(Mean TIme Between Failure,平均無故障時(shí)間),來聲明其可靠性。具體的定義和解釋隨處可以查到,我就不廢話多說。
關(guān)于MTBF,我只有一句奉勸:
不要相信!不要相信!永遠(yuǎn)不要相信!重要的事情說三遍。
作為標(biāo)榜品質(zhì)的主要規(guī)格指標(biāo),磁盤的MTBF已經(jīng)徹底淪落純粹吹牛手段,數(shù)值從起初還算靠譜的幾萬小時(shí),一路漲到極度夸張的幾百萬小時(shí)。
100萬小時(shí)=114年!
你要是真相信有磁盤可以用這么久的話,本文后面的部分也就沒必要看下去了。
所幸早在2007年,谷歌的幾位大牛就氣不過這種不負(fù)責(zé)任的胡說,用一篇名為《Failure Trends in a Large Disk Drive PopulaTIon》的論文怒懟硬盤廠商。論文中統(tǒng)計(jì)了數(shù)萬顆磁盤的運(yùn)維數(shù)據(jù),發(fā)現(xiàn)實(shí)際環(huán)境中企業(yè)級(jí)磁盤和桌面級(jí)磁盤的故障概率非常接近,幾乎無差別。而廠商卻對(duì)兩種磁盤的MTBF標(biāo)注差別明顯,甚至相差數(shù)倍。無論哪種盤,實(shí)際統(tǒng)計(jì)的AFR(年故障率)都遠(yuǎn)高于MTBF的推算值若干數(shù)量級(jí)。
順便提一句,論文還指出磁盤實(shí)際AFR會(huì)高達(dá)3~8%,遠(yuǎn)高于磁盤廠商根據(jù)返廠報(bào)修統(tǒng)計(jì)的0.4~1.2%每年。這中間的差額部分去了哪里,大家自行腦補(bǔ)吧。人艱不拆。
谷歌論文的統(tǒng)計(jì)對(duì)象,都是使用5年以內(nèi)的磁盤。磁盤的原廠保修期一般也都是5年。這個(gè)壽命選擇來源于磁盤故障率的U型分布規(guī)律。
一般磁盤故障多發(fā)生在新上線3個(gè)月之內(nèi),或是臨近保修期結(jié)束前后,中間的階段相對(duì)比較消停。
新磁盤的故障,主要由制造過程的疏漏或錯(cuò)誤造成。比如盤體密封不嚴(yán),就會(huì)在上線工作后很快發(fā)生故障。這屬于硅基物種個(gè)體的先天缺陷導(dǎo)致的夭折。這類問題在經(jīng)過一段時(shí)間負(fù)載后,很快就會(huì)全部暴露。
接下來,系統(tǒng)中剩下一群健康的青壯年磁盤,故障率自然會(huì)明顯下降。然而磁盤這種每分鐘要旋轉(zhuǎn)成千上萬次的物種,在歡脫的旋轉(zhuǎn)了幾萬小時(shí)之后,還是會(huì)鐵杵磨成繡花針,最終迎來衰老期。于是故障率又開始上升。
需要注意,磁盤的損耗速度與工作環(huán)境和負(fù)載有密切的關(guān)系。在悠閑舒適的環(huán)境中可以順利撐到5年的磁盤,換到負(fù)載繁重殘酷壓榨的環(huán)境里肯定要折壽。
從谷歌那篇論文里可以窺見,谷歌的數(shù)據(jù)中心一定是個(gè)殘酷壓榨磁盤的血汗工廠,因?yàn)槔锩娴拇疟P在2年左右就已經(jīng)開始明顯衰老。
說了這么多,總結(jié)起來就是硅基物種跟我們這些碳基物種一樣,都有生老病死的全過程。討論硅基物種的可靠性,就如同討論我們碳基物種的健康度,不僅個(gè)體間有差異,而且每個(gè)個(gè)體的情況也隨時(shí)間和環(huán)境的變化而變化。
三、可靠性的量化計(jì)算
對(duì)可靠性的量化計(jì)算,絕對(duì)是各種錯(cuò)誤頻生的重災(zāi)區(qū)。如果在網(wǎng)上搜索這方面的計(jì)算方法,包括來自產(chǎn)品廠商、大學(xué)研究機(jī)構(gòu)、社區(qū)論壇自由人士等各方面給出的種種計(jì)算公式和計(jì)算邏輯,80%以上都存在錯(cuò)誤和漏洞。
有實(shí)際運(yùn)維經(jīng)驗(yàn)的機(jī)房背鍋俠們,見多了這種貌似有理實(shí)則計(jì)算結(jié)果很扯的各類公式之后,都會(huì)對(duì)系統(tǒng)可靠性心生迷之不可知,繼而拋棄多年的理工科信念,毅然走上迷信的道路。
為了挽救迷途的運(yùn)維工程師,重振數(shù)理化的威望,我們還是認(rèn)真看看可靠性到底怎么計(jì)算吧。
對(duì)于簡(jiǎn)單系統(tǒng),相信理工科畢業(yè)的同學(xué)們還不至于被搞暈。
比如串行系統(tǒng)(RAID-0就是典型)中,所有單元都健康時(shí)系統(tǒng)才健康,所以系統(tǒng)健康概率計(jì)算方法就是每個(gè)單元健康概率的相乘。類似的,并行系統(tǒng)(比如多副本)中,所有單元都故障時(shí)系統(tǒng)才故障,所以系統(tǒng)故障概率是所有單元故障概率的乘積,而健康概率就是1減去故障概率。
腦力熱身完成,我們現(xiàn)在考慮一個(gè)稍微復(fù)雜一些的系統(tǒng)。
假設(shè)一個(gè)n節(jié)點(diǎn)的分布式存儲(chǔ)系統(tǒng),每個(gè)節(jié)點(diǎn)中m顆磁盤,系統(tǒng)中采用k副本數(shù)據(jù)保護(hù),副本都是跨節(jié)點(diǎn)保存,每顆磁盤的健康概率是p,那么系統(tǒng)的總體健康概率是多少呢?
好吧,我承認(rèn),難度跳躍比較大,從熱身的基本概念直接跳到這里的確少了些鋪墊。那我們至少先琢磨一下,這些條件是否足夠推算出系統(tǒng)的可靠性,是否還需要增加哪些限定條件。
敲黑板!重點(diǎn)來了!
大部分網(wǎng)上的錯(cuò)誤計(jì)算邏輯,其實(shí)都忽視了同一個(gè)因素——時(shí)間。
我在前一節(jié)提到過,如果一個(gè)單元或系統(tǒng),在1年里的可靠性是99%,那么它在1天里的可靠性應(yīng)該是99.997%,在10年里的可靠性又變成了90.4%。不統(tǒng)一時(shí)間跨度之前,不能量化計(jì)算。就像各種理財(cái)產(chǎn)品一樣,有的3個(gè)月賺2%,有的5年賺20%,要想比較哪個(gè)收益率高,首先必須把收益換算為年化收益率??煽啃砸彩且粯?,在計(jì)算過程中,時(shí)刻需要注意“年化”處理。
我們?cè)倏磩倓傤}目中n、m、k、p幾個(gè)條件,除了p需要考慮年化之外,似乎其他幾個(gè)條件都跟時(shí)間沒有直接關(guān)系,我們應(yīng)該可以開始推算了。
先別急,我們還需要考慮另外一個(gè)問題——什么狀態(tài)是故障狀態(tài)?
一定會(huì)有人不假思索脫口而出,多盤同時(shí)故障,多到k副本全都?jí)牧?,就是故障狀態(tài)??墒?,哪里有嚴(yán)格意義的“同時(shí)”呢?所有磁盤在同一月或同一年里全都?jí)倪^一遍,算不算“同時(shí)”呢?
我相信大多數(shù)明白人嘴里這么說的時(shí)候,心里想的其實(shí)就是多盤故障的時(shí)間點(diǎn)過于密集,以至于k副本全壞光之前,都來不及修復(fù)出一份好數(shù)據(jù)。這才是我們常說的“多盤同時(shí)故障”實(shí)際所指的真實(shí)含義。
基于這樣的認(rèn)識(shí),我們知道在判定系統(tǒng)是否故障時(shí),其實(shí)隱含著一個(gè)時(shí)間因素——數(shù)據(jù)修復(fù)所需要的時(shí)間窗口,也稱為降級(jí)(Downgrade)時(shí)間窗口。
這個(gè)時(shí)間窗口是從健康狀態(tài)下第一顆磁盤故障算起,直到修復(fù)回健康狀態(tài)為止。其中一般包含備件更換時(shí)間t和數(shù)據(jù)重建時(shí)間τ,總降級(jí)窗口為t+τ。
現(xiàn)在的很多分布式存儲(chǔ)為了縮短這個(gè)降級(jí)窗口,可以不等更換壞盤,直接在現(xiàn)有空閑空間進(jìn)行重建。這種情況下t=0。數(shù)據(jù)修復(fù)重建無論如何都需要時(shí)間開銷,所以τ總不會(huì)為零。
我們現(xiàn)在知道剛才那個(gè)系統(tǒng)中,必須再附加t和τ兩個(gè)因素,才能進(jìn)行可靠性計(jì)算。
到此鋪墊結(jié)束,公式出場(chǎng)。系統(tǒng)年化健康概率H的計(jì)算公式如下:
公式中t和τ的單位為天。
我還得承認(rèn),推演這個(gè)公式的過程中,沒有考慮故障的U型分布,而是簡(jiǎn)單的用平均分布代替。至于原因嘛,我當(dāng)然不會(huì)承認(rèn)自己懶,也不會(huì)賣萌說等著大家來完善云云。我只是覺得未來的海量系統(tǒng)不會(huì)再像現(xiàn)在這樣分批次規(guī)劃建設(shè),而是滾動(dòng)式持續(xù)建設(shè)。那樣的話,系統(tǒng)中不同批次的設(shè)備混在一起,各年齡段都有,這個(gè)U型分布問題也就自然會(huì)被熨平。
暫時(shí)懶(kan)得(bu)看(dong)公式的同學(xué)也不要發(fā)飆,我列這個(gè)公式出來主要是想證明理工科信念還是要堅(jiān)持,不能因?yàn)榫W(wǎng)上哪些邏輯有漏洞的錯(cuò)誤就顛覆輕易放棄自己的信仰。只要考慮的因素周全一些,即便復(fù)雜系統(tǒng)里,也可以量化計(jì)算健康概率。
有興趣的同學(xué)可以試試用這個(gè)公式描畫一下H(n)、H(m)、H(t+τ)曲線,看看各個(gè)變量如何影響系統(tǒng)健康概率H的變化。相信你會(huì)有很多符合實(shí)際經(jīng)驗(yàn),又頗感新鮮意外的感受。