1. 程式人生 > >ceph學習筆記之九 層級化的Cluster Map

ceph學習筆記之九 層級化的Cluster Map

sds ceph.crush

集群映射由Device和桶(Buckets)組成,設備和桶都有ID描述和權重。Bucket可以包含任意設備或者其他的bucket,使他們形成內部節點的存儲層次結構,設備總是在葉子節點。存儲設備的權重由管理員設置以控制設備負責存儲的相對數據量。盡管大型系統的設備含不同的容量大小和性能特點,隨機數據分布算法可以根據設備的利用率和負載來分布數據。這樣設備的平均負載與存儲的數據量成正比。這導致一維位置指標、權重、應來源於設備的能力。桶的權重是它所包含的元素的權重的總和。Device(OSD)的權重值越高,對應的磁盤會被分配寫入更多的數據。從集群整體來看,數據會均勻的寫入分布於集群的所磁盤,從而提高整體性能和可靠性。

Buckets可由任意可用存儲的層次結構組成。例如,可以創建這樣一個集群映射,用名為“shelf”的桶代表最低層的一個主機來包含主機上的磁盤設備,然後用名為“cabinet”的桶來包含安裝在同一個機架上的主機。在一個大的系統中,代表機架的“cabinet”桶可能還會包含在“row”桶或者“room”桶裏。數據被通過一個偽隨機類hash函數遞歸地分配到層級分明的桶元素中。傳統的散列分布技術,一旦存儲目標數量有變,就會導致大量的數據遷移;CRUSH算法是基於桶四個不同的類型,每一個都有不同的選擇算法,以解決添加或刪除設備造成的數據移動和整體的計算復雜度。

分層集群的基本概念:

Device

最基本的存儲設備,也就是OSD,通常一個OSD對應一個磁盤存儲設備。

Bucket

表示放設備的容器,可以包含多個設備或子類型的Bucket。

Bucket的類型:

用來指定OSD 在CRUSH分層結構中的位置;Bucket可以包含很多種類型,例如:Host就代表一個主機節點,可以包含多個Device;Rack代表機架,包含多個Host節點。在ceph中默認有osd、host、chassis、rack、row、pdu、pod、room、datacenter、region、root 11個等級。用戶也可以自己定義新的類型。每個Device都設置了自己的權重,和自己的存儲空間相關。Bucket的權重就是子Bucket(或者設備)的權重之和。類型描述如下表:

技術分享

解讀CRUSH map Bucket用法

# buckets

host node-7 { //類型Host 名稱為node-7

id -3 # do not change unnecessarily //Bucket的ID,一般為負數

# weight 5.460 //權重值,一般為item的權重值之和

alg straw //Bucket隨機選擇的算法

hash 0 # rjenkins1 //Bucket隨機選擇的算法使用的HASH函數,這裏0代表使用HASH函數jenkins1

item osd.0 weight 2.730 //OSD.0權重值

item osd.1 weight 2.730 //OSD.1權重值

}

host node-6 {

id -4 # do not change unnecessarily

# weight 5.460

alg straw

hash 0 # rjenkins1

item osd.2 weight 2.730

item osd.5 weight 2.730

}

host node-5 {

id -5 # do not change unnecessarily

# weight 5.460

alg straw

hash 0 # rjenkins1

item osd.3 weight 2.730

item osd.4 weight 2.730

}

host node-9 {

id -6 # do not change unnecessarily

# weight 0.540

alg straw

hash 0 # rjenkins1

item osd.7 weight 0.540

}

host node-10 {

id -7 # do not change unnecessarily

# weight 0.540

alg straw

hash 0 # rjenkins1

item osd.6 weight 0.540

}

host node-8 {

id -8 # do not change unnecessarily

# weight 0.540

alg straw

hash 0 # rjenkins1

item osd.8 weight 0.540

}

root default { //root類型的Bucket 名字為default

id -1 # do not change unnecessarily //ID號

# weight 18.000 //權重值,一般為item的權重值之和

alg straw //隨機選擇的算法straw

hash 0 # rjenkins1 //Bucket隨機選擇的算法使用的HASH函數,這裏0代表使用HASH函數jenkins1

item node-7 weight 5.460 //Host的權重為子設備(OSD)權重之和

item node-6 weight 5.460

item node-5 weight 5.460

item node-9 weight 0.540

item node-10 weight 0.540

item node-8 weight 0.540

}

根據上面CRUSH Map配置文件可以繪制一張關於Bucket層級的組織圖:

技術分享

CRUSH map Bucket配置解讀實例:

  • 有一個root類型的Bucket,名稱為default

  • root下有6個Host類型的Bucket,名字分別為node-5、node-6、node-7、node-8、node-9、node-10;其中node-5、node-6、node-7節點下分別有2個OSD設備,每個OSD設備權重值為2.730;說明它們容量大小一致。而node-8、node-9、node-10節點下只有一個OSD設備,其OSD設備權重值均為0.540,表示他們容量大小也是一致的。其中node-5、node-6、node-7主機節點的權重值為OSD設備權重值之和為5.460;而node-8、node-9、node-10主機節點的權重值為OSD設備權重值之和為:0.540。主機權重值是根據各個節點上OSD權重值之和進行自動計算。根據主機間權重值可以看出該集群節點OSD數量、容量都不一致。

  • Hash設置了使用Hash函數,值0代表使用rjenkins1

  • alg代表在該Bucket裏選擇子item的算法

本文出自 “無詺IT小站” 博客,謝絕轉載!

ceph學習筆記之九 層級化的Cluster Map