[轉自 From <https://my.oschina.net/u/2460844/blog/531686> ]
說明:
先建立一個ceph集群,這個集群有3個monitor節點、多個OSD節點,然后這個上面有個存儲池,每個存儲中的對象都保留3個副本。這時如果發下一個寫request則會經過如下步驟。
1. 客戶端的使用
在客戶端使用rbd設備時,一般有兩種方法。
圖1-1 client rbd設備的使用
第一種 是kernel rbd。就是創建了rbd設備后,把rbd設備map到內核中,形成一個虛擬的塊設備,這時這個塊設備同其他通用塊設備一樣,一般的設備文件為/dev/rbd0,后續直接使用這個塊設備文件就可以了,可以把/dev/rbd0格式化后mount到某個目錄,也可以直接作為裸設備使用。這時對rbd設備的操作都通過kernel rbd操作方法進行的。
第二種是librbd方式。就是創建了rbd設備后,這時可以使用librbd、librados庫進行訪問管理塊設備。這種方式不會map到內核,直接調用librbd提供的接口,可以實現對rbd設備的訪問和管理,但是不會在客戶端產生塊設備文件。
2 . ceph上數據的組織
ceph上組合物理資源時的進行了多重映射。
圖1-2 ceph數據的映射層次
客戶想要創建一個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。
3.客戶端寫數據到osd上的過程
假設這次采用的是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數據節點。
總結剖析這個寫數據過程,第一部分客戶端處理對rbd讀寫的請求,經過librbd與librados庫可知道數據保存在哪些OSD上,客戶端與primary OSD建立通信,傳輸請求,再由primary OSD 發送給其他replica OSD。
圖1-3 數據寫操作