目錄緩存
塊是一個字節序列(例如,一個 512 字節的數據塊)。基於塊的存儲接口是最多見的存儲數據方法,例如硬盤、CD、軟盤等。無處不在的塊設備接口(block device interfaces)使 虛擬塊設備(virtual block device)成爲與 Ceph 這樣的海量存儲系統交互的理想之選。服務器
Ceph 塊設備是精簡配置、大小可調的,將數據條帶化存儲到集羣內的多個 OSD。 Ceph 塊設備利用 RADOS 的多種能力,如快照、複製和一致性。app
Ceph 的 RADOS 塊設備(Ceph's RADOS Block Devices, RBD) 使用 內核模塊(kernel modules
)或 librbd 庫(librbd library
)與 OSD 交互。異步
Note:內核模塊可以使用 Linux 頁緩存(Linux page caching)。對基於 librbd 的應用程序, Ceph 支持 RBD 緩存(RBD Caching)。性能
注:{pool-name}
爲空時,爲默認的 rbd
存儲池。映像 指 塊設備映像 image。ui
rbd create --size {megabytes} {pool-name}/{image-name}
rbd ls {pool-name} rbd trash ls {poolname} //列出延遲刪除塊設備
rbd info {pool-name}/{image-name}
Ceph 塊設備映像是精簡配置,只有在你開始寫入數據時它們纔會佔用物理空間。操作系統
rbd resize --size 2048 foo (to increase) rbd resize --size 2048 foo --allow-shrink (to decrease)
rbd rm {pool-name}/{image-name}
在rbd池中恢復延遲刪除的塊設備,須要 {image-id}命令行
rbd trash restore {pool-name}/{image-id}
要掛載塊設備映像,先羅列出全部的映像。3d
rbd ls {pool-name}
把映像映射爲虛擬塊設備:用 rbd map
把 映像名 映射到 內核模塊。rbd 內核模塊會在此過程當中自動加載。rest
sudo rbd map {pool-name}/{image-name} --id {user-name}
注:若是你啓用了 cephx
認證,還必須提供密鑰,能夠用密鑰環或密鑰文件指定密鑰:
sudo rbd map rbd/myimage --id admin --keyring /path/to/keyring sudo rbd map rbd/myimage --id admin --keyfile /path/to/file
rbd showmapped
映射成功後就能夠:
1.使用 mkfs 命令 將塊設備構建化爲文件系統:
sudo mkfs.xfs /dev/rbd/{pool-name}/{image-name}
2.使用 mount 命令 將文件系統掛載到某個路徑下:
sudo mount /dev/rbd/{pool-name}/{image-name} /mnt/ceph-block-device
sudo rbd unmap /dev/rbd/{poolname}/{imagename}
快照是映像在某個特定時間點的一份只讀副本。 Ceph 塊設備的一個高級特性就是你能夠爲映像建立快照來保留其歷史。 Ceph 還支持分層快照,讓你快速、簡便地克隆映像(如 VM 映像)。 Ceph 的快照功能支持 rbd 命令和多種高級接口,包括 QEMU 、 libvirt 、 OpenStack 和 CloudStack 。
注:若是啓用了cephx(默認的),你必須指定用戶名或 ID 、及其對應的密鑰文件
rbd --id {user-ID} --keyring=/path/to/secret [commands] rbd --name {username} --keyring=/path/to/secret [commands]
Tip:把用戶名和密鑰寫入 CEPH_ARGS 環境變量,這樣就無需每次手動輸入。
用 rbd 命令建立快照,要指定 snap create 選項、存儲池名和映像名。
rbd snap create {pool-name}/{image-name}@{snap-name}
列出某個映像的快照,須要指定存儲池名和映像名。
rbd snap ls {pool-name}/{image-name}
用 rbd 命令回滾到某一快照,指定 snap rollback 選項、存儲池名、映像名和快照名。
rbd snap rollback {pool-name}/{image-name}@{snap-name}
要用 rbd 刪除一快照,指定 snap rm 選項、存儲池名、映像名和快照名。
rbd snap rm {pool-name}/{image-name}@{snap-name}
要用 rbd 刪除某個映像的全部快照,指定 snap purge 選項、存儲池名和映像名。
rbd snap purge {pool-name}/{image-name}
Ceph 支持爲某一設備快照建立不少個 寫時複製( COW ) 克隆。分層快照使得 Ceph 塊設備客戶端能夠很快地建立映像。例如,你能夠建立一個包含有 Linux VM 的塊設備映像;而後作快照、保護快照,再建立任意多個寫時複製克隆。快照是隻讀的,因此簡化了克隆快照的語義 —— 使得克隆很迅速。
各個克隆出來的映像(子)都存儲着對父映像的引用,這使得克隆出來的映像能夠打開父映像並讀取它。
一個快照的 COW 克隆和其它任何 Ceph 塊設備映像的行爲徹底同樣。克隆出的映像沒有特別的限制,你能夠讀出、寫入、克隆、調整克隆映像的大小。然而快照的寫時複製克隆引用了快照,因此你克隆快照前必須保護它。下圖描述了此過程。
分層入門
Ceph 塊設備的分層是個簡單的過程。你必須有個映像、必須爲它建立快照、而且必須保護快照,執行過這些步驟後,你才能克隆快照。
克隆出的映像包含對父快照的引用,也包含存儲池 ID 、映像 ID 和快照 ID 。
1.Image Temerate:映像模板
2.Extended Template:擴展模板
3.Template Pool:模板池
4.Image Migration/Recovery:模板遷移/恢復
克隆映像要訪問父快照。若是用戶不當心刪除了父快照,全部克隆映像都會損壞。爲防止數據丟失,在克隆前必須先保護快照。你刪除不了受保護的快照。
rbd snap protect {pool-name}/{image-name}@{snapshot-name}
rbd clone {pool-name}/{parent-image}@{snap-name} {pool-name}/{child-image-name}
刪除快照前,必須先取消保護。
rbd snap unprotect {pool-name}/{image-name}@{snapshot-name}
rbd children {pool-name}/{image-name}@{snapshot-name}
克隆出來的映像仍保留了對父快照的引用。要從子克隆刪除這些到父快照的引用,你能夠把快照的信息複製給子克隆,也就是「拍平」它。拍平克隆映像的時間隨快照尺寸增大而增長。要刪除快照,必須先拍平子映像。
rbd flatten {pool-name}/{image-name}
能夠在兩個 Ceph 集羣中異步備份 RBD images。該能力利用了 RBD image 的日誌特性,以確保集羣間的副本崩潰一致性。鏡像功能須要在同伴集羣( peer clusters )中的每個對應的 pool 上進行配置,可設定自動備份某個存儲池內的全部 images 或僅備份 images 的一個特定子集。用 rbd 命令來配置鏡像功能。 rbd-mirror 守護進程負責從遠端集羣拉取 image 的更新,並寫入本地集羣的對應 image 中。
Note:RBD 鏡像功能須要 Ceph Jewel 或更新的發行版本。
Important:要使用 RBD 鏡像功能,你必須有 2 個 Ceph 集羣, 每一個集羣都要運行 rbd-mirror 守護進程。
存儲池配置
鏡像功能是在 Ceph 集羣內的存儲池級別上配置的。
rbd mirror pool enable {pool-name} {mode}
鏡像模式 mode 能夠是 pool 或 image:
rbd mirror pool disable {pool-name}
爲了使 rbd-mirror 守護進程發現它的同伴集羣,須要向存儲池註冊。
rbd mirror pool peer add {pool-name} {client-name}@{cluster-name}
rbd mirror pool peer remove {pool-name} {peer-uuid}
IMAGE配置
不一樣於存儲池配置,image 配置只需針對單個 Ceph 集羣操做。
鏡像 RBD image 被指定爲主鏡像或者副鏡像。這是 image 而非存儲池的特性。被指定爲副鏡像的 image 不能被修改。
當一個 image 首次啓用鏡像功能時(存儲池的鏡像模式設爲 pool 且啓用了該 image 的日誌特性,或者經過 rbd 命令顯式啓用),它會自動晉升爲主鏡像。
RBD 鏡像功能使用了 RBD 日誌特性,來保證 image 副本間的崩潰一致性。在備份 image 到另外一個同伴集羣前,必須啓用日誌特性。該特性可在使用 rbd 命令建立 image 時經過指定 --image-feature exclusive-lock,journaling 選項來啓用。
或者,能夠動態啓用已有 image 的日誌特性。
rbd feature enable {pool-name}/{image-name} {feature-name}
Tip:你能夠經過在 Ceph 配置文件中增長 rbd default features = 125 ,使得全部新建 image 默認啓用日誌特性。
rbd mirror image enable {pool-name}/{image-name}
rbd mirror image disable {pool-name}/{image-name}
在須要把主名稱轉移到同伴 Ceph 集羣這樣一個故障切換場景中,應該中止全部對主 image 的訪問(好比關閉 VM 的電源或移除 VM 的相關驅動),當前的主 image 降級爲副,原副 image 升級爲主,而後在備份集羣上恢復對該 image 訪問。
rbd mirror image demote {pool-name}/{image-name}
rbd mirror image promote {pool-name}/{image-name}
Tip:因爲主 / 副狀態是對於每一個 image 而言的,故可讓兩個集羣拆分 IO 負載來進行故障切換 / 故障自動恢復。
若是 rbd-daemon 探測到了腦裂事件,它在此狀況獲得糾正以前,是不會嘗試去備份受到影響的 image。爲了恢復對 image 的鏡像備份,首先斷定降級 image 已通過時,而後向主 image 請求從新同步。
rbd mirror image resync {pool-name}/{image-name}
Ceph 塊設備最多見的用法之一是做爲虛擬機的 塊設備映像 。例如,用戶可建立一個安裝、配置好了操做系統和相關軟件的「黃金標準」映像,而後對此映像作快照,最後再克隆此快照(一般不少次)。能製做快照的寫時複製克隆意味着 Ceph 能夠快速地爲虛擬機提供塊設備映像,由於客戶端每次啓動一個新虛擬機時沒必要下載整個映像。
QEMU 能把一主機上的塊設備傳遞給客戶機,但從 QEMU 0.15 起,不須要在主機上把映像映射爲塊設備了。QEMU 如今能經過 librbd 直接把映像做爲虛擬塊設備訪問。這樣性能更好,由於它避免了額外的上下文切換,並且能利用開啓 RBD 緩存帶來的好處。
http://docs.ceph.org.cn/install/install-vm-cloud/
sudo yum install qemu-kvm qemu-kvm-tools qemu-img
Ceph 塊設備能夠和 QEMU 虛擬機集成到一塊兒。QEMU 命令行要求你指定 存儲池名和映像名,還能夠指定快照名。
QEMU 會假設 Ceph 配置文件位於默認位置(如 /etc/ceph/$cluster.conf ),而且你是以默認的 client.admin 用戶執行命令,除非你另外指定了其它 Ceph 配置文件路徑或用戶(對應/etc/ceph/ceph.client.{ID}.keyring)。
qemu-img {command} [options] rbd:{pool-name}/{image-name}[@snapshot-name][:option1=value1][:option2=value2...]
例如,應該這樣指定 id 和 conf 選項:
qemu-img {command} [options] rbd:{pool-name}/{image-name}:id=admin:conf=/etc/ceph/ceph.conf //其中 :id=admin:conf=/etc/ceph/ceph.conf 是默認選項,能夠省略
qemu-img create -f raw rbd:{pool-name}/{image-name} {size}
Important:raw 數據格式是使用 RBD 時的惟一可用 format 選項。
建立後,客戶端能夠直接經過 librbd 直接把映像做爲 虛擬塊設備 rbd:{pool-name}/{image-name}
訪問。
qemu-img resize rbd:{pool-name}/{image-name} {size}
qemu-img info rbd:{pool-name}/{image-name}
你能夠用 qemu-img 把已有的虛擬機映像轉換爲 Ceph 塊設備映像。好比你有一個 qcow2 映像,能夠這樣轉換:
qemu-img convert -f qcow2 -O raw debian_squeeze.qcow2 rbd:data/squeeze
要從那個映像啓動虛擬機,執行:
qemu -m 1024 -drive format=raw,file=rbd:data/squeeze
啓用 RBD 緩存可顯著提高性能。從 QEMU 1.2 起, QEMU 的緩存選項可控制 librbd 緩存:
qemu -m 1024 -drive format=rbd,file=rbd:data/squeeze,cache=writeback
Important:若是你設置了 rbd_cache=true ,那就必須設置 cache=writeback, 不然有可能丟失數據。不設置 cache=writeback , QEMU 就不會向 librbd 發送回寫請求。若是 QEMU 退出時未清理乾淨, rbd 之上的文件系統就有可能崩潰。
從 Ceph 0.46 和 QEMU 1.1 起, Ceph 塊設備支持 discard 操做。這意味着客戶機能夠發送 TRIM 請求來讓 Ceph 塊設備回收未使用的空間。此功能可在客戶機上掛載 ext4 或 XFS 時加上 discard 選項。
//QEMU 緩存選項
QEMU 的緩存選項對應下列的 Ceph RBD 緩存選項。
回寫:
rbd_cache = true
透寫:
rbd_cache = true rbd_cache_max_dirty = 0
無:
rbd_cache = false
QEMU 的緩存選項會覆蓋 Ceph 的默認選項(就是那些 Ceph 配置文件裏沒有的選項)。若是你在 Ceph 配置文件內設置了 RBD 緩存選項,那麼它們會覆蓋 QEMU 緩存選項。若是你在 QEMU 命令行中設置了緩存選項,它們則會覆蓋 Ceph 配置文件裏的選項。
下圖解釋了 libvirt 和 QEMU 如何經過 librbd 使用 Ceph 塊設備。
libvirt 常見於爲雲解決方案提供 Ceph 塊設備,像 OpenStack 、 ClouldStack 。它們用 libvirt 和 QEMU/KVM 交互、 QEMU/KVM 再經過 librbd 與 Ceph 塊設備交互。
經過 libvirt 你能夠把 Ceph 塊設備用於 OpenStack ,它配置了 QEMU 到 librbd 的接口。 Ceph 把塊設備映像條帶化爲對象並分佈到集羣中,這意味着大容量的 Ceph 塊設備映像其性能會比獨立服務器更好。
要把 Ceph 塊設備用於 OpenStack ,必須先安裝 QEMU 、 libvirt 和 OpenStack 。咱們建議用一臺獨立的物理主機安裝 OpenStack ,此主機最少需 8GB 內存和一個 4 核 CPU 。下面的圖表描述了 OpenStack/Ceph 技術棧。