分布式存儲系統之Ceph集群存儲池、PG 與 CRUSH( 三 )


8、Recovering:添加一個新的OSD至存儲集群中或某OSD宕掉時,PG則有可能會被CRUSH重新映射進而將持有與此不同的OSD集,而這些處于內部數據同步過程中的PG則被標記為recovering狀態;
9、Backfilling:新OSD加入存儲集群后 , Ceph則會進入數據重新均衡的狀態,即一些數據對象會在進程后臺從現有OSD移到新的OSD之上,此操作過程即為backfill;
三、關于CRUSH
CRUSH是Controlled Replication Under Scalable Hashing的縮寫 , 它是一種數據分布式算法,類似于一致性哈希算法,用于為RADOS存儲集群控制數據分布;在ceph上如果我們把對象直接映射到OSD上會導致二者的耦合度過于緊密;這意味著如果一個OSD的變動 , 可能導致整個集群的數據的變動;所以,Ceph將一個對象映射進RADOS集群的過程分為兩步;首先是以一致性哈希算法將對象名稱映射到PG,而后而后是將PG ID基于CRUSH算法映射到OSD;此兩個過程都以“實時計算”的方式完成,而非傳統的查表方式,從而有效規避了任何組件被“中心化”的可能性,使得集群規模擴展不再受限;
Ceph客戶端IO的簡要工作流程
在ceph上,客戶端存取對象時,客戶端從Ceph監視器檢索出集群運行圖,綁定到指定的存儲池,并對存儲池上PG內的對象執行IO操作;存儲池的CRUSH規則集和PG的數量是決定Ceph如何放置數據的關鍵性因素,基于最新版本的集群運行圖,客戶端能夠了解到集群中的所有監視器和OSD以及它們各自的當前狀態;這對于客戶端來說,對象存儲在那個位置是一無所知的;執行對象的存取操作時,客戶端需要輸入的是對象標識和存儲池名稱;客戶端需要在存儲池中存儲命名對象時 , 它將對象名稱、對象名稱的哈希碼、存儲池中的PG數量和存儲池名稱作為輸入,而后由CRUSH計算出PG的ID及此PG的主OSD;通過將對象標識進行一致性哈希運算得到的哈希值與PG位圖掩碼進行”與“運算得到目標PG,從而得出目標PG的ID(pg_id),完成由Object至PG的映射; 而后,CRUSH算法便將以此pg_id、CRUSH運行圖和歸置規則(Placement Rules)為輸入參數再次進行計算,并輸出一個確定且有序的目標存儲向量列表(OSD列表),從而完成從PG至OSD的映射;
Ceph客戶端計算PG_ID的步驟
1、首先客戶端輸入存儲池名稱及對象名稱 , 例如,pool = pool1以及object-id = obj1;
2、獲取對象名稱并通過一致性哈希算法對其進行哈希運算 , 即hash(o),其中o為對象名稱;
3、將計算出的對象標識哈希碼與PG位圖掩碼進行“與”運算獲得目標PG的標識符,即PG_ID,如1701;計算公式為pgid=func(hash(o)&m,r),其中,變量o是對象標識符,變量m是當前存儲池中PG的位圖掩碼,變量r是指復制因子,用于確定目標PG中OSD數量;
4、CRUSH根據集群運行圖計算出與目標PG對應的有序的OSD集合,并確定出其主OSD;
5、客戶端獲取到存儲池名稱對應的數字標識,例如,存儲池“pool1”的數字標識11;
6、客戶端將存儲池的ID添加到PG ID,例如,11.1701;
7、客戶端通過直接與PG映射到的主OSD通信來執行諸如寫入、讀取或刪除之類的對象操作;
簡單來講,ceph客戶端存取對象數據的過程就是 , 先提取用戶要存入的對象數據的名稱和存儲到那個存儲池之上;然后通過一致性哈希算法計算出對象名稱的hash值,然后把這個hash值和在對應存儲池PG位圖掩碼做“與”運算得到目標PG的標識符,即PG ID;有了PG_ID,再根據CRUSH算法結合集群運行圖和PG對應的OSD集合,最終把PG對應的主OSD確認 , 然后將對應osd的信息返回給客戶端,然后客戶端拿著這些信息主動聯系osd所在主機進行數據的存?。徽庖還討?,脫]寫車牟楸? ,查數據庫之類的操作;全程都是通過計算來確定對應數據存儲路徑;這也就規避了傳統查表或查數據庫的方式給集群帶來的性能瓶頸的問題;
【分布式存儲系統之Ceph集群存儲池、PG 與 CRUSH】

推薦閱讀