天天看點

分布式存儲系統可靠性如何估算?

本文由  網易雲 釋出。

正常情況下,我們一般使用多副本技術來提高存儲系統的可靠性,無論是結構化資料庫存儲 (如典型的 mysql)、文檔型 Nosql 資料庫存儲 (mongodb ) 或者是正常的 blob 存儲系統 (GFS、Hadoop) 等,無不如此。

因為資料幾乎可以稱得上是企業生命力的核心,保障資料存儲系統的可靠性對于任何企業來說都不是一件小事。

資料丢失與 copyset(複制組)

“在由 999 塊磁盤組成的 3 副本存儲系統中,同時壞三塊盤的情況下資料丢失的機率是多大? ”,這個跟存儲系統的設計息息相關,我們先考慮兩個極端設計下的情況。

設計一:把 999 塊磁盤組成 333 塊磁盤對。

在這種設計下,隻有選中其中一個磁盤對才會發生資料丢失。

這種設計中,丢失資料的機率為 333/C(999,3) = 5.025095326058336*e-07。

設計二:資料随機打散到 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. 磁盤故障與柏松分布

在正式估算相關機率之前還需要科普一個基礎的機率學分布:柏松分布。柏松分布主要描述在一個系統中随機事件發生的機率,譬如描述汽車站台候客人數為某個值的機率,某個醫院 1 小時内出生 N 個新生兒的機率等等,對泊松分布做的更為形象的介紹可參閱阮一峰的《泊松分布和指數分布: 10 分鐘教程》。

分布式存儲系統可靠性如何估算?

如上為泊松分布的公式。其中,P 表示機率,N 表示某種函數關系,t 表示時間,n 表示數量,λ 表示事件的頻率。

舉個例子:1000 塊磁盤在 1 年内出現 10 塊故障的機率為 P (N(365) = 10) [注:t 的平均機關為天]。λ 為 1000 塊磁盤 1 天内發生故障磁盤的數量,按照 google 的統計,年故障率在 8%,那麼 λ = 1000*8%/365 。

如上隻是損壞 N 塊磁盤機率的統計,那麼怎麼利用這個公式計算分布式系統中資料可靠性 (即資料丢失機率) 的近似值呢?

2. 分布式存儲系統中丢失率的估算

2.1 T 時間内的故障率

對于分布式存儲系統中如何進行年故障率的估算,我們先假定一種情況: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]

2.2 分布式系統衡量年故障率

以上我們假設在一年中,不對任何硬體故障做恢複措施,那麼 t 用一年代入即可算出此種系統狀态下的年故障率。但是在大規模存儲系統中,資料丢失情況下往往會啟動恢複程式,恢複完了之後理論上又算是從初始狀态的随機事件,加入這個因素之後計算可靠性會變得比較複雜。

理論上大規模存儲系統中壞盤、恢複是極其複雜的連續事件,這裡我們把這個機率模型簡化為不同個機關時間 T 内的離散事件來進行統計計算。隻要兩個 T 之間連續事件發生的機率極小,并且 T 時間内絕大部份壞盤情況能夠恢複,那麼下個時間 T 就是重新從新的狀态開始,則這種估算能夠保證近似正确性。T 的機關定義為小時,那麼 1 年可以劃分為 365*24/T 個時間段,那麼系統的年故障率可以了解為 100% 減去所有機關 T 時間内都不發生故障的機率。

分布式存儲系統可靠性如何估算?

即系統整體丢失資料的機率為:

Pc = 1 – (1-Pb(T))**(365*24/T)

網易雲對象存儲服務

網易雲對象存儲服務 NOS(Netease Object Storage)是高性能、高可用、高可靠的雲端存儲服務。NOS 支援标準 RESTful API 接口,并提供豐富的資料線上處理服務,一站式解決網際網路時代非結構化資料管理難題。

其中,網易雲采取多重備份機制,為使用者檔案提供多重備份保障,在任何一台伺服器或硬碟故障時,将立即進行資料恢複,確定資料安全無隐患。歡迎廣大使用者試用和體驗。

最後,如想對本文内容(即分布式存儲系統可靠性估算)作進一步學習和探究的,可參閱作者的另一篇文章:https://work-jlsun.github.io/2017/02/18/storage-durablity-2.html 。

了解 網易雲 :

網易雲官網:https://www.163yun.com/

新使用者大禮包:https://www.163yun.com/gift

網易雲社群:https://sq.163yun.com/

繼續閱讀