Ceph學習筆記(2) CRUSH資料分布演算法

2022-05-06 15:24:14 字數 2763 閱讀 6651

​ 分布式儲存系統需要讓資料均勻的分布在集群中的物理裝置上,同時在新裝置加入,舊裝置退出之後讓資料重新達到平衡狀態尤為重要。新裝置加入後,資料要從不同的老裝置中遷移過來。老裝置退出後,資料遷移分攤到其他裝置。將檔案、塊裝置等資料分片,經過雜湊,然後寫入不同的裝置,從而盡可能提高i/o併發與聚合頻寬。

​ 在實際場景中如何通過最小資料遷移使得集群恢復平衡,如何分配備份到裝置上,使得資料盡可能的安全是很重要的問題。ceph對普通雜湊函式擴充套件後解決了上述問題,ceph基於雜湊的資料分布演算法就是crush。

​ crush支援副本、raid、糾刪碼資料備份策略,並受控的將資料的多個備份對映到集群不同故障域的底層裝置上。

最初提供了四種基本選擇演算法:

​ 觀察圖中資料得到,unique執行效率最高,抵禦結構變化能力最差,straw演算法執行效率相較unique於tree要差,但是抵禦結構變化的能力最強。因為資料可靠性最為重要,隨著擴容引入越來越多的裝置加上使用時間的推移,集群裝置需要經常更換韌體,因此目前基本生產環境的ceph集群都選擇straw演算法。

​ straw演算法為每個元素隨機計算乙個簽長,選擇簽長最長的元素輸出,簽長越長的元素被選中的概率越大,資料落在上面的概率就越大。straw演算法通過累計當前元素與前後元素的權重差值作為計算下乙個元素簽長的基準,因此在每次加入或刪除osd時,都會引起不相干的資料遷移。後修改為簽長計算僅與自身權重有關係,避免了這一現象,稱為straw2演算法,此演算法目前為ceph的預設演算法。

​ cluster map是集群層級拓撲結構的邏輯描述形式,其簡單的拓撲如:資料中心->機加->主機->磁碟,因此cluster map採用樹這種資料結構。根節點root是整個集群的入口;所有葉子節點device都是真實的最小物理儲存裝置(磁碟);中間節點bucket可以是device的集合,也可以是低階的bucket的集合。

​ cluster map這種層級關係通過這樣一張二維表對映,每個bucket,都儲存自身所有直接孩子的編號,即items。當items為空時,表明bucket為葉子節點。

簡單圖示如下,最下面的葉子節點device(如磁碟)存放資料,中間是host型別的bucket(物理主機),最上面root是集群入口:

配置示例:

host default_10.10.10.125
​ cluster map定義了儲存集群的物理拓撲描述。placement rule完成資料對映,即決定乙個pg的物件副本如何選擇的規則,使用者可自定義副本在集群中的分布。

placement rule可含有多個操作,包括以下三種型別:

take:從cluster map中選擇指定編號的bucket,系統預設為root型別的節點

select:接收take輸入的bucket,從中隨機選擇指定型別和數量的item。

step [choose|chooseleaf] [firstn|indep] type

[choose|chooseleaf]:choose操作有不同的選擇方式

[firstn|indep]:ceph有兩種select演算法(均為深度優先遍歷)。不同之處在於糾刪碼要求的結果是有序的,因此如果指定輸出數量為4而無法滿足時:

[num] :

[type] :故障域的型別,如果為rack,保證選出的副本都位於不同機架的主機磁碟上,如果為host,則保證 選出的副本位於不同主機上。

如果選中條目因故障、衝突等原因無法使用,則會重新執行select。

emit:輸出選擇結果

配置示例:

rule
rule data 

step chooseleaf firstn 0 type host //選擇當前副本數個主機下的osd

step emit //輸出將要分布的bucket的列表

}

chrush演算法依賴以上的演算法(預設為straw2)實現對pg的對映,輸入pg_id、cluster map、cluster rule,與隨機因子經過雜湊計算,輸出一組osd列表,即該pg要落在osd的編號。

但是選出的osd有可能會出現衝突或過載,就需要重新選擇:

過載或失效:指選出的osd無法提供足夠的空間來儲存資料,雖然crush演算法理論上可以讓資料在所有device(磁碟)中均勻分布,但實際並非如此:

ceph引入過載測試reweight可人工干預對osd的選擇概率,reweight的值設定的越高,則通過測試概率越高,因此可以通過降低過載osd的reweight和增加低負載osd的reweight來使得資料均衡。

引入過載測試也可以區分osd暫時失效和被永久刪除

如果osd暫時失效(如拔出對應磁碟一段時間,ceph將其設定為out),可以將其reweight的值設定為0.000,利用過載測試將其從候選條目中篩掉,進而將其承載的資料遷移到其他osd。恢復後再將reweight設定為1.000,即可遷回資料(指osd離線期間產生的新資料)

如果是被永久刪除,那麼它會被從候選條目刪除,即便後續再次新增進來,因為cluster map中的唯一編號變化而承載與之前不同的資料,使得集群出現大規模的資料均衡。

學習自:《ceph原始碼分析》 常濤

《ceph之rados設計原理與實現》 謝型果 嚴軍

ceph學習筆記

ceph學習 ceph 儲存集群 配置與部署 準備硬碟 作業系統和 ceph osd 守護程序資料分別放到不同的硬碟。如果必須把資料和系統放在同一硬碟裡,最好給資料分配乙個單獨的分割槽!檔案系統 osd 守護程序有賴於底層檔案系統的擴充套件屬性 xattr 儲存各種內部物件狀態和元資料。底層檔案系統...

leedcode學習筆記 2 兩數相加

給出兩個 非空 的鍊錶用來表示兩個非負的整數。其中,它們各自的位數是按照 逆序 的方式儲存的,並且它們的每個節點只能儲存 一位 數字。如果,我們將這兩個數相加起來,則會返回乙個新的鍊錶來表示它們的和。您可以假設除了數字 0 之外,這兩個數都不會以 0 開頭。示例 輸入 2 4 3 5 6 4 輸出 ...

python學習筆記 Day2 Numpy陣列

1.實現兩個陣列相加,在資料量特別大的時候 產生陣列 1 從列表產生陣列 a 0,1,2,3 a np.array 1 a 2 從列表傳入 a np.array 1,2,3,4 3 生成全0的陣列 np.zeros 5 4 生成全1的陣列 np.ones 5,dtype bool dtype可以用來...