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

前文我們了解了ceph集群狀態獲取常用命令以及通過ceph daemon、ceph tell動態配置ceph組件、ceph.conf配置文件相關格式的說明等,回顧請參考https://www.cnblogs.com/qiuhom-1874/p/16727820.html;今天我們來聊一聊ceph的存儲池、PG以及CRUSH相關話題;
一、關于存儲池
我們知道ceph客戶端存儲對象數據到RADOS集群上,不是客戶端直接存儲到osd上;首先客戶端會根據ceph集群的配置 , 將客戶端存儲的對象數據切分多個固定大小的對象數據,然后再將這些固定大小的數據對象通過一致性hash算法將對象數據映射至存儲池里的PG,然后由CRUSH算法計算以后 , 再將PG映射至對應osd , 然后由mon返回osd的ID給客戶端,客戶端拿著mon給的osd相關信息主動聯系對應osd所在節點osd進程,進行數據存儲操作;
什么是存儲池呢?在ceph上,所謂存儲池是ceph以“存儲池(pool)”的方式,將RADOS存儲集群提供的存儲服務邏輯分割一個或多個存儲區域;我們可以理解為數據對象的名稱空間;實踐中,管理員可以為特定應用程序存儲不同類型數據的需求分別創建專用的存儲池,例如rbd存儲池、rgw存儲池等,也可以為某個項目或某個用戶創建專有的存儲池;當然,如果我們在一個存儲池里存儲的數據過多,為了方便管理,存儲池還可以進一步細分為一至多個名稱空間(namespace);客戶端(包括rbd和rgw等)存取數據時,需要事先指定存儲池名稱、用戶名和密鑰等信息完成認證,而后將一直維持與其指定的存儲池的連接,于是也可以把存儲池看作是客戶端的IO接口;
Ceph存儲池類型
在ceph上,存儲池有兩種類型;默認情況下 , 我們不指定什么類型的存儲池就是副本池(replicated pool);所謂副本池就是存儲在該存儲之上的對象數據 , 都會由RADOS集群將每個對象數據在集群中存儲為多個副本,其中存儲于主OSD的為主副本,副本數量在創建存儲池時 由管理員指定;默認情況下不指定副本數量,對應副本數量為3個,即1主2從;從上面的描述可以看到,當我們存儲一份對象數據時,為了冗余備份,我們需要將數據存儲3分,即有兩份冗余;這也意味著,我們磁盤利用率也只有1/3;于是,為了提高磁盤的利用率的同時,又能保證冗余,ceph還支持糾刪碼池(erasure code);糾刪碼池就是把個對象存儲為 N=K+M 個塊,其中 , K為數據塊數量 , M為編碼塊數量 , 因此存儲池的尺寸為 K+M ;糾刪碼是一種前向糾錯(FEC)代碼通過將K塊的數據轉換為N塊 , 假設N=K+M , 則其中的M代表糾刪碼算法添加的額外或冗余的塊數量以提供冗余機制(即編碼塊) , 而N則表示在糾刪碼編碼之后要創建的塊的總數 , 其可以故障的總塊數為M(即N-K)個;類似RAID5;糾刪碼池減少了確保數據持久性所需的磁盤空間量 , 但計算量上卻比副本存儲池要更貴一些;但我們在使用糾刪碼池的時候需要注意不是所有的應用都支持糾刪碼池 , 比如,RGW可以使用糾刪碼存儲池,但RBD就不支持糾刪碼池,它只支持副本池;
副本池IO

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

文章插圖
提示:在ceph上,副本池會將一個數據對象存儲為多個副本;為此,在寫入操作時,ceph客戶端使用crush算法來計算對象的PG ID和Primary OSD,然后客戶端將數據寫入主OSD,主OSD根據設定的副本數、對象的名稱、存儲池名稱和集群運行圖(Cluster Map)計算出PG的各輔助OSD,而后由主OSD將數據同步給這些輔助OSD,只有在其他輔助osd和主osd都將對應數據存儲好以后,主osd收到對應輔助osd的確認以后 , 才會給客戶端確認;
糾刪碼池IO
分布式存儲系統之Ceph集群存儲池、PG 與 CRUSH

文章插圖
提示:如上圖所示客戶端把包含數據“ABCDEFGHI”的對象NYAN保存到存儲池中時 , 假設糾刪碼算法會將內容分割為三個數據塊:第一個包含ABC,第二個為DEF,最后一個為GHI,并為這三個數據塊額外創建兩個編碼塊:第四個YXY和第五個QGC;在有著兩個編碼塊配置的存儲池中,它容許至多兩個OSD不可用而不影響數據的可用性 。假設,在某個時刻OSD 1和OSD 3因故無法正常響應客戶端請求,這意味著客戶端僅能讀取到ABC、DEF和QGC , 此時糾刪編碼算法會通過計算重那家出GHI和YXY;
二、關于PG
分布式存儲系統之Ceph集群存儲池、PG 與 CRUSH

文章插圖
提示:PG是用于跨OSD將數據存儲在某個存儲池中的內部數據結構;相對于存儲池來說,PG是一個虛擬組件,它是對象映射到OSD時使用的虛擬層;出于規模伸縮及性能方面的考慮,Ceph將存儲池細分為歸置組,把每個單獨的對象映射到歸置組,并將歸置組分配給一個主OSD;存儲池由一系列的歸置組組成,而CRUSH算法則根據集群運行圖和集群狀態,將各PG均勻、偽隨機地分布到集群中的OSD之上;所謂偽隨機是指,在osd都健康數量沒有變化的情況下 , 同一PG始終映射相同的OSD;若某OSD失敗或需要對集群進行重新平衡,Ceph則移動或復制整個歸置組而無需單獨尋址每個對象;歸置組在OSD守護進程和Ceph客戶端之間生成了一個中間層,CRUSH算法負責將每個對象動態映射到一個歸置組,然后再將每個歸置組動態映射到一個或多個OSD守護進程,從而能夠支持在新的OSD設備上線時動態進行數據重新平衡;

推薦閱讀