塊是一個字節序列(例如,一個 512 字節的數據塊)。基於塊的存儲接口是最多見的存儲數據方法,它們基於旋轉介質,像硬盤、 CD 、軟盤、甚至傳統的 9 磁道磁帶。無處不在的塊設備接口使虛擬塊設備成爲與 Ceph 這樣的海量存儲系統交互的理想之選。html
Ceph 塊設備是精簡配置的、大小可調且將數據條帶化存儲到集羣內的多個 OSD 。 Ceph 塊設備利用 RADOS 的多種能力,如快照、複製和一致性。 Ceph 的 RADOS 塊設備( RBD )使用內核模塊或 librbd 庫與 OSD 交互。node
注意:內核模塊可以使用 Linux 頁緩存。對基於 librbd 的應用程序, Ceph 可提供 RBD 緩存python
Ceph 塊設備靠無限伸縮性提供了高性能,如向內核模塊、或向 abbr:KVM (kernel virtual machines) (如 Qemu 、 OpenStack 和 CloudStack 等雲計算系統經過 libvirt 和 Qemu 可與 Ceph 塊設備集成)。你能夠用同一個集羣同時運行 Ceph RADOS 網關、 Ceph FS 文件系統、和 Ceph 塊設備。linux
注意:要使用 Ceph 塊設備,你必須有一個在運行的 Ceph 集羣。git
rbd 命令可用於建立、羅列、內省和刪除塊設備映像,也可克隆映像、建立快照、回滾快照、查看快照等等。 rbd 命令用法詳情見 RBD – 管理 RADOS 塊設備映像。github
Importantshell
要使用 Ceph 塊設備命令,你必須有對應集羣的訪問權限。數據庫
要想把塊設備加入某節點,你得先在 Ceph 存儲集羣中建立一個映像,使用下列命令:後端
rbd create --size {megabytes} {pool-name}/{image-name}
例如,要在 swimmingpool 這個存儲池中建立一個名爲 bar 、大小爲 1GB 的映像,執行:api
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 時(默認的),你必須指定用戶名或 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
由於拍平的映像包含了快照的全部信息,因此拍平的映像佔用的存儲空間會比分層克隆要大。
能夠在兩個 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 守護進程。
下面的程序說明了如何執行一些基本的管理工做,來用 rbd 命令配置鏡像功能。鏡像功能是在 Ceph 集羣內的存儲池級別上配置的。
配置存儲池的步驟須要在 2 個同伴集羣內都執行一遍。爲清楚起見,下面的步驟假定這兩個集羣分別叫作「本地(local)」和「遠端(remote)」,並且單主機對這 2 個集羣都擁有訪問權。
如何鏈接不一樣的 Ceph 集羣,詳情可參考 rbd 手冊頁。
在下面的例子中,集羣名稱和 Ceph 配置文件的名稱相同(好比 /etc/ceph/remote.conf)。可參考 ceph-conf 文檔來配置多集羣環境。
使用 rbd 啓用某個存儲池的鏡像功能,須要指定 mirror pool enable 命令,存儲池名和鏡像模式:
rbd mirror pool enable {pool-name} {mode}
鏡像模式能夠是 pool 或 image:
pool:當設定爲 pool 模式,存儲池中全部開啓了日誌特性的 images 都會被備份。
image:當設定爲 image 模式,須要對每一個 image 顯式啓用鏡像功能。
例如:
rbd --cluster local mirror pool enable image-pool pool
rbd --cluster remote mirror pool enable image-pool pool
使用 rbd 禁用某個存儲池的鏡像功能,須要指定 mirror pool disable 命令和存儲池名:
rbd mirror pool disable {pool-name}
當採用這種方式禁用某個存儲池的鏡像功能時,存儲池內的任一個 image 的鏡像功能也會被禁用,即便曾顯式啓用過。
例如: rbd --cluster local mirror pool disable image-pool rbd --cluster remote mirror pool disable image-pool
爲了使 rbd-mirror 守護進程發現它的同伴集羣,須要向存儲池註冊。使用 rbd 添加同伴 Ceph 集羣,須要指定 mirror pool peer add 命令、存儲池名和集羣說明:
rbd mirror pool peer add {pool-name} {client-name}@{cluster-name} 例如: rbd --cluster local mirror pool peer add image-pool client.remote@remote rbd --cluster remote mirror pool peer add image-pool client.local@local
使用 rbd 移除同伴 Ceph 集羣,指定 mirror pool peer remove 命令、存儲池名和同伴的 UUID(可經過 rbd mirror pool info 命令獲取):
rbd mirror pool peer remove {pool-name} {peer-uuid} 例如: rbd --cluster local mirror pool peer remove image-pool 55672766-c02b-4729-8567-f13a66893445 rbd --cluster remote mirror pool peer remove image-pool 60c0e299-b38f-4234-91f6-eed0a367be08
不一樣於存儲池配置,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 命令,存儲池名,image 名和特性名:
rbd feature enable {pool-name}/{image-name} {feature-name} 例如: rbd --cluster local feature enable image-pool/image-1 journaling
注意:
1.日誌特性依賴於獨佔鎖(exclusive-lock)特性。若是沒有啓用獨佔鎖,則必須在啓用日誌特性以前先啓用獨佔鎖。
2.你能夠經過在 Ceph 配置文件中增長 rbd default features = 125 ,使得全部新建 image 默認啓用日誌特性。
若是把某個存儲池的鏡像功能配置爲 image 模式,還須要對存儲池中的每個 image ,明確啓用鏡像功能。經過 rbd 啓用某個特定 image 的鏡像功能,要指定 mirror image enable 命令、存儲池名和 image 名:
rbd mirror image enable {pool-name}/{image-name} 例如: rbd --cluster local mirror image enable image-pool/image-1
經過 rbd 禁用某個特定 image 的鏡像功能,要指定 mirror image disable 命令、存儲池名和 image 名:
rbd mirror image disable {pool-name}/{image-name} 例如: rbd --cluster local mirror image disable image-pool/image-1
在須要把主名稱轉移到同伴 Ceph 集羣這樣一個故障切換場景中,應該中止全部對主 image 的訪問(好比關閉 VM 的電源或移除 VM 的相關驅動),當前的主 image 降級爲副,原副 image 升級爲主,而後在備份集羣上恢復對該 image 訪問。
Note
RBD 僅提供了一些必要的工具來幫助 image 有序的故障切換。還須要一種外部機制來協調整個故障切換流程(好比在降級以前關閉 image)。
經過 rbd 降級主 image,須要指定 mirror image demote 命令、存儲池名和 image 名:
rbd mirror image demote {pool-name}/{image-name} 例如: rbd --cluster local mirror image demote image-pool/image-1
經過 rbd 升級副 image,須要指定 mirror image promote 命令、存儲池名和 image 名:
rbd mirror image promote {pool-name}/{image-name} 例如: rbd --cluster remote mirror image promote image-pool/image-1
注意:
1.因爲主 / 副狀態是對於每一個 image 而言的,故可讓兩個集羣拆分 IO 負載來進行故障切換 / 故障自動恢復。
2.可使用 --force 選項來強制升級。當降級要求不能被正確傳播到同伴 Ceph 集羣的時候(好比 Ceph 集羣故障,通訊中斷),就須要強制升級。這會致使兩個集羣間的腦裂,並且在調用強制從新同步命令以前,image 將不會自動同步。
若是 rbd-daemon 探測到了腦裂事件,它在此狀況獲得糾正以前,是不會嘗試去備份受到影響的 image。爲了恢復對 image 的鏡像備份,首先斷定降級 image 已通過時,而後向主 image 請求從新同步。 經過 rbd 從新同步 image,須要指定 mirror image resync 命令、存儲池名和 image 名:
rbd mirror image resync {pool-name}/{image-name} 例如: rbd mirror image resync image-pool/image-1
此條 rbd 命令僅標記了某 image 須要從新同步。本地集羣的 rbd-mirror 守護進程會異步實施真正的從新同步過程。
有兩個 rbd-mirror 守護進程負責監控遠端同伴集羣的 image 日誌,並針對本地集羣進行日誌重放。RBD image 日誌特性會按發生的順序記錄下對該 image 的全部修改。這保證了遠端 image 的崩潰一致性鏡像在本地是可用的。
經過安裝可選發行包 rbd-mirror 來獲取 rbd-mirror 守護進程。
每個 rbd-mirror 守護進程須要同時鏈接本地和遠程集羣。
每一個 Ceph 集羣只能運行一個 rbd-mirror 守護進程。未來的 Ceph 發行版將會支持對 rbd-mirror 守護進程進行水平擴展
Ceph 塊設備最多見的用法之一是做爲虛擬機的塊設備映像。例如,用戶可建立一個安裝、配置好了操做系統和相關軟件的「黃金標準」映像,而後對此映像作快照,最後再克隆此快照(一般不少次)。詳情參見快照。能製做快照的寫時複製克隆意味着 Ceph 能夠快速地爲虛擬機提供塊設備映像,由於客戶端每次啓動一個新虛擬機時沒必要下載整個映像。
注意:
1.Ceph 塊設備能夠和 QEMU 虛擬機集成到一塊兒,關於 QEMU 可參考 QEMU 開源處理器仿真器,其文檔可參考 QEMU 手冊。關於如何安裝見安裝。
2.要讓 QEMU 使用 Ceph 塊設備,你必須有個運行着的 Ceph 集羣。
QEMU 命令行要求你指定 存儲池名和映像名,還能夠指定快照名。
QEMU 會假設 Ceph 配置文件位於默認位置(如 /etc/ceph/$cluster.conf ),而且你是以默認的 client.admin 用戶執行命令,除非你另外指定了其它 Ceph 配置文件路徑或用戶。指定用戶時, QEMU 只須要 ID 部分,無需完整地指定 TYPE:ID ,詳情見`用戶管理——用戶`_。不要在用戶 ID 前面加客戶端類型(即 client. ),不然會認證失敗。還應該把 admin 用戶、或者你用 :id={user} 選項所指定用戶的密鑰文件保存到默認路徑(即 /etc/ceph )或本地目錄內,並修正密鑰環文件的全部權和權限。命令格式以下:
qemu-img {command} [options] rbd:{pool-name}/{image-name}[@snapshot-name][:option1=value1][:option2=value2...]
例如,應該這樣指定 id 和 conf 選項:
qemu-img {command} [options] rbd:glance-pool/maipo:id=glance:conf=/etc/ceph/ceph.conf
注意:配置中的值若是包含這些字符: : 、 @ 、 = ,可在此符號前加反斜線 \ 轉義。
你能夠用 QEMU 建立塊設備映像。必須指定 rbd 、存儲池名、要建立的映像名以及映像尺寸。
qemu-img create -f raw rbd:{pool-name}/{image-name} {size}
例如:
qemu-img create -f raw rbd:data/foo 10G
注意:raw 數據格式是使用 RBD 時的惟一可用 format 選項。從技術上講,你可使用 QEMU 支持的其餘格式(例如 qcow2 或 vmdk),可是這樣作可能會帶來額外開銷,並且在開啓緩存(見下)模式下進行虛擬機的熱遷移時會致使卷的不安全性。
你能夠經過 QEMU 調整塊設備大小。必須指定 rbd 、存儲池名、要調整的映像名,還有映像尺寸。
qemu-img resize rbd:{pool-name}/{image-name} {size}
例如:
qemu-img resize rbd:data/foo 10G
你能夠用 QEMU 檢索塊設備映像信息。必須指定 rbd 、存儲池名和映像名。
qemu-img info rbd:{pool-name}/{image-name}
例如:
qemu-img info rbd:data/foo
QEMU 能把一主機上的塊設備傳遞給客戶機,但從 QEMU 0.15 起,不須要在主機上把映像映射爲塊設備了。 QEMU 如今能經過 librbd 直接把映像做爲虛擬塊設備訪問。這樣性能更好,由於它避免了額外的上下文切換,並且能利用開啓 RBD 緩存帶來的好處。
你能夠用 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
若是你的 QEMU 版本較老,你能夠用 ‘file’ 參數更改 librbd 緩存配置(就像其它 Ceph 配置選項同樣):
qemu -m 1024 -drive format=raw,file=rbd:data/squeeze:rbd_cache=true,cache=writeback
注意:若是你設置了 rbd_cache=true ,那就必須設置 cache=writeback, 不然有可能丟失數據。不設置 cache=writeback , QEMU 就不會向 librbd 發送回寫請求。若是 QEMU 退出時未清理乾淨, rbd 之上的文件系統就有可能崩潰。
從 Ceph 0.46 和 QEMU 1.1 起, Ceph 塊設備支持 discard 操做。這意味着客戶機能夠發送 TRIM 請求來讓 Ceph 塊設備回收未使用的空間。此功能可在客戶機上掛載 ext4 或 XFS 時加上 discard 選項。
客戶機要想使用此功能,必須對塊設備顯式啓用。爲此,你必須在相關驅動器上指定 discard_granularity :
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 驅動不支持 discard 。
若是用的是 libvirt ,須要用 virsh edit 編輯配置文件,加上 xmlns:qemu 值。而後加一個 qemu:commandline 塊做爲那個域的子域。下例展現瞭如何用 qemu id= 爲兩個設備設置不一樣的 discard_granularity 值。
<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>
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 庫是管理程序和軟件應用間的一個虛擬機抽象層。經過 libvirt ,開發者和系統管理員只須要關注這些管理器的一個通用管理框架、通用 API 、和通用 shell 接口(即 virsh )便可,包括:
QEMU/KVM
XEN
LXC
VirtualBox
等等
Ceph 塊設備支持 QEMU/KVM ,因此你能夠經過能與 libvirt 交互的軟件來使用 Ceph 塊設備。下面的堆棧圖解釋了 libvirt 和 QEMU 如何經過 librbd 使用 Ceph 塊設備。
libvirt 常見於爲雲解決方案提供 Ceph 塊設備,像 OpenStack 、 ClouldStack 。它們用 libvirt 和 QEMU/KVM 交互、 QEMU/KVM 再經過 librbd 與 Ceph 塊設備交互。詳情見塊設備與 OpenStack 和塊設備與 CloudStack 。關於如何安裝見安裝。
你也能夠經過 libvirt 、 virsh 和 libvirt API 使用 Ceph 塊設備,詳情見 libvirt 虛擬化 API 。
要建立使用 Ceph 塊設備的虛擬機,請參照下文中的步驟。在示範性實施例中,咱們用 libvirt-pool 做爲存儲池名、 client.libvirt 做爲用戶名、 new-libvirt-image 做爲映像名。你能夠任意命名,但請確保在後續過程當中用本身的名字替換掉對應名字。
配置 Ceph 用於 libvirt ,執行下列步驟:
1.建立——存儲池(或者用默認的)。本例用 libvirt-pool 做存儲池名,設定了 128 個歸置組。
ceph osd pool create libvirt-pool 128 128
驗證存儲池是否存在。
ceph osd lspools
2.建立—— Ceph 用戶( 0.9.7 及以前的版本用 client.admin ),本例用 client.libvirt 、且權限限制到 libvirt-pool 。
ceph auth get-or-create client.libvirt mon 'allow r' osd 'allow class-read object_prefix rbd_children, allow rwx pool=libvirt-pool'
驗證名字是否存在。
ceph auth list
注:libvirt 訪問 Ceph 時將用 libvirt 做爲 ID ,而不是 client.libvirt 。關於 ID 和名字不一樣之處的詳細解釋請參考用戶管理——用戶和用戶管理——命令行界面。
3.用 QEMU 在 RBD 存儲池中建立映像。本例中映像名爲 new-libvirt-image 、存儲池爲 libvirt-pool 。
qemu-img create -f rbd rbd:libvirt-pool/new-libvirt-image 2G
驗證映像是否存在。
rbd -p libvirt-pool ls
注:你也能夠用 rbd create 建立映像,但咱們建議使用示例中的命令,來順便確認 QEMU 可正常運行。
要用 virt-manager 建立 VM ,請按下列步驟:
1.點擊 Create New Virtual Machine 按鈕。
2.命名新虛擬機的域,本例中咱們用 libvirt-virtual-machine 。你能夠任意命名,但請在後續命令行和配置實例中替換 libvirt-virtual-machine 爲你本身選擇的名字。
libvirt-virtual-machine
3.導入映像。
/path/to/image/recent-linux.img
注:請導入一個較新的映像。一些較老的映像未必能正確地重掃虛擬設備。
4.配置並啓動 VM 。
5.能夠用 virsh list 驗證 VM 域是否存在。
sudo virsh list
6.登入 VM ( root/root )
7.在修改配置讓它使用 Ceph 前,請先中止 VM 。
配置 VM 使用 Ceph 時,切記儘可能用 virsh 。另外, virsh 命令一般須要 root 權限(如 sudo ),不然不會返回正確結果或提示你須要 root 權限。 virsh 命令參考見 Virsh 命令參考。
1.用 virsh edit 打開配置文件。
sudo virsh edit {vm-domain-name}
<devices> 下應該有 <disk> 條目。
<devices> <emulator>/usr/bin/kvm</emulator> <disk type='file' device='disk'> <driver name='qemu' type='raw'/> <source file='/path/to/image/recent-linux.img'/> <target dev='vda' bus='virtio'/> <address type='drive' controller='0' bus='0' unit='0'/> </disk>
用你的 OS 映像路徑替換 /path/to/image/recent-linux.img 。使用較快的 virtio 總線的最低內核版本是 2.6.25 ,參見 Virtio 。
重要:要用 sudo virsh edit 而非文本編輯器,若是你用文本編輯器編輯了 /etc/libvirt/qemu 下的配置文件, libvirt 未必能識別出這些更改。若是 /etc/libvirt/qemu 下的 XML 文件和 sudo virsh dumpxml {vm-domain-name} 輸出結果內容不一樣, VM 可能會運行異常。
2.把你建立的 Ceph RBD 映像建立爲 <disk> 條目。
<disk type='network' device='disk'> <source protocol='rbd' name='libvirt-pool/new-libvirt-image'> <host name='{monitor-host}' port='6789'/> </source> <target dev='vda' bus='virtio'/> </disk>
用你的主機名替換 {monitor-host} ,可能還要替換存儲池和/或映像名。你能夠爲 Ceph monitor 添加多條 <host> , dev 屬性是將出如今 VM /dev 目錄下的邏輯設備名。可選的 bus 屬性是要模擬的磁盤類型,有效的設定值是驅動類型,如 ide 、 scsi 、 virtio 、 xen 、 usb 或 sata 。關於 <disk> 標籤及其子標籤和屬性,詳見硬盤。
3.保存文件。
4.若是你的 Ceph 存儲集羣啓用了 Ceph 認證(默認已啓用),那麼必須生成一個 secret。
cat > secret.xml <<EOF <secret ephemeral='no' private='no'> <usage type='ceph'> <name>client.libvirt secret</name> </usage> </secret> EOF
5.定義 secret。
sudo virsh secret-define --file secret.xml
<uuid of secret is output here>
6.獲取 client.libvirt 密鑰並把字符串保存於文件。
ceph auth get-key client.libvirt | sudo tee client.libvirt.key
7.設置 secret 的 UUID 。
sudo virsh secret-set-value --secret {uuid of secret} --base64 $(cat client.libvirt.key) && rm client.libvirt.key secret.xml
還必須手動設置 secret,把下面的 <auth> 條目添加到前面的 <disk> 標籤內(用上一命令的輸出結果替換掉 uuid 值)。
sudo virsh edit {vm-domain-name}
而後,把 <auth></auth> 標籤加進域配置文件:
... </source> <auth username='libvirt'> <secret type='ceph' uuid='9ec59067-fdbc-a6c0-03ff-df165c0587b8'/> </auth> <target ...
注:示例 ID 是 libvirt ,不是第 2 步配置 Ceph 生成的 Ceph 名 client.libvirt 。確保你用的是 Ceph 名的 ID 部分。若是出於某些緣由你須要更換 secret,必須先執行 sudo virsh secret-undefine {uuid} ,而後再執行 sudo virsh secret-set-value 。
一旦完成上面的配置,你就能夠啓動 VM 了。爲確認 VM 和 Ceph 在通訊,你能夠執行以下過程。
1.檢查 Ceph 是否在運行:
ceph health
2.檢查 VM 是否在運行。
sudo virsh list
3.檢查 VM 是否在和 Ceph 通訊,用你的 VM 域名字替換 {vm-domain-name} :
sudo virsh qemu-monitor-command --hmp {vm-domain-name} 'info block'
4.檢查一下 <target dev='hdb' bus='ide'/> 定義的設備是否出如今 /dev 或 /proc/partitions 裏。
ls dev
cat proc/partitions
若是看起來一切正常,你就能夠在虛擬機內使用 Ceph 塊設備了。
經過 libvirt 你能夠把 Ceph 塊設備用於 OpenStack ,它配置了 QEMU 到 librbd 的接口。 Ceph 把塊設備映像條帶化爲對象並分佈到集羣中,這意味着大容量的 Ceph 塊設備映像其性能會比獨立服務器更好。
要把 Ceph 塊設備用於 OpenStack ,必須先安裝 QEMU 、 libvirt 和 OpenStack 。咱們建議用一臺獨立的物理主機安裝 OpenStack ,此主機最少需 8GB 內存和一個 4 核 CPU 。下面的圖表描述了 OpenStack/Ceph 技術棧。
注意:要讓 OpenStack 使用 Ceph 塊設備,你必須有相應的 Ceph 集羣訪問權限。
OpenStack 裏有三個地方能夠和 Ceph 塊設備結合:
Images: OpenStack 的 Glance 管理着 VM 的 image 。Image 相對恆定, OpenStack 把它們看成二進制文件、並以此格式下載。 Volumes: Volume 是塊設備, OpenStack 用它們引導虛擬機、或掛載到運行中的虛擬機上。 OpenStack 用 Cinder 服務管理 Volumes 。 Guest Disks: Guest disks 是裝有客戶操做系統的磁盤。默認狀況下,啓動一臺虛擬機時,
它的系統盤表現爲 hypervisor 文件系統的一個文件(一般位於 /var/lib/nova/instances/<uuid>/)。
在 Openstack Havana 版本前,在 Ceph 中啓動虛擬機的惟一方式是使用 Cinder 的 boot-from-volume 功能.
不過,如今可以在 Ceph 中直接啓動虛擬機而不用依賴於 Cinder,這一點是十分有益的,由於能夠經過熱遷移更方便地進行維護操做。
另外,若是你的 hypervisor 掛掉了,也能夠很方便地觸發 nova evacuate ,而且幾乎能夠無縫遷移虛擬機到其餘地方。
你能夠用 OpenStack Glance 把 image 存儲到 Ceph 塊設備中,還可使用 Cinder 經過 image 的寫時複製克隆來啓動虛擬機。
下面將詳細指導你配置 Glance 、 Cinder 和 Nova ,雖然它們不必定一塊兒用。你能夠在本地硬盤上運行 VM 、卻把 image 存儲於 Ceph 塊設備,反之亦可。
注意:Ceph 不支持 QCOW2 格式的虛擬機磁盤,因此,若是想要在 Ceph 中啓動虛擬機( 臨時後端或者從卷啓動),Glance 鏡像必須是 RAW 格式。
默認狀況下, Ceph 塊設備使用 rbd 存儲池。你能夠用任何可用存儲池。建議爲 Cinder 和 Glance 單首創建池。確保 Ceph 集羣在運行,而後建立存儲池。
ceph osd pool create volumes 128 ceph osd pool create images 128 ceph osd pool create backups 128 ceph osd pool create vms 128
參考建立存儲池爲存儲池指定歸置組數量,參考歸置組肯定應該爲存儲池設定多少歸置組。
運行着 glance-api 、 cinder-volume 、 nova-compute 或 cinder-backup 的主機被看成 Ceph 客戶端,它們都須要 ceph.conf 文件。
ssh {your-openstack-server} sudo tee /etc/ceph/ceph.conf </etc/ceph/ceph.conf
在運行 glance-api 的節點上你須要 librbd 的 Python 綁定:
sudo yum install python-rbd
在 nova-compute 、 cinder-backup 和 cinder-volume 節點上,要安裝 Python 綁定和客戶端命令行工具:
sudo yum install ceph
若是你啓用了 cephx 認證,須要分別爲 Nova/Cinder 和 Glance 建立新用戶。命令以下:
ceph auth get-or-create client.cinder mon 'allow r' osd 'allow class-read object_prefix rbd_children, allow rwx pool=volumes, allow rwx pool=vms, allow rx pool=images' ceph auth get-or-create client.glance mon 'allow r' osd 'allow class-read object_prefix rbd_children, allow rwx pool=images' ceph auth get-or-create client.cinder-backup mon 'allow r' osd 'allow class-read object_prefix rbd_children, allow rwx pool=backups'
把 client.cinder 、 client.glance 和 client.cinder-backup 的密鑰環複製到適當的節點,並更改全部權:
ceph auth get-or-create client.glance | ssh {your-glance-api-server} sudo tee /etc/ceph/ceph.client.glance.keyring ssh {your-glance-api-server} sudo chown glance:glance /etc/ceph/ceph.client.glance.keyring ceph auth get-or-create client.cinder | ssh {your-volume-server} sudo tee /etc/ceph/ceph.client.cinder.keyring ssh {your-cinder-volume-server} sudo chown cinder:cinder /etc/ceph/ceph.client.cinder.keyring ceph auth get-or-create client.cinder-backup | ssh {your-cinder-backup-server} sudo tee /etc/ceph/ceph.client.cinder-backup.keyring ssh {your-cinder-backup-server} sudo chown cinder:cinder /etc/ceph/ceph.client.cinder-backup.keyring
運行 nova-compute 的節點,其進程須要密鑰環文件:
ceph auth get-or-create client.cinder | ssh {your-nova-compute-server} sudo tee /etc/ceph/ceph.client.cinder.keyring
還得把 client.cinder 用戶的密鑰存進 libvirt 。 libvirt 進程從 Cinder 掛載塊設備時要用它訪問集羣。
在運行 nova-compute 的節點上建立一個密鑰的臨時副本:
ceph auth get-key client.cinder | ssh {your-compute-node} tee client.cinder.key
而後,在計算節點上把密鑰加進 libvirt 、而後刪除臨時副本:
uuidgen 457eb676-33da-42ec-9a8c-9293d545c337 cat > secret.xml <<EOF <secret ephemeral='no' private='no'> <uuid>457eb676-33da-42ec-9a8c-9293d545c337</uuid> <usage type='ceph'> <name>client.cinder secret</name> </usage> </secret> EOF sudo virsh secret-define --file secret.xml Secret 457eb676-33da-42ec-9a8c-9293d545c337 created sudo virsh secret-set-value --secret 457eb676-33da-42ec-9a8c-9293d545c337 --base64 $(cat client.cinder.key) && rm client.cinder.key secret.xml
保留密鑰的 uuid ,稍後配置 nova-compute 時要用。
注意:全部計算節點上的 UUID 不必定非要同樣。但考慮到平臺的一致性, 最好使用同一個 UUID 。
Glance 可以使用多種後端存儲 image 。要讓它默認使用 Ceph 塊設備,按以下配置 Glance 。
編輯 /etc/glance/glance-api.conf 並把下列內容加到 [DEFAULT] 段下:
default_store = rbd rbd_store_user = glance rbd_store_pool = images rbd_store_chunk_size = 8
編輯 /etc/glance/glance-api.conf 並把下列內容加到 [glance_store] 段下:
[DEFAULT] ... default_store = rbd ... [glance_store] stores = rbd rbd_store_pool = images rbd_store_user = glance rbd_store_ceph_conf = /etc/ceph/ceph.conf rbd_store_chunk_size = 8
關於 Glance 裏可用的其它配置選項見 http://docs.openstack.org/trunk/config-reference/content/section_glance-api.conf.html。
注意:Glance 還沒徹底遷移到 ‘store’ ,因此咱們還得在 DEFAULT 段下配置 store 。
若是你想容許使用 image 的寫時複製克隆,再添加下列內容到 [DEFAULT] 段下:
show_image_direct_url = True
注意,這會經過 Glance API 暴露後端存儲位置,因此此選項啓用時 endpoint 不該該被公開訪問。
禁用 Glance 緩存管理,以避免 image 被緩存到 /var/lib/glance/image-cache/ 下,假設你的配置文件裏有 flavor = keystone+cachemanagement :
[paste_deploy]
flavor = keystone
建議配置以下 image 屬性:
hw_scsi_model=virtio-scsi: 添加 virtio-scsi 控制器以得到更好的性能、並支持 discard 操做; hw_disk_bus=scsi: 把全部 cinder 塊設備都連到這個控制器; hw_qemu_guest_agent=yes: 啓用 QEMU guest agent (訪客代理) os_require_quiesce=yes: 經過 QEMU guest agent 發送 fs-freeze/thaw 調用
OpenStack 須要一個驅動和 Ceph 塊設備交互。還得指定塊設備所在的存儲池名。編輯 OpenStack 節點上的 /etc/cinder/cinder.conf ,添加:
[DEFAULT] ... enabled_backends = ceph ... [ceph] volume_driver = cinder.volume.drivers.rbd.RBDDriver rbd_pool = volumes rbd_ceph_conf = /etc/ceph/ceph.conf rbd_flatten_volume_from_snapshot = false rbd_max_clone_depth = 5 rbd_store_chunk_size = 4 rados_connect_timeout = -1 glance_api_version = 2
若是你使用了 cephx 認證,還須要配置用戶及其密鑰(前述文檔中存進了 libvirt )的 uuid :
[ceph] ... rbd_user = cinder rbd_secret_uuid = 457eb676-33da-42ec-9a8c-9293d545c337
注意若是你爲 cinder 配置了多後端, [DEFAULT] 節中必須有 glance_api_version = 2 。
OpenStack 的 Cinder Backup 須要一個特定的守護進程,不要忘記安裝它。編輯 Cinder Backup 節點的 /etc/cinder/cinder.conf 添加:
backup_driver = cinder.backup.drivers.ceph backup_ceph_conf = /etc/ceph/ceph.conf backup_ceph_user = cinder-backup backup_ceph_chunk_size = 134217728 backup_ceph_pool = backups backup_ceph_stripe_unit = 0 backup_ceph_stripe_count = 0 restore_discard_excess_bytes = true
爲了掛載 Cinder 塊設備(塊設備或者啓動卷),必須告訴 Nova 掛載設備時使用的用戶和 uuid 。libvirt會使用該用戶來和 Ceph 集羣進行鏈接和認證。
rbd_user = cinder
rbd_secret_uuid = 457eb676-33da-42ec-9a8c-9293d545c337
這兩個標誌一樣用於 Nova 的臨時後端。
要讓全部虛擬機直接從 Ceph 啓動,必須配置 Nova 的臨時後端。
建議在 Ceph 配置文件裏啓用 RBD 緩存(從 Giant 起默認啓用)。另外,啓用管理套接字對於故障排查來講大有好處,給每一個使用 Ceph 塊設備的虛擬機分配一個套接字有助於調查性能和/或異常行爲。
能夠這樣訪問套接字:
ceph daemon /var/run/ceph/ceph-client.cinder.19195.32310016.asok help
編輯全部計算節點上的 Ceph 配置文件:
[client] rbd cache = true rbd cache writethrough until flush = true admin socket = /var/run/ceph/guests/$cluster-$type.$id.$pid.$cctid.asok log file = /var/log/qemu/qemu-guest-$pid.log rbd concurrent management ops = 20
調整這些路徑的權限:
mkdir -p /var/run/ceph/guests/ /var/log/qemu/ chown qemu:libvirtd /var/run/ceph/guests /var/log/qemu/
要注意, qemu 用戶和 libvirtd 組可能因系統不一樣而不一樣,前面的實例基於 RedHat 風格的系統。
注意:若是你的虛擬機已經跑起來了,重啓一下就能獲得套接字。
Havana 和 Icehouse 須要補丁來實現寫時複製克隆、修復 rbd 臨時磁盤的鏡像大小和熱遷移中的缺陷。這些補丁可從基於 Nova stable/havana 和 stable/icehouse 的分支中獲取。雖不是強制性的,但**強烈建議**使用這些補丁,以便能充分利用寫時複製克隆功能的優點。
編輯全部計算節點上的 /etc/nova/nova.conf 文件,添加:
libvirt_images_type = rbd libvirt_images_rbd_pool = vms libvirt_images_rbd_ceph_conf = /etc/ceph/ceph.conf libvirt_disk_cachemodes="network=writeback" rbd_user = cinder rbd_secret_uuid = 457eb676-33da-42ec-9a8c-9293d545c337
禁用文件注入也是一個好習慣。啓動一個實例時, Nova 一般試圖打開虛擬機的根文件系統。而後, Nova 會把好比密碼、 ssh 密鑰等值注入到文件系統中。然而,最好依賴元數據服務和 cloud-init 。
編輯全部計算節點上的 /etc/nova/nova.conf 文件,添加:
libvirt_inject_password = false libvirt_inject_key = false libvirt_inject_partition = -2
爲確保熱遷移能順利進行,要使用以下標誌:
libvirt_live_migration_flag="VIR_MIGRATE_UNDEFINE_SOURCE,VIR_MIGRATE_PEER2PEER,VIR_MIGRATE_LIVE,VIR_MIGRATE_PERSIST_DEST,VIR_MIGRATE_TUNNELLED"
在 Juno 版中, Ceph 塊設備移到了 [libvirt] 段下。編輯全部計算節點上的 /etc/nova/nova.conf 文件,在 [libvirt] 段下添加:
[libvirt] images_type = rbd images_rbd_pool = vms images_rbd_ceph_conf = /etc/ceph/ceph.conf rbd_user = cinder rbd_secret_uuid = 457eb676-33da-42ec-9a8c-9293d545c337 disk_cachemodes="network=writeback"
禁用文件注入也是一個好習慣。啓動一個實例時, Nova 一般試圖打開虛擬機的根文件系統。而後, Nova 會把好比密碼、 ssh 密鑰等值注入到文件系統中。然而,最好依賴元數據服務和 cloud-init 。
編輯全部計算節點上的 /etc/nova/nova.conf 文件,在 [libvirt] 段下添加:
inject_password = false inject_key = false inject_partition = -2
爲確保熱遷移能順利進行,要使用以下標誌(在 [libvirt] 段下):
live_migration_flag="VIR_MIGRATE_UNDEFINE_SOURCE,VIR_MIGRATE_PEER2PEER,VIR_MIGRATE_LIVE,VIR_MIGRATE_PERSIST_DEST,VIR_MIGRATE_TUNNELLED"
爲虛擬機的臨時根磁盤啓用 discard 功能:
[libvirt]
...
...
hw_disk_discard = unmap # 啓用 discard 功能(注意性能)
在基於 Red Hat 的系統上執行:
sudo service openstack-glance-api restart sudo service openstack-nova-compute restart sudo service openstack-cinder-volume restart sudo service openstack-cinder-backup restart
一旦 OpenStack 啓動並運行正常,應該就能夠建立卷並用它啓動虛擬機了。
你能夠用 Cinder 命令行工具從弄個 image 建立卷:
cinder create --image-id {id of image} --display-name {name of volume} {size of volume}
注意 image 必須是 RAW 格式,你能夠用 qemu-img 轉換格式,如:
qemu-img convert -f {source-format} -O {output-format} {source-filename} {output-filename}
qemu-img convert -f qcow2 -O raw precise-cloudimg.img precise-cloudimg.raw
Glance 和 Cinder 都使用 Ceph 塊設備,此鏡像又是個寫時複製克隆,就能很是快地建立一個新卷。在 OpenStack 操做面板裏就能從那個啓動虛擬機,步驟以下:
啓動新實例。 選擇與寫時複製克隆關聯的 image 。 選擇 ‘boot from volume’ 。 選擇你剛建立的卷。