Crush算法
1、Crush的目的
優化分配數據,高效的重組數據,靈活的約束對象副本放置,硬件故障時候最大化保證數據安全
2、流程
Ceph 架構中,Ceph客戶端是直接讀寫存放在OSD上的RADOS Object,因此,Ceph需要走完(Pool, Object) → (Pool, PG) → OSD set → OSD/Disk 完整的鏈路,才能讓Ceph client知道目標數據 object的具體位置在哪里。
數據寫入時,文件被切分成object,object先映射到PG,再由PG映射到OSD set。每個pool有多個PG,每個object通過計算hash值並取模得到它所對應的PG。PG再映射到一組OSD(OSD個數由pool的副本數決定)。
PG到OSD的映射的過程算法叫做Crush算法,這個算法是一個偽隨機的過程,他可以從所有的OSD中,隨機性選擇一個OSD集合,但是同一個PG每次隨機選擇的結果是不變的,也就是映射的OSD集合是固定的。
OSDMap管理當前Ceph中所有的OSD,OSDMap規定了Crush算法的一個范圍,在這個范圍中選擇OSD結合。那么影響Crush算法結果的有兩種因素,一個就是OSDMap的結構,另外一個就是Crush rule。
3、Crush rule介紹
Crush rule主要有3個重點:
a.從OSDMap中的哪個節點開始查找,
b.使用那個節點作為故障隔離域,
c.定位副本的搜索模式(廣度優先 or 深度優先)。
# ruleset
rule replicated_ruleset #規則集的命名,創建pool時可以指定rule集
{
ruleset 0 #rules集的編號,順序編即可
type replicated #定義pool類型為replicated(還有esurecode模式)
min_size 1 #pool中最小指定的副本數量不能小1
max_size 10 #pool中最大指定的副本數量不能大於10
step take default #定義pg查找副本的入口點
step chooseleaf firstn 0 type host #選葉子節點、深度優先、隔離host
step emit #結束
}
PG選擇osd的過程:首先要知道在rules中指明從OSDMap中哪個節點開始查找,入口點默認為default也就是root節點,然后隔離域為host節點(也就是同一個host下面不能選擇兩個子節點)。由default到3個host的選擇過程,這里由default根據節點的bucket類型選擇下一個子節點,由子節點再根據本身的類型繼續選擇,知道選擇到host,然后在host下選擇一個osd。
PG與PGP
Ceph通過Crush算法,將若干個object映射到PG上,形成一個object與PG的邏輯集合,並以此作為object與OSD的中間層,將PG根據所在POOL的副本數,復制到多個OSD上。PG的用途是將某些東西進行邏輯歸組,從而達到統一管理,提升效率的作用。相對整體集群規模來說,如果存儲池設置的PG較少,那么在每個PG上Ceph將會存儲大量的數據;如果存儲池設置的PG過大,那么Ceph OSD將會消耗更多的CPU與內存,不管哪一種情況都不會有較好的處理性能。
PG是指定存儲池存儲對象的目錄有多少個,PGP是存儲池PG的OSD分布組合個數
總結三點介紹
1、 PGP起到對PG進行歸置的作用。
2、 PGP的取值應該與PG相同,在PG的值增大的同時,也要增大PGP的值以保持二者的值相同。
3、 當一個POOL的PG增大后,Ceph並不會開始進行rebalancing,只有在PGP的值增大后,PG才會開始遷移至其他的OSD上,並且開始rebalancing。
結論
PG增加后,Ceph不會從原來的各個PG隨機抽取部分數據到新的PG中,而是分裂某個PG,從而產生新的PG。原有的6個PG只有2個分裂,其它4個保持對象不變,這種方式可以有效的減少大量數據遷移導致的性能問題。(pg到osd的映射關系沒有發生變化)
當PGP變化時,Ceph才會開始真正的數據重平衡。(調整PGP不會引起PG內的對象的分裂,但是會引起PG的分布的變動,調整新增pg到osd的映射,保障數據在osd層面的均勻分布)