ceph pg split

在生產環境裏,一個ceph的pool裏有大量數據,當添加一些新的osd到集羣裏時,總是報告WARNING信息,這時爲了消除這個告警信息, 就使用一下命令來增加該pool的pg的數量。

ceph osd pool set ${pool_name} pg_num

這裏就有一個疑問,當pg的數量增加後,對於對象的尋址怎麼處理?

ceph的對象的尋址是分兩步:

1) 通過對象的oid 的 hash值,求餘數

 hash(oid)  %  pg_num  --> pg_id

2)根據crush算法, 獲取pg 到 osd列表

 crush( pg_id, osdmap) -->  osd_list( osd1, osd2, osd3)

實際上,在尋找操作的第一步中,對象映射到pg是靜態hash映射的過程。當增加一個pool裏的pg的數量,也就是公式裏的 pg_num 增大時, 讀取已經存在的對象時,可能映射到不同的pg裏,從而導致讀取錯誤。

PG split

其實,pg的增加,並不是簡單的修改pg_num 就可以了。PG的增加,導致舊的PG的分裂,並且以2的冪次方分裂。這種分裂方式類似於Extensible Hash。在舊的pg分裂出一個新的個pg後,兩個pg 的 acting osd列表是完全一致的。

當pg分裂後,會導致對象在一個osd內,舊pg會把一半的數據遷移到新的pg,這種pg的遷移是在同一個osd內遷移,也就是在同一個本地問及系統上,只是用rename操作而已,僅僅是本地文件系統的元數據操作,所以可以比較快的完成。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章