一個塊是一個連續的字節序列(例如一個512字節的連續數據是一個塊)。基於塊的存儲接口一般是旋轉介質,例如磁盤、光盤、軟盤等。塊設備接口的普及使得能夠用虛擬的塊設備成爲和大容量數據存儲系統交互的接口,如Ceph這樣的系統。數據庫
注意:內核模塊可使用Linux頁緩存。 對於基於librbd的應用,Ceph支持RBD緩存。緩存
Ceph的塊設備能夠在爲Linux的內核,KVM虛擬機,以及像OpenStack和CloudStack這種使用libvirt的雲計算平臺提供高性能和無限可擴展的的存儲。Ceph支持在集羣中同時運行Ceph的RADOS網關,Ceph的文件系統和Ceph的塊存儲。安全
rbd的命令可以建立、列出、內省、和刪除塊設備鏡像。你一可使用其來克隆鏡像,建立快照,回滾快照,查看快照等。跟詳細的信息能夠參閱管理RADOS塊設備鏡像dom
使用鏡像以前,必須在Ceph的存儲集羣中建立鏡像。執行下面的命令:ide
rbd create {鏡像名稱} --size {鏡像大小} --pool {存儲池名稱}
例如,在名爲swinmmingpool中建立一個1GB的名字爲foo的鏡像:性能
rbd create foo --size 1024 rbd create bar --size 1024 --pool swimmingpool
你必須首先建立一個存儲池(pool)雲計算
rbd ls rbd ls {poolname}
rbd --image {image-name} info rbd --image {image-name} -p {pool-name} info
rbd resize --image foo --size 2048
rbd rm {image-name} rbd rm {image-name} -p {pool-name}
快照是一個鏡像在某一個特定時間點的只讀拷貝。其中Ceph塊設備的高級功能是可以建立快照保留鏡像的歷史狀態。Ceph支持快照分層,容許快速克隆鏡像。 Ceph還支持使用RDB和如KVM,libvirt等建立快照。操作系統
當作快照時須要中止I/O。若是鏡像包含文件系統,文件系統必須在作快照前保持一致性命令行
rbd --pool rbd snap create --snap snapname foo rbd snap create rbd/foo@snapname
rbd --pool rbd snap rollback --snap snapname foo rbd snap rollback rbd/foo@snapname
注意:回滾快照就是將當前鏡像的數據用快照從新替換。回滾的執行時間隨着鏡像大小的增長而增長。克隆將會比回滾快照更花時間。code
Ceph支持建立許多copy-on-write(COW)的克隆快照。 分層快照支持Ceph快設備的客戶端快速建立鏡像。例如,你可能建立了一個虛擬機的鏡像並寫入了一些數據。而後,作一個快照,保護這個快照,按照須要建立許多copy-on-write的克隆。一個快照是隻讀的,因此克隆快照語義上的簡化讓克隆的速度很快。
筆記:Parent和Child意味着一個snapshot是parent,克隆鏡像是child。
每個child存儲着一個與之相關的parent鏡像,可以讓克隆鏡像打開parent快照並從中讀數據。
一個COW的克隆快照的表現形式是一個Ceph的塊設備。你能夠讀、寫、克隆和調整鏡像的大小。對克隆的快照並無更多的限制,可是克隆鏡像依賴於一個以前的快照,因此你必須在克隆鏡像以前保護快照。下面的圖表描述了這個過程。
注意 Ceph僅僅支持兩種形式的鏡像。1)經過rbd建立的鏡像。2)不被kernel的rbd模式支持。你必須使用qemu/kvm或者librbd直接經過克隆的方式進行。
Ceph的分層快設備是一個簡單的過程。你必須首先有一個鏡像、建立一個這個鏡像的快照,保護這個快照。一旦你作完了這三個步驟,你可以開始克隆快照。
克隆鏡像必須制定一個parent快照,包括這個快照所在的pool ID、image ID和snapshot ID。包含pool ID意味着能夠從另一個pool中克隆快照。
克隆鏡像須要訪問parent快照,若是用戶無心中刪除了parent快照,全部的克隆將會沒法恢復,因此克隆以前必須從新保護快照。
rbd --pool rbd snap protect --image my-image --snap my-snapshot rbd snap protect rbd/my-image@my-snapshot
被保護的快照不能夠刪除
rbd clone rbd/my-image@my-snapshot rbd/new-image
你能夠從一個存儲池克隆快照到另外一個存儲池。例如,你能夠修復一個只讀的鏡像,而且在一個存儲池作一個快照模版。在另外一個存儲池中克隆。
rbd --pool rbd snap unprotect --image my-image --snap my-snapshot rbd snap unprotect rbd/my-image@my-snapshot
rbd --pool rbd children --image my-image --snap my-snapshot rbd children rbd/my-image@my-snapshot
克隆鏡像存在依賴關係。取消這種依賴關係叫作合併鏡像。合併鏡像花費的時間和鏡像的大小成正比。 要刪除一個快照模版,必須先合併子鏡像。
rbd --pool rbd flatten --image my-image rbd flatten rbd/my-image
注意:合併的鏡像會佔據更多的存儲空間。
最多見的Ceph的塊設備使用案例包括提供虛擬機設備鏡像。例如,用戶會建立一個主鏡像安裝了操做系統和相關軟件而且已經配置好。以後,用戶建立一個快照。最後經過克隆這個快照使用虛擬機。這種方式能夠用來快速部署虛擬機。由於客戶端不須要每次下載整個鏡像。
Ceph的塊設備可以集成在kvm的虛擬機中。
kvm的命令行會指定存儲池的名稱和鏡像的名稱。也能夠制定一個快照的名稱。
kvm將會從默認的位置獲取ceph的配置參數(/etc/ceph/$cluter.conf)。
qemu-img {command} [options] rbd:glance-pool/maipo:id=glance:conf=/etc/ceph/ceph.conf
qemu-img create -f raw rbd:data/foo 10G
重要: RAW格式是RBD原生支持的格式,qcow2和vmdk將會帶來更大的開銷,而且在虛擬機遷移時帶來不安全。
qemu-img resize rbd:data/foo 10G
qemu-img info rbd:data/foo
qemu -m 1024 -drive format=raw,file=rbd:data/squeeze
設定緩存選項
qemu -m 1024 -drive format=rbd,file=rbd:data/squeeze,cache=writeback
若是設定了rbd_cache=true,必須設置cache=writeback,不然有數據丟失的風險。沒有設置cache=writeback,kvm將不會發送刷新請求到librbd。
在Ceph 0.46和kvm 1.1 之後, Ceph塊設備支持丟棄操做。時就意味着客戶端能夠發送TRIM請求讓Ceph塊設備釋放未被使用的空間。這種操做能夠經過ext4或者xfs支持。
要支持這個選項,須要這樣運行虛擬機:
qemu -m 1024 -drive format=raw,file=rbd:data/squeeze,id=drive1,if=none -device driver=ide-hd,drive=drive1,discard_granularity=512
注意:必須使用IDE設備,而不能使用virtio,virtio不支持丟棄操做
若是使用libvirt,須要編輯其xml文件:
<domain type='kvm' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'> <qemu:commandline> <qemu:arg value='-set'/> <qemu:arg value='block.scsi0-0-0.discard_granularity=4096'/> <qemu:arg value='-set'/> <qemu:arg value='block.scsi0-0-1.discard_granularity=65536'/> </qemu:commandline> </domain>