分布式存储的集群可靠性计算(ceph)
一、背景
云計算廠商對外宣稱可用性,例如某云計算廠商在網站首頁的列出如下數字。那么對于某個服務該如何計算呢?服務到底是幾個9呢?
?
二、Ceph集群可靠性計算
1.計算分析
ceph 集群的可用性計算概括來講就是:計算一年時間內數據丟失的概率。那么,問題的關鍵就在于,什么情況下,數據會丟失?當某個OSD壞掉,數據不會丟失,因為還有其副本。
只有當存儲了某個數據的全部副本損壞的時候,才會發生數據丟失。
在兩副本的情況下,ceph集群可靠性計算轉化為
P(二副本)= P(一年中兩塊OSD同時發生故障的概率)* P(兩塊OSD存儲了同一副本)
三副本的情況下,ceph集群可靠性計算轉化為
P(三副本)= P(一年中三塊OSD同時發生故障的概率)* P(三塊OSD存儲了同一副本)
如圖所示,在一個三副本集群中,下面3塊OSD同時壞掉,且該三塊OSD存儲著同一個副本。那么此時數據丟失。
?
2. 一年中,n塊OSD同時發生故障的概率
(1)單塊磁盤發生故障的概率
p_1 = 1 - math.pow(math.e, (-FIT * num_of_osd * t1))
其中 t1 = 24 * 365,代表一年的時間,單位是小時,
FIT是一個單塊的硬盤在一年之內損壞的概率,計算方法為:afr / (24 * 365),其中AFR取值一般在 0.017-0.08之間,這里面取0.017。
(2)在第一塊磁盤發生故障時,第二塊磁盤故障的概率。
p_2 = 1 - math.pow(math.e, (-FIT * (num_of_osd - 1) * tr))
在一塊OSD壞掉的時候,其數據會傳輸到其他的節點。tr就代表這個時候恢復的時間。
這個時間,與磁盤寫速率、數據量都有關系,此處取值為10分鐘。
(3)在第二塊磁盤發生故障時,第三塊、第n塊磁盤故障的概率。
p_3 = 1 - math.pow(math.e, (-FIT * (num_of_osd - 2) * tr))
p_n = 1 - math.pow(math.e, (-FIT * (num_of_osd–n+1) * tr))
(4)n塊OSD同時發生故障的概率
2塊OSD同時發生故障的概率
p_r = p_1*p_2
3塊OSD同時發生故障的概率
p_r = p_1*p_2*p_3
3. N塊OSD存儲了同一副本的概率
此處有一個前提,那就是每個OSD的副本存儲在不同的機器上面
(1)計算全部組合
C(OSD總數量,副本數N)
(2)計算OSD分布在N臺機器的組合數
C(機器數量,N) *? math.pow(OSD總數量,N)
(3)N塊OSD存儲了同一副本的概率
P= C(機器數量,副本數N) *? math.pow(OSD總數量,副本數N) / C(OSD總數量,副本數N)
?三、Python實現ceph可靠性計算
?
通過修改參數,可以自動計算ceph集群可靠性。
""" 計算ceph可靠性 @author 康雨城 """import mathclass CephAvailability:def __init__(self, num_of_copies: float = 1, num_of_server: float = 3, num_of_osd_per_node: float = 12,afr: float = 0.017, date_size_per_node: float = 1400, write_rate=100):""":param num_of_copies: 副本數量:param num_of_server: 機器數量:param num_of_osd_per_node: 每個機器osd數量:param afr:單塊磁盤損壞的概率:param date_size_per_node: 每個OSD存儲的數據量單位是 GB:param write_rate: 數據寫入速率,單位是MB/s"""self.num_of_copies = num_of_copiesself.num_of_server = num_of_serverself.num_of_osd_per_node = num_of_osd_per_nodeself.afr = afrself.date_size_per_node = date_size_per_nodeself.write_rate = write_ratedef get_copy_set(self):return math.pow(self.num_of_osd_per_node, self.num_of_copies) * self.c(self.num_of_server, self.num_of_copies)def get_recover_time(self):"""數據只在本機架平衡,計算將一個OSD的數據分散到其他OSD中的時間例如:每個OSD存儲1400G數據,帶寬65MB/s,osd數量是36,已經壞掉1個tr = ((1400 * 1024) / ((36-1) * 65)) / (60 * 60):return:一個OSD的數據分散到其他OSD中的時間,單位是小時"""return ((self.date_size_per_node * 1024) / ((self.num_of_osd_per_node - 1) * self.write_rate)) / (60 * 60)@staticmethoddef c(n, r):"""計算從n個數中選出r個數有多少種組合:param r: 較小數:param n: 較大數:return: P(n,r)/P(r,r) = n!/r!(n-r)!"""return math.factorial(n) / (math.factorial(r) * math.factorial(n - r))def get_failures_in_year(self):"""單塊的硬盤在一年之內損壞的概率:return:"""return self.afr / (24 * 365)def get_pr(self):"""當num_of_server個機器上都有一塊硬盤損壞,而恰恰這num_of_server塊硬盤又保存了同一個Object的全部num_of_copies個副本,此時數據就會出現丟失的情況例如:30個OSD節點,分3個機架擺放,每一個機器有10個OSD節點,每個OSD節點仍然對應一塊物理硬盤,副本數為3,并且通過CRUSH MAP,將每一份副本均勻分布在三個機器上當三個機器上都有一塊硬盤損壞,而恰恰這三塊硬盤又保存了同一個Object的全部副本,此時數據就會出現丟失的情況。在實際應用中,只有雙副本和三副本的情況,不會出現4副本的情況:return:pr 數據丟失概率"""t1 = 24 * 365 # 一年的時間FIT = self.get_failures_in_year()tr = self.get_recover_time()p_1 = 1 - math.pow(math.e, (-FIT * self.num_of_server * self.num_of_osd_per_node * t1))p_2 = 1 - math.pow(math.e, (-FIT * (self.num_of_server * self.num_of_osd_per_node - 1) * tr))p_3 = 1 - math.pow(math.e, (-FIT * (self.num_of_server * self.num_of_osd_per_node - 2) * tr))if self.num_of_copies == 2:pr = p_1 * p_2elif self.num_of_copies == 3:pr = p_1 * p_2 * p_3elif self.num_of_copies == 1:pr = p_1else:pr = 0print("參數錯誤!,副本數只能為2或者3")return prdef get_availability(self):pr = self.get_pr()M = self.get_copy_set()p = 1 - (pr * M / self.c(self.num_of_osd_per_node * self.num_of_server, self.num_of_copies))report_ms = "假設一塊盤在一年內發生故障的概率為{},\n" \"在{}臺機器每臺機器{}個OSD,\n" \"每個OSD磁盤的數據量為{}GB的{}副本ceph集群中,\n" \"OSD寫速率為{}MB/s,\n" \"該ceph集群可用性為{}".format(self.afr, self.num_of_server, self.num_of_osd_per_node,self.date_size_per_node, self.num_of_copies, self.write_rate, p)return report_msif __name__ == '__main__':ceph_availability = CephAvailability()availability_msg = ceph_availability.get_availability()print(availability_msg)'''假設一塊盤在一年內發生故障的概率為0.017,在3臺機器每臺機器12個OSD,每個OSD磁盤的數據量為1400GB的2副本ceph集群中,OSD寫速率為100MB/s,該ceph集群可用性為0.9999922821309629'''?
四、參考文獻
https://sq.163yun.com/blog/article/201111838022103040?? 《分布式存儲系統可靠性系列一:如何估算》
https://sq.163yun.com/blog/article/201112210382258176??? 《分布式存儲系統可靠性系列二:系統估算示例》
https://sq.163yun.com/blog/article/201113281655402496??? 《分布式存儲系統可靠性系列三:設計模式》
https://sq.163yun.com/blog/article/201114512522477568??? 《分布式存儲系統可靠性系列五:副本放置算法 & CopySet Replication》
https://blog.csdn.net/xiaoquqi/article/details/43055031???? 《CEPH可靠性的計算方法分析》
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的分布式存储的集群可靠性计算(ceph)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【存储知识学习】第三章磁盘原理与技术3.
- 下一篇: Python日志详解【两篇就够了系列】-