常規狀況下,咱們通常使用多副本技術來提升存儲系統的可靠性,不管是結構化數據庫存儲 (如典型的 mysql)、文檔型 Nosql 數據庫存儲 (mongodb ) 或者是常規的 blob 存儲系統 (GFS、Hadoop) 等,無不如此。html
由於數據幾乎能夠稱得上是企業生命力的核心,保障數據存儲系統的可靠性對於任何企業來講都不是一件小事。mysql
那麼,如何較爲準確地去衡量集羣數據的可靠性?如何進行系統設計使得集羣數據達到更高的可靠性?本文將試着去解答這些問題。git
「在由 999 塊磁盤組成的 3 副本存儲系統中,同時壞三塊盤的狀況下數據丟失的機率是多大? 」,這個跟存儲系統的設計息息相關,咱們先考慮兩個極端設計下的狀況。github
設計一:把 999 塊磁盤組成 333 塊磁盤對。sql
在這種設計下,只有選中其中一個磁盤對纔會發生數據丟失。這種設計中,丟失數據的機率爲 333/C(999,3) = 5.025095326058336*e-07。mongodb
設計二:數據隨機打散到 999 塊盤中。數據庫
極端狀況下,隨機一塊盤上的邏輯數據的副本數據打散在全部集羣中的 998 塊盤中。這種設計下,丟失數據的機率爲 C(999,3)/C(999,3)=1,也就是必然存在。安全
經過這兩種極端的例子咱們能夠看到,數據的丟失機率跟數據的打散程度息息相關。爲了方便後續閱讀,這裏咱們引入一個新的概念 copyset (複製組)。服務器
CopySet:包含一個數據的全部副本數據的設備組合,好比一份數據寫入 1,2,3 三塊盤,那麼 {1,2,3} 就是一個複製組。分佈式
9 個磁盤的集羣中,最小狀況下的 copyset 的組合數爲 3,copysets = {1,2,3}、{4,5,6}、{7,8,9},即一份數據的寫入只能選擇其中一個複製組,那麼只有 {1,2,3}、{4,5,6} 或者 {7,8,9} 同時壞的狀況下才會出現數據丟失。即最小 copyset 數量爲 N/R。
系統中最大的 copyset 的數目爲 C(N,R) ,其中 R 爲副本數,N 爲磁盤的數量。在徹底隨機選擇節點寫入副本數據的狀況下,系統中的 copyset 數目會達到最大值 C(N,R)。即任意選擇 R 個磁盤都會發生一部分數據的三個副本都在這 R 個盤上的狀況。
磁盤數量 N,副本爲 R 的存儲系統中,copyset 數量 S, N/R < S < C(N, R)
在正式估算相關機率以前還須要科普一個基礎的機率學分佈:柏鬆分佈。柏鬆分佈主要描述在一個系統中隨機事件發生的機率,譬如描述汽車站臺候客人數爲某個值的機率,某個醫院 1 小時內出生 N 個新生兒的機率等等,對泊松分佈作的更爲形象的介紹可參閱阮一峯的《泊松分佈和指數分佈: 10 分鐘教程》。
如上爲泊松分佈的公式。其中,P 表示機率,N 表示某種函數關係,t 表示時間,n 表示數量,λ 表示事件的頻率。
舉個例子:1000 塊磁盤在 1 年內出現 10 塊故障的機率爲 P (N(365) = 10) [注:t 的平均單位爲天]。λ 爲 1000 塊磁盤 1 天內發生故障磁盤的數量,按照 google 的統計,年故障率在 8%,那麼 λ = 1000*8%/365 。
如上只是損壞 N 塊磁盤機率的統計,那麼怎麼利用這個公式計算分佈式系統中數據可靠性 (即數據丟失機率) 的近似值呢?
對於分佈式存儲系統中如何進行年故障率的估算,咱們先假定一種狀況:T 爲 1 年的狀況下,系統存滿數據,壞盤不處理,這種狀況下統計一下數據的年故障率。
這裏咱們先定義一些值
N: 磁盤數量
T:統計時間
K:壞盤數量
S:系統中 copyset 數量 (複製組的個數)
R:備份數量
如何計算 T(1年)時間內數據丟失的機率,從機率統計角度來講就是把 T (1 年) 時間內全部可能出現數據丟失的事件所有考慮進去。包含 N 個磁盤 R 副本冗餘的系統中,在 T 時間內可能出現數據丟失的事件,即壞盤大於等於 R 的事件,即 R,R+1,R+2,… N ( 即爲 K∈[R,N] 區間全部的事件 )。這些隨機事件發生時,什麼狀況下會形成數據丟失?沒錯,就是命中複製組的狀況下。
K 個損壞狀況下 (隨機選擇 K 個盤狀況下) 命中複製組的機率爲:
p = X/C(N,K) 其中 X 爲隨機選擇 K 個磁盤過程當中命中複製組的組合數
那麼系統出現 K 個磁盤損壞形成數據丟失的機率爲:
Pa(T,K) = p * P(N(T)=K)
最後系統中 T 時間內出現數據丟失的機率爲全部可能出現數據丟失的事件的機率總和。
Pb(T) = Σ Pa(T,K) ; K∈[R,N]
以上咱們假設在一年中,不對任何硬件故障作恢復措施,那麼 t 用一年代入便可算出此種系統狀態下的年故障率。可是在大規模存儲系統中,數據丟失狀況下每每會啓動恢復程序,恢復完了以後理論上又算是從初始狀態的隨機事件,加入這個因素以後計算可靠性會變得比較複雜。
理論上大規模存儲系統中壞盤、恢復是極其複雜的連續事件,這裏咱們把這個機率模型簡化爲不一樣個單位時間 T 內的離散事件來進行統計計算。只要兩個 T 之間連續事件發生的機率極小,而且 T 時間內絕大部份壞盤狀況可以恢復,那麼下個時間 T 就是從新重新的狀態開始,則這種估算可以保證近似正確性。T 的單位定義爲小時,那麼 1 年能夠劃分爲 365*24/T 個時間段,那麼系統的年故障率能夠理解爲 100% 減去全部單位 T 時間內都不發生故障的機率。
即系統總體丟失數據的機率爲:Pc = 1 - (1-Pb(T))*(36524/T)
網易雲對象存儲服務 NOS(Netease Object Storage)是高性能、高可用、高可靠的雲端存儲服務。NOS 支持標準 RESTful API 接口,並提供豐富的數據在線處理服務,一站式解決互聯網時代非結構化數據管理難題。
其中,網易雲採起多重備份機制,爲用戶文件提供多重備份保障,在任何一臺服務器或硬盤故障時,將當即進行數據恢復,確保數據安全無隱患。歡迎廣大用戶試用和體驗。
最後,如想對本文內容(即分佈式存儲系統可靠性估算)做進一步學習和探究的,可參閱做者的另外一篇文章:https://work-jlsun.github.io/... 。
Google’s Disk Failure Experience柏鬆分佈泊松分佈和指數分佈:10 分鐘教程機率論,二項分佈和 Poisson 分佈磁盤故障與存儲系統的年失效率估算