45.第37章 ceph


一.ceph 架構

Pool:存儲池、分區,存儲池的大小取決於底層的存儲空間。
PG(placement group):一個pool 內部可以有多個PG 存在,pool 和PG 都是抽象的邏輯概念,一個pool 中有多少個PG 可以通過公式計算。
OSD(Object Storage Daemon):每一塊磁盤叫做osd,多個osd 組成一個主機
存儲池要先創建才能往ceph 保存數據,文件在向ceph 保存之前要先進行一致性hash 計算,計算后會把文件保存在某個對應的PG 的,某個文件一定屬於某個pool 的PG,在通過PG保存在OSD 上。
數據對象在寫到主OSD 之后再同步對從OSD 以實現數據的高可用。


注:存儲文件過程:
第一步:把文件對象映射給PG
第二步: 把文件對象映射被OSD,
第三步:通過OSD 寫入到硬盤
監視器mon 維護OSD 和PG 的集群狀態,

二.CURSH 算法

Ceph 使用CURSH 算法來存放和管理數據,它是Ceph 的智能數據分發機制。Ceph 使用CRUSH算法來准確計算數據應該被保存到哪里,以及應該從哪里讀取,和保存元數據不同的是,CRUSH 按需計算出元數據,因此它就消除了對中心式的服務器/網關的需求,它使得Ceph客戶端能夠計算出元數據,該過程也稱為CRUSH 查找,然后和OSD 直接通信。
1.如果是把對象直接映射到OSD 之上會導致對象與OSD 的對應關系過於緊密和耦合,當OSD由於故障發生變更時將會對整個ceph 集群產生影響。

2.於是ceph 將一個對象映射到RADOS 集群的時候分為兩步走:
  首先使用一致性hash 算法將對象名稱映射到PG
  然后將PG ID 基於CRUSH 算法映射到OSD 即可查到對象

3.以上兩個過程都是以”實時計算”的方式完成,而沒有使用傳統的查詢數據與塊設備的對應表的方式,這樣有效避免了組件的”中心化”問題,也解決了查詢性能和冗余問題。使得ceph集群擴展不再受查詢的性能限制。

4.這個實時計算操作使用的就是CRUSH 算法
  Controllers replication under scalable hashing #可控的、可復制的、可伸縮的一致性hash 算法。
  CRUSH 是一種分布式算法,類似於一致性hash 算法,用於為RADOS 存儲集群控制數據的分配。

三.ceph中如何做數據的讀寫

副本池IO:
將一個數據對象存儲為多個副本
在客戶端寫入操作時,ceph 使用CRUSH 算法計算出與對象相對應的PG ID 和primary OSD主OSD 根據設置的副本數、對象名稱、存儲池名稱和集群運行圖(cluster map)計算出PG 的各輔助OSD,然后由OSD 將數據再同步給輔助OSD。
讀取數據:
1. 客戶端發送讀請求,RADOS 將請求發送到主OSD。
2. 主OSD 從本地磁盤讀取數據並返回數據,最終完成讀請求。

寫入數據:
1. 客戶端APP 請求寫入數據,RADOS 發送數據到主OSD。
2. 主OSD 識別副本OSDs,並發送數據到各副本OSD。
3. 副本OSDs 寫入數據,並發送寫入完成信號給主OSD。
4. 主OSD 發送寫入完成信號給客戶端APP。

四.數據讀寫流程

ceph 讀寫對象的時候,客戶端從ceph 監視器檢索出集群運行圖(cluster map),然后客戶端訪問指定的存儲池,並對存儲池內PG 的對象執行讀寫操作。
存儲池的CRUSH 計算結果和PG 的數量,是決定ceph 如何放置數據的關鍵因素。
基於集群的最新運行圖,客戶端能夠了解到集群中的所有監視器和OSD 以及他們各自當前的狀態。
但是客戶端仍然不知道對象的保存位置。
客戶端在讀寫對象時,需要提供的是對象標識和存儲池名稱。
客戶端需要在存儲池中讀寫對象時,需要客戶端將對象名稱、對象名稱的hash 碼、存儲池中的PG 數量和存儲池名稱作為輸入信息提供給ceph,然后由CRUSH 計算出PG 的ID 以及此PG 針對的主OSD 即可讀寫OSD 中的對象。

具體寫操作如下:
1.APP 向ceph 客戶端發送對某個對象的請求,此請求包含對象和存儲池,然后ceph 客戶端對訪問的對象做hash 計算,並根據此hash 值計算出對象所在的PG,完成對象從Pool 至PG的映射。
APP 訪問pool ID 和object ID (比如pool = pool1 and object-id = “name1”)
ceph client 對objectID 做哈希
ceph client 對該hash 值取PG 總數的模,得到PG 編號(比如32),(第2 和第3 步基本保證了一個pool 內部的所有PG 將會被均勻地使用)
ceph client 對pool ID 取hash(比如“pool1” = 3)
ceph client 將pool ID 和PG ID 組合在一起(比如3.23)得到PG 的完整ID。

2.然后客戶端據PG、CRUSH 運行圖和歸置組(placement rules)作為輸入參數並再次進行計算,並計算出對象所在的PG 內的主OSD ,從而完成對象從PG 到OSD 的映射。
Ceph client 從MON 獲取最新的cluster map。
Ceph client 根據上面的第(2)步計算出該object 將要在的PG 的ID。
Ceph client 再根據CRUSH 算法計算出PG 中目標主和備OSD 的ID,即可對OSD 的數據進行讀寫。

3.客戶端開始對主OSD 進行讀寫請求(副本池IO),如果發生了寫操作,會有ceph 服務端完成對象從主OSD 到備份OSD 的同步。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM