1. 程式人生 > >Ceph 塊設備

Ceph 塊設備

file 旋轉 alt .cn reference ron tle last lib

塊是一個字節序列(例如,一個 512 字節的數據塊)。基於塊的存儲接口是最常見的存儲數據方法,它們基於旋轉介質,像硬盤、 CD 、軟盤、甚至傳統的 9 磁道磁帶。無處不在的塊設備接口使虛擬塊設備成為與 Ceph 這樣的海量存儲系統交互的理想之選。

Ceph 塊設備是精簡配置的、大小可調且將數據條帶化存儲到集群內的多個 OSD 。 Ceph 塊設備利用 RADOS 的多種能力,如快照、復制和一致性。 Ceph 的 RADOS 塊設備( RBD )使用內核模塊或 librbd 庫與 OSD 交互。

技術分享圖片

註意:內核模塊可使用 Linux 頁緩存。對基於 librbd

的應用程序, Ceph 可提供 RBD 緩存

Ceph 塊設備靠無限伸縮性提供了高性能,如向內核模塊、或向 abbr:KVM (kernel virtual machines) (如 Qemu 、 OpenStack 和 CloudStack 等雲計算系統通過 libvirt 和 Qemu 可與 Ceph 塊設備集成)。你可以用同一個集群同時運行 Ceph RADOS 網關、 Ceph FS 文件系統、和 Ceph 塊設備。

註意:要使用 Ceph 塊設備,你必須有一個在運行的 Ceph 集群。

一、塊設備命令

rbd 命令可用於創建、羅列、內省和刪除塊設備映像,也可克隆映像、創建快照、回滾快照、查看快照等等。 rbd

命令用法詳情見 RBD – 管理 RADOS 塊設備映像。

Important

要使用 Ceph 塊設備命令,你必須有對應集群的訪問權限。

創建塊設備映像

要想把塊設備加入某節點,你得先在 Ceph 存儲集群中創建一個映像,使用下列命令:

rbd create --size {megabytes} {pool-name}/{image-name}

例如,要在 swimmingpool 這個存儲池中創建一個名為 bar 、大小為 1GB 的映像,執行:

rbd create --size 1024 swimmingpool/bar

如果創建映像時不指定存儲池,它將使用默認的 rbd 存儲池。例如,下面的命令將默認在 rbd 存儲池中創建一個大小為 1GB 、名為 foo 的映像:

rbd create --size 1024 foo

指定此存儲池前必須先創建它,詳情見存儲池。

羅列塊設備映像

要列出 rbd 存儲池中的塊設備,可以用下列命令(即 rbd 是默認存儲池名字):

rbd ls

用下列命令羅列某個特定存儲池中的塊設備,用存儲池的名字替換 {poolname}

rbd ls {poolname}

例如:

rbd ls swimmingpool

檢索映像信息

用下列命令檢索某個特定映像的信息,用映像名字替換 {image-name}

rbd info {image-name}

例如:

rbd info foo


用下列命令檢索某存儲池內的映像的信息,用映像名字替換 {image-name} 、用存儲池名字替換 {pool-name}

rbd info {pool-name}/{image-name}

例如:

rbd info swimmingpool/bar

調整塊設備映像大小

Ceph 塊設備映像是精簡配置,只有在你開始寫入數據時它們才會占用物理空間。然而,它們都有最大容量,就是你設置的 --size 選項。如果你想增加(或減小) Ceph 塊設備映像的最大尺寸,執行下列命令:

rbd resize --size 2048 foo (to increase)
rbd resize --size 2048 foo --allow-shrink (to decrease)

刪除塊設備映像

可用下列命令刪除塊設備,用映像名字替換 {image-name}

rbd rm {image-name}

例如:

rbd rm foo


用下列命令從某存儲池中刪除一個塊設備,用要刪除的映像名字替換 {image-name} 、用存儲池名字替換 {pool-name}

rbd rm {pool-name}/{image-name}

例如:

rbd rm swimmingpool/bar

二、內核模塊

要用內核模塊操作,必須有一個在運行的 Ceph 集群。

獲取映像列表

要掛載塊設備映像,先羅列出所有的映像。

rbd list

映射塊設備

rbd 把映像名映射為內核模塊。必須指定映像名、存儲池名、和用戶名。若 RBD 內核模塊尚未加載, rbd 命令會自動加載。

sudo rbd map {pool-name}/{image-name} --id {user-name}

例如:

sudo rbd map rbd/myimage --id admin


如果你啟用了 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 選項查看映射為內核模塊的塊設備映像。

rbd showmapped

取消塊設備映射

要取消塊設備映射,用 rbd 命令、指定 unmap 選項和設備名(即為方便起見使用的同名塊設備映像)。

sudo rbd unmap /dev/rbd/{poolname}/{imagename}

例如:

sudo rbd unmap /dev/rbd/rbd/foo

三、快照

快照是映像在某個特定時間點的一份只讀副本。 Ceph 塊設備的一個高級特性就是你可以為映像創建快照來保留其歷史。 Ceph 還支持分層快照,讓你快速、簡便地克隆映像(如 VM 映像)。 Ceph 的快照功能支持 rbd 命令和多種高級接口,包括 QEMU 、 libvirt 、 OpenStack 和 CloudStack 。

註意:要使用 RBD 快照功能,你必須有一個在運行的 Ceph 集群。

筆記:

如果在做快照時映像仍在進行 I/O 操作,快照可能就獲取不到該映像準確的或最新的數據,並且該快照可能不得不被克隆到一個新的可掛載的映像中。

所以,我們建議在做快照前先停止 I/O 操作。如果映像內包含文件系統,在做快照前請確保文件系統處於一致的狀態。

要停止 I/O 操作可以使用 fsfreeze 命令。詳情可參考 fsfreeze(8) 手冊頁。對於虛擬機,qemu-guest-agent 被用來在做快照時自動凍結文件系統。

技術分享圖片

Cephx 註意事項

啟用了 cephx 時(默認的),你必須指定用戶名或 ID 、及其對應的密鑰文件,詳情見用戶管理。你也可以用 CEPH_ARGS 環境變量來避免重復輸入下列參數。

rbd --id {user-ID} --keyring=/path/to/secret [commands]
rbd --name {username} --keyring=/path/to/secret [commands]

例如:

rbd --id admin --keyring=/etc/ceph/ceph.keyring [commands]
rbd --name client.admin --keyring=/etc/ceph/ceph.keyring [commands]

註意:把用戶名和密鑰寫入 CEPH_ARGS 環境變量,這樣就無需每次手動輸入。

快照基礎

下列過程演示了如何用 rbd 命令創建、羅列、和刪除快照。

創建快照

rbd 命令創建快照,要指定 snap create 選項、存儲池名和映像名。

rbd snap create {pool-name}/{image-name}@{snap-name}

例如:

rbd snap create rbd/foo@snapname

羅列快照

列出某個映像的快照,需要指定存儲池名和映像名。

rbd snap ls {pool-name}/{image-name}

例如:

rbd snap ls rbd/foo

回滾快照

rbd 命令回滾到某一快照,指定 snap rollback 選項、存儲池名、映像名和快照名。

rbd snap rollback {pool-name}/{image-name}@{snap-name}

例如:

rbd snap rollback rbd/foo@snapname

把映像回滾到某一快照的意思是,用快照中的數據覆蓋映像的當前版本,映像越大,此過程花費的時間就越長。從快照克隆要快於回滾到某快照,這也是回到先前狀態的首選方法。

刪除快照

要用 rbd 刪除一快照,指定 snap rm 選項、存儲池名、映像名和快照名。

rbd snap rm {pool-name}/{image-name}@{snap-name}

例如:

rbd snap rm rbd/foo@snapname

Ceph OSDs 異步地刪除數據,所以刪除快照後不會立即釋放磁盤空間。

清除快照

要用 rbd 刪除某個映像的所有快照,指定 snap purge 選項、存儲池名和映像名。

rbd snap purge {pool-name}/{image-name}

例如:

rbd snap purge rbd/foo

分層

Ceph 支持為某一設備快照創建很多個寫時復制( COW )克隆。分層快照使得 Ceph 塊設備客戶端可以很快地創建映像。例如,你可以創建一個包含有 Linux VM 的塊設備映像;然後做快照、保護快照,再創建任意多個寫時復制克隆。快照是只讀的,所以簡化了克隆快照的語義 —— 使得克隆很迅速。

技術分享圖片

註意:這裏的術語“父”和“子”指的是一個 Ceph 塊設備快照(父),和從此快照克隆出來的對應映像(子)。這些術語對下列的命令行用法來說很重要。

各個克隆出來的映像(子)都存儲著對父映像的引用,這使得克隆出來的映像可以打開父映像並讀取它。

一個快照的 COW 克隆和其它任何 Ceph 塊設備映像的行為完全一樣。克隆出的映像沒有特別的限制,你可以讀出、寫入、克隆、調整克隆映像的大小。然而快照的寫時復制克隆引用了快照,所以你克隆快照前必須保護它。下圖描述了此過程。

筆記:Ceph 僅支持克隆 format 2 的映像(即用 rbd create --image-format 2 創建的)。內核客戶端從 3.10 版開始支持克隆的映像。

分層入門

Ceph 塊設備的分層是個簡單的過程。你必須有個映像、必須為它創建快照、並且必須保護快照,執行過這些步驟後,你才能克隆快照。

技術分享圖片

克隆出的映像包含對父快照的引用,也包含存儲池 ID 、映像 ID 和快照 ID 。包含存儲池 ID 意味著你可以把一個存儲池內的快照克隆到其他存儲池。

    映像模板: 塊設備分層的一個常見用法是創建一個主映像及其快照,並作為模板以供克隆。例如,用戶可以創建某一 Linux 發行版(如 Ubuntu 12.04 )的映像、並對其做快照。此用戶可能會周期性地更新映像、並創建新的快照(如在 rbd snap create 之後執行 sudo apt-get update 、 sudo apt-get upgrade 、 sudo apt-get dist-upgrade )。當映像成熟時,用戶可以克隆任意快照。
    擴展模板: 更高級的用法包括擴展映像模板,來提供比基礎映像更多的信息。例如,用戶可以克隆一個映像(如 VM 模板)、並安裝其它軟件(如數據庫、內容管理系統、分析系統等等),然後為此擴展映像做快照,做好的快照可以像基礎映像一樣進行更新。
    模板存儲池: 塊設備分層的一種用法是創建一個存儲池,存放作為模板的主映像和那些模板的快照。然後把只讀權限分給用戶,這樣他們就可以克隆快照了,而無需分配此存儲池的寫和執行權限。
    映像遷移/恢復: 塊設備分層的一種用法是把某一存儲池內的數據遷移或恢復到另一存儲池。

保護快照

克隆映像要訪問父快照。如果用戶不小心刪除了父快照,所有克隆映像都會損壞。為防止數據丟失,在克隆前必須先保護快照。

rbd snap protect {pool-name}/{image-name}@{snapshot-name}

例如:

rbd snap protect rbd/my-image@my-snapshot

你刪除不了受保護的快照。

克隆快照

要克隆快照,你得指定父存儲池、父映像名和快照,還有子存儲池和子映像名。克隆前必須先保護快照。

rbd clone {pool-name}/{parent-image}@{snap-name} {pool-name}/{child-image-name}

例如:

rbd clone rbd/my-image@my-snapshot rbd/new-image

你可以把某個存儲池中映像的快照克隆到另一存儲池。例如,你可以把某一存儲池中的只讀映像及其快照作為模板維護,把可寫克隆置於另一存儲池。

取消快照保護

刪除快照前,必須先取消保護。另外,你不可以刪除被克隆映像引用的快照,所以在你刪除快照前,必須先拍平( flatten )此快照的各個克隆。

rbd snap unprotect {pool-name}/{image-name}@{snapshot-name}

例如:

rbd snap unprotect rbd/my-image@my-snapshot

羅列快照的子孫

用下列命令羅列某個快照的子孫:

rbd children {pool-name}/{image-name}@{snapshot-name}

例如:

rbd children rbd/my-image@my-snapshot

拍平克隆映像

克隆出來的映像仍保留了對父快照的引用。要從子克隆刪除這些到父快照的引用,你可以把快照的信息復制給子克隆,也就是“拍平”它。拍平克隆映像的時間隨快照尺寸增大而增加。要刪除快照,必須先拍平子映像。


rbd flatten {pool-name}/{image-name}

例如:

rbd flatten rbd/my-image

因為拍平的映像包含了快照的所有信息,所以拍平的映像占用的存儲空間會比分層克隆要大。

三、RBD 鏡像

可以在兩個 Ceph 集群中異步備份 RBD images。該能力利用了 RBD image 的日誌特性,以確保集群間的副本崩潰一致性。鏡像功能需要在同伴集群( peer clusters )中的每一個對應的 pool 上進行配置,可設定自動備份某個存儲池內的所有 images 或僅備份 images 的一個特定子集。用 rbd 命令來配置鏡像功能。 rbd-mirror 守護進程負責從遠端集群拉取 image 的更新,並寫入本地集群的對應 image 中。

註意:

1.RBD 鏡像功能需要 Ceph Jewel 或更新的發行版本。

2.要使用 RBD 鏡像功能,你必須有 2 個 Ceph 集群, 每個集群都要運行 rbd-mirror 守護進程。

Ceph 塊設備