說明:先創建一個ceph集羣,這個集羣有3個monitor節點、多個OSD節點,而後這個上面有個存儲池,每一個存儲中的對象都保留3個副本。這時若是發下一個寫request則會通過以下步驟。工具
A . 客戶端的使用,在客戶端使用rbd設備時,通常有兩種方法。spa
圖1-1 client rbd設備的使用對象
第一種 是kernel rbd。就是建立了rbd設備後,把rbd設備map到內核中,造成一個虛擬的塊設備,這時這個塊設備同其餘通用塊設備同樣,通常的設備文件爲/dev/rbd0,後續直接使用這個塊設備文件就能夠了,能夠把/dev/rbd0格式化後mount到某個目錄,也能夠直接做爲裸設備使用。這時對rbd設備的操做都經過kernel rbd操做方法進行的。接口
第二種是librbd方式。就是建立了rbd設備後,這時可使用librbd、librados庫進行訪問管理塊設備。這種方式不會map到內核,直接調用librbd提供的接口,能夠實現對rbd設備的訪問和管理,可是不會在客戶端產生塊設備文件。資源
B . ceph上數據的組織。ceph上組合物理資源時的進行了多重映射。部署
圖1-2 ceph數據的映射層次it
客戶想要建立一個rbd設備前,必須建立 一個pool,須要爲這個pool指定pg的數量,在一個pool中的pg數量是不必定的,同時這個pool中要指明保存數據的副本數量3個副本。再在這個pool中建立一個rbd設備rbd0,那麼這個rbd0都會保存三份,在建立rbd0時必須指定rbd的size,對於這個rbd0的任何操做不能超過這個size。以後會將這個塊設備進行切塊,每一個塊的大小默認爲4M,而且每一個塊都有一個名字,名字就是object+序號。將每一個object經過pg進行副本位置的分配(pg map 到osd的過程會在下一節講述),pg會尋找3個osd,把這個object分別保存在這三個osd上。osd上實際是把底層的disk進行了格式化操做,通常部署工具會將它格式化爲xfs文件系統。最後對於object的存儲就變成了存儲一個文件rbd0.object1.file。集羣
c.客戶端寫數據到osd上的過程。cli
假設此次採用的是librbd的形式,使用librbd建立一個塊設備,這時向這個塊設備中寫入數據,在客戶端本地同過調用librados接口,而後通過pool,rbd,object、pg進行層層映射,在PG這一層中,能夠知道數據保存在哪3個OSD上,這3個OSD分爲主從的關係,也就是一個primary OSD,兩個replica OSD。客戶端與primay OSD創建SOCKET 通訊,將要寫入的數據傳給primary OSD,由primary OSD再將數據發送給其餘replica OSD數據節點。object
總結剖析這個寫數據過程,第一部分客戶端處理對rbd讀寫的請求,通過librbd與librados庫可知道數據保存在哪些OSD上,客戶端與primary OSD創建通訊,傳輸請求,再由primary OSD 發送給其餘replica OSD。
圖1-3 數據寫操做