解析Ceph: Librbd–塊存儲庫


轉載:http://www.wzxue.com/ceph-librbd-block-library/?utm_source=tuicool&utm_medium=referral

Librbd 是Ceph的塊存儲庫,其利用Rados提供的API實現對卷的管理和操作。就目前而言,在Ceph支持的三種接口Posix(CephFS),塊存儲(Librbd)和對象存儲(RadosGW)接口中,塊存儲是目前最穩定且達到生產環境要求的接口。

這篇文章主要分析Librbd如何利用Rados API實現塊存儲管理要求。

使用場景

使用Ceph的塊存儲有兩種路徑,一種是利用QEMU走librbd路徑,另一種是使用kernel module,走kernel的路徑。前種主要為虛擬機提供塊存儲設備,后者主要為Host提供塊設備支持,兩種途徑的接口實現不完全相同。就目前來說, 前者是目前更穩定的途徑,也是Ceph所有應用場景中最廣泛使用的。(PS: 強烈不推薦使用kernel module)

ditaa-e4a4957f90e4d8ebac2608e1544c34bf784cfdfb

基本數據結構和概念

下面主要介紹Librbd中一些重要的概念,可能與其他環境下的意義不太相同。

Image: 對應於LVM的Logical Volume,是能被attach/detach到VM的載體。在RBD中,Image的數據有多個Object組成。

Snapshot: Image的某一個特定時刻的狀態,只能讀不能寫但是可以將Image回滾到某一個Snapshot狀態。Snapshot必定屬於某一個Image。

Clone: 為Image的某一個Snapshot的狀態復制變成一個Image。如ImageA有一個Snapshot-1,clone是根據ImageA的 Snapshot-1克隆得到ImageB。ImageB此時的狀態與Snapshot-1完全一致,區別在於ImageB此時可寫,並且擁有Image 的相應能力。

主要API實現

  1. 創建卷: 使用Rados API創建一個Header Object,將這個卷的元數據如id, size, snaps, name, seq等信息寫入。然后將自身(id)注冊到一個”RBD_DIRECTORY”的Object里。
  2. 創建快照: 發送一個請求到Monitor得到一個snap_seq,然后同時將一個快照的元信息如name,features, size,parent作為一個Snap Context存到之前創建的Image Header Object里。更多的快照實現細節參見解析Ceph: Snapshot

  3. 克隆卷: 克隆卷需要指定來源卷和特定快照,首先獲取源卷的信息,也就是通過之前創建的Header Object得到。然后同樣創建一個新的Header Object,存入與來源卷一樣的元信息並且指定parent為來源卷。最后將[source_pool, source_image, source_snap_id]->[c_image_id, c2_image_id, …]存入一個RBD_CHILDREN的對象。這個關系主要用來快速查找和確認父子關系。

  4. 快照回滾: 在創建快照之后可以在任意時刻回滾到之前快照狀態,首先從該快照所屬的Image獲取信息,然后對該Image下的所有Object回滾到之前快照的數 據。這個回滾object的操作主要是刪除最新的object,然后clone之前snapshot object為最新的object。

  5. 寫入數據: 通常卷被QEMU或者Kernel driver管理,因此卷元信息會被一直持有,在寫入數據時得到數據寫入卷的offset, length,然后根據卷元信息得到這些數據分別歸屬的objects,可能會跨越多個。這樣,一個op請求會轉為多個object op分別發送到對應的OSD。如果該卷存在parent卷,也就是clone得到,那么如果這些數據對應的object為空,就會去parent卷的指定 snapshot復制數據,然后將最新的數據覆寫發送。

  6. 讀取數據: 與寫入數據的邏輯類似,讀取請求也可能跨越多個object,或者存在parent卷。此外,在新的Ceph實現里,針對Snapshot或者父卷的讀操 作會偏向從最近的(本地)replcation讀(當數據存在多個副本時),這類操作在Ceph端會認為是弱一致性讀,應用端(librbd)必須保證這 類讀只發生在只讀數據上(如snapshot數據),在lirbd需要打開兩個選項才會啟用平衡讀(隨機選擇任意replication)和本地讀(選擇 本地osd)。

Snip20131226_8


免責聲明!

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



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