Ceph塊設備
來自這里。
塊是一個字節序列(例如,一個512字節的數據塊)。基於塊的存儲接口是最常見的存儲數據的方法,它通常基於旋轉介質,像硬盤、CD、軟盤,甚至傳統的9道磁帶。
基本的塊設備命令
rbd命令可以讓你創建、羅列、審查和刪除塊設備image。你也可以用它來克隆image、創建快照、回滾快照、查看快照等。關於rbd命令使用細節,可查看RBD - Manage RADOS Block Device(RBD) Images來了解詳情。
創建塊設備資源池
- 在管理節點,使用ceph工具創建一個資源池。
- 在管理節點,使用rbd工具RBD來初始化資源池:
rbd pool init <pool-name>
創建塊設備用戶
除非另有說明,否則rbd命令將使用管理員ID訪問Ceph集群。此ID允許對集群進行完全的管理訪問。建議盡可能使用限制更嚴格的用戶。
創建Ceph用戶,可以使用Ceph命令auth get-or-create,需要提供用戶名稱、監視器和OSD:
ceph auth get-or-create client.{ID} mon 'profile rbd' osd 'profile {profile name} [pool={pool-name}] [, profile ...]'
例如,創建一個命名稱為qemu用戶ID,擁有讀寫權限訪問vms資源池,只讀images資源池,執行下列命令:
ceph auth get-or-create client.qemu mon 'profile rbd' osd 'profile rbd pool=vms,profile rbd-read-only pool=images'
ceph auth get-or-create 命令的輸出是新增用戶的密鑰環,可以寫入到/etc/ceph/cepn.client.{ID}.keyring文件中。
創建塊設備image
在你將塊設備掛載到節點之前,你必須先在Ceph存儲集群中創建一個image。可以使用以下命令創建塊設備image:
rbd create --size {megabytes} {pool-name}/{image-name}
例如,在名稱為swimmingpool的資源池中創建一個名稱為bar的1Gimage來存儲消息,執行以下命令:
rbd create --size 1024 swimmingpool/bar
如果在創建image時你不指明資源池,image將被存儲在默認的資源池rbd中。例如,在默認的資源池rbd中創建一個名稱為foo的1G大小的image:
rbd create --size 1024 foo
羅列塊設備image
羅列rbd資源池中的塊設備image,可以執行以下命令:
rbd ls
羅列指定資源池中的塊設備image,可以執行以下命令,但需要將{poolname}替換為指定的資源池名稱:
rbd ls {poolname}
例如:
rbd ls swimmingpool
羅列rbd資源池回收站中的待刪除的塊設備,執行以下命令:
rbd trash ls
羅列指定資源池回收站中待刪除的塊設備,可以執行以下命令,但需要將{poolname}替換為指定的資源池名稱:
rbd trash ls {poolname}
例如:
rbd trash ls swimming
檢索image信息
檢索指定image的信息,可以執行以下命令,但需要將{image-name}替換為指定的image名稱:
rbd info {image-name}
例如:
rbd info foo
檢索指定資源池中image的信息,可以執行以下命令,但需要將{image-name}替換成image名稱,{pool-name}替換成資源池名稱:
rbd info {pool-name}/{image-name}
例如:
rbd info swimmingpool/bar
重置塊設備image大小
Ceph塊設備是精簡配置的。在你開始在其上保存數據之前它們不會占用任何物理存儲。但是它們確實具有你使用--size操作指定的最大容量。如果你想增加(或者減小)Ceph塊設備的最大尺寸,可以執行以下命令:
rbd resize --size 2048 foo (to increase)
rbd resize --size 2048 foo --allow-shrink (to decrease)
刪除塊設備image
刪除塊設備image,可以使用以下命令,但需要將{image-name}替換為你想要刪除的image名稱:
rbd rm {image-name}
例如:
rbd rm foo
刪除指定資源池中的塊設備,可以執行以下命令,但需要將{image-name}替換成你想要刪除的image名稱,{pool-name}替換成資源池名稱:
rbd rm {pool-name}/{image-name}
例如:
rbd rm swimming/bar
要從資源池回收站中移除塊設備,可以執行以下命令,但需要將{image-name}替換成你想要刪除的image名稱,{pool-name}替換成資源池名稱:
rbd trash mv {pool-name}/{image-name}
例如:
rbd trash mv swimming/bar
要從資源池回收站中刪除塊設備,可以執行以下命令,但需要將{image-id}替換成你想要刪除的image的id,{pool-name}替換成資源池名稱:
rbd trash rm {pool-name}/{image-id}
例如:
rbd trash rm swimming/2bf4474bodc51
Note:
· 你可以將image移動到回收站中,即使它擁有快照或其副本正在使用中,但是不能將它從回收站中刪除。
· 你可以使用 --expires-at 來設置滯留時間(默認為當前時間),如果尚未到達滯留時間,除非你使用 --force,否則它不會被刪除
恢復塊設備image
恢復rbd資源池中待刪除的塊設備,可以使用以下命令,但需要將{image-id}替換為imageid:
rbd trash restore {image-id}
例如:
rbd trash restore 2bf4474b0dc51
恢復指定資源池中待刪除的塊設備,可以使用以下命令,但需要將{image-id}替換為imageid,{pool-name}替換為資源池名稱:
rbd trash restore {pool-name}/{image-id}
例如:
rbd trash restore swimming/2bf4474b0dc51
你也可以恢復image時使用 --image 來重命名稱它:
例如:
rbd trash restore swimming/2bf4474b0dc51 --image new-name
塊設備操作
快照
快照是指定時間點image狀態的一種只讀拷貝。Ceph塊設備的一種高級操作是你可以闖將一個image的快照來保存image狀態的歷史記錄。Ceph還支持快照分層,允許你快速輕松地克隆image(例如,VMimage)。Ceph使用rbd命令和更高級的接口,包括QEMU,libvirt,OpenStack和CloudStack,來支持快照。
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]
快照基本操作
接下來介紹如何在命令行下使用rbd命令來創建、羅列和刪除快照。
創建快照
使用rbd創建快照,snap create額外選項包括資源池名稱和image名稱。
rbd snap create {pool-name}/{image-name}@{snap-name}
例如:
rbd snap create rbd/foo@snamname
羅列快照
要羅列image的快照,需要額外指定資源池名稱和image名稱:
rbd snap ls {pool-name}/{image-name}
例如:
rbd snap ls rbd/foo
回滾快照
使用rbd回滾快照,snap rollback操作需要額外指明資源池名稱、image名稱和快照名稱:
rbd snap rollback {pool-name}/{image-name}@{snap-name}
例如:
rbd snap rollback rbd/foo@snapname
刪除快照
使用rbd刪除快照,snap rm操作需要額外指明資源池名稱、image名稱和快照名稱:
rbd snap rm {pool-name}/{image-name}@{snap-name}
例如:
rbd snap rm rbd/foo@snapname
清空快照
使用rbd刪除image的所有快照,snap purge操作需要額外指明資源池名稱、image名稱:
rbd snap purge {pool-name}/{image-name}
例如:
rbd snap purge rbd/foo
分層
Ceph支持創建多個塊設備快照的寫時復制克隆。快照分層可以使Ceph塊設備客戶端快速地創建image。例如,你可以創建一個寫有Linux VM的塊設備image;然后,快照image,保護快照,創建任意數量的寫時復制克隆體。因為快照是只讀的,克隆快照簡化了語義,使得快速創建克隆體成為可能。

每個克隆的image(子)都存儲着父image的引用,這使得克隆的image可以打開父快照並讀取它。
快照的寫時復制克隆行為跟其它的Ceph塊設備image一樣。你可以讀、寫、克隆和重設克隆的image的大小。克隆的image沒有特殊的限制。然而,快照的寫時復制克隆指的是快照,所以在你克隆快照之前你必須保護它。下面的示意圖描述的就是這個過程。
分層入門
Ceph塊設備分層是個簡單的操作。你必須有一個image,必須創建這個image的快照,必須保護這個快照。一旦已完成了這些步驟,你就可以開始克隆快照了。

克隆的image保留了父快照的引用,並包含了資源池ID、imageID和快照ID。包含資源池ID意味着可以將快照從一個資源池克隆到另一個資源池中的image。
-
Image Template:塊設備分層的一個常見的使用場景是創建一個主image和一個快照,作為克隆的模板。例如,用戶可能創建一個Linux發行版(例如,Ubuntu 12.04)的image,並為它創建快照。用戶可能會周期性地更新image並創建新的快照(例如,
sudo apt-get update,sudo apt-get upgrade,sudo apt-get dist-upgrade之后使用rbd snap create創建新的快照)。隨着image的完善,用戶可以克隆快照中的任何一個。 -
Extended Template:更高級的使用場景是包含擴展模板image,提供比基礎image更多的信息。例如,用戶可能克隆一個image(例如,VM模板)並且安裝其它的軟件(例如,數據庫,內容管理系統,分析系統),然后快照擴展后的image,它本身可以像基礎image一樣被更新。
-
Template Pool:使用塊設備分層的一個方法是創建一個資源池,其中包括作為模板的主image以及那些模板的快照。然后你可以將制度權限擴展到其他用戶,這樣他們就可以克隆快照,但不能在資源池中寫入和執行。
-
Image Migration/Recovery:使用塊設備分層的一個方法從一個資源池遷移或恢復到另一個資源池。
保護快照
克隆體可以訪問父快照。如果用戶不小心刪除了父快照,那么所有的克隆體都將損壞。為了防止數據丟失,在你克隆快照前你必須保護它。
rbd snap protect {pool-name}/{image-name}@{snapshot-name}
例如:
rbd snap protect rbd/my-image@my-snapshot
克隆快照
要克隆快照,你需要額外說明的信息有父資源池、image和快照,以及子資源池和image名稱稱。在你克隆快照之前你必須先保護它。
rbd clone {pool-name}/{parent-image}@{snap-name} {pool-name}/{child-image-name}
例如:
rbd clone rbd/my-image@my-snapshot rbd/new-image
解保快照
在你刪除快照之前,你必選先接觸保護。另外,你不能刪除具有克隆體引用的快照。在你刪除快照之前,你必須平整該快照的所有克隆。
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 childre rbd/my-image@my-snapshot
平整克隆的image
克隆的image保留了到父快照的引用。當你移除子克隆體到父快照的引用時,通過從快照拷貝信息到克隆體,你可以高效地“平整”image。平整image花費的時間隨着快照體積的增大而增大。要想刪除快照,你必須先平整它的子image。
rbd flatten {pool-name}/{image-name}
例如:
rbd flatten rbd/new-image
RBD 鏡像
RBDimage可以在兩個Ceph集群間異步備份。該能力利用了RBD日志image特性來保證集群間的crash-consistent復制。鏡像功能需要在同伴集群中的每一個對應的pool上進行配置,可設定自動備份某個存儲池內的所有images或僅備份images的一個特定子集。用rbd命令來配置鏡像功能。rbd-mirror守護進程負責從遠端集群拉取image的更新,並寫入本地集群的對應image中。
根據復制的需要,RBD鏡像可以配置為單向或者雙向復制:
- 單向復制:當數據僅從主集群鏡像到從集群時,rbd-mirror守護進程只運行在從集群。
- 雙向復制:當數據從一個集群上的主映像鏡像到另一個集群上的非主映像(反之亦然)時,rd -mirror守護進程在兩個集群上運行。
資源池配置
下面的程序說明如何使用rbd命令執行基本的管理任務來配置鏡像功能。鏡像功能需要在同伴集群中的每一個對應的pool上進行配置。
資源池的配置操作應在所有的同伴集群上執行。為了清晰起見,這些過程假設可以從單個主機訪問兩個集群,分別稱為“local”和“remote”。
有關如何連接到不同Ceph集群的詳細信息,請參閱rbd手冊頁。
啟用鏡像功能
使用rbd啟用鏡像,需要mirror pool enable命令,指明資源池名稱和鏡像模式:
rbd mirror pool enable {pool-name} {mode}
鏡像模式可以是pool或image:
- pool:當配置為pool模式時,帶有日志特性的資源池中的所有image都將被鏡像。
- image:當配置為image模式時,每個image的鏡像功能都需要被顯示啟用。
例如:
$ rbd --cluster local mirror pool enable image-pool pool
$ rbd --cluster remote mirror pool enabel image-pool pool
禁用鏡像
使用rbd禁用鏡像,需要額外的mirror pool disable命令和資源池名稱:
rbd mirror pool disable {pool-name}
以這種方式在池上禁用鏡像時,對於已明確啟用鏡像的任何映像(池內),也將禁用鏡像。
例如:
$ rbd --cluster local mirror pool disable image-pool
$ rbd --cluster remote mirror pool disable image-pool
新增集群伙伴
為了讓rbd-mirror守護進程發現它的伙伴集群,伙伴集群需要被注冊到資源池中。使用rbd新增鏡像伙伴Ceph集群,需要額外的mirror pool peer添加命令、資源池名稱和集群說明:
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-mirror守護進程需要有訪問位於/etc/ceph/{cluster-name}.conf的Ceph配置的權限,它提供了伙伴集群的監視器地址;此外還有位於默認或者配置的密鑰環檢索路徑(例如,/etc/ceph/{cluster-name}.{client-name}.keyring)下的密鑰環的訪問權限。
另外,伙伴集群的監視器或客戶端密鑰可以安全地存儲在本地Ceph監視器的confi-key存儲中。要在添加伙伴鏡像時指定伙伴集群的連接屬性,請使用--remote-mon-host和--remote-key-file選項。例如:
$ rbd --cluster local mirror pool peer add image-pool client.remote@remote --remote-mon-host 192.168.1.1,192.168.1.2 --remote-key-file < (echo 'AQAeuZdbMMoBChAAcj++/XUxNOLFaWdtTREEsw==')
$ rbd --cluster local mirror pool info image-pool --all
Mode: pool
Peers:
UUID NAME CLIENT MON_HOST KEY
587b08db-3d33-4f32-8af8-421e77abb081 remote client.remote 192.168.1.1,192.168.1.2 AQAeuZdbMMoBChAAcj++/XUxNOLFaWdtTREEsw==
移除伙伴集群
要使用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
數據池
在目標集群上創建images時,rbd-mirror收集如下數據池:
- 如果目標集群有配置好的默認數據池(
rbd_default_data_pool配置選項),那么這個數據池會被使用。 - 否則,如果源image使用單獨的數據池,且目標集群上存在同名稱的數據池,則使用該池。
- 如果以上都不成立,則不會設置數據池
Image 配置
與資源池配置不同,image配置只需針對單個鏡像的伙伴集群進行操作。
鏡像RBD image被指定為主image或非主image。這是image的屬性而不是池的屬性。被指定為非主image的image不可修改。
在image上第一次啟用鏡像時,image會自動提升為主image(如果鏡像模式為池模式,且image啟用了日志image特性,則會隱式地將image提升為主image,或者通過rbd命令顯式啟用鏡像)。
啟用image日志支持
RBD鏡像使用RBD日志特性來確保復制的image總是保持crash-consistent。在image可以被鏡像到伙伴集群之前,日志特性必須啟用。改特性可以在image創建時通過使用rbd命令,提供--image-feature exclusive-lock,journaling選項來啟用。
或者,日志特性可以在預先存在的RBD images上啟用。要使用rbd啟用日志,需要額外的feature enable命令、資源池名稱、image名稱和特性名稱:
rbd feature enable {pool-name}/{image-name} {feature-name}
例如:
$ rbd --cluster local feature enable image-pool/image-1 journaling
啟用image鏡像
如果鏡像是以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
禁用image鏡像
要使用rbd禁用特定的image鏡像,需要額外的mirror image disable命令、資源池名稱和image名稱:
rbd mirror image disable {pool-name}/{image-name}
例如:
$ rbd --cluster local mirror image disable image-pool/image-1
image 晉級和降級
在故障轉移場景中,需要將主節點轉移到伙伴集群的image中,應該停止對主image的訪問(例如,關閉VM或從VM中移除關聯的設備),降級當前的主image,提升新的主image,且恢復對備用集群上image的訪問。
要使用rbd將指定的image降級為non-primary,需要額外的mirror image demote命令、資源池名稱和image名稱:
rbd mirror image demote {pool-name}/{image-name}
例如:
$ rbd --cluster local mirror image demote image-pool/image-1
要是用rbd將池中的所有主image降級為non-primary,需要額外的mirror pool demote命令和資源池名稱:
rbd mirror pool demote {pool-name}
例如:
$ rbd --cluster local mirror pool demote image-pool
要使用rbd將指定的image升級為primary,需要額外的mirror image promote命令、資源池名稱和image名稱:
rbd mirror image promote [--force] {pool-name}/{image-name}
例如:
$ rbd --cluster remote mirror image promote image-pool/image-1
要是用rbd將池中的所有的non-primary image升級為primary,需要額外的mirror pool promote命令和資源池名稱:
rbd mirror pool promote [--force] {pool-name}
例如:
$ rbd --cluster local mirror pool promote image-pool
強制image同步
如果rbd-mirror守護進程檢測到有裂腦事件,則在更正之前它不會鏡像受到影響的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
鏡像狀態
伙伴集群的副本狀態存儲在每個主鏡像中。該狀態可被mirror image status和mirror pool status命令檢索到。
要使用rbd命令請求鏡像狀態,需要額外的mirror image status命令,池名稱和image名稱:
rbd mirror image status {pool-name}/{image-nmae}
例如:
$ rbd mirror image status image-pool/image-1
要使用rbd命令請求鏡像池的總體狀態,需要額外的mirror pool status命令和池名稱:
rbd mirror pool status {pool-name}
例如:
$ rbd mirror pool status image-pool
RBD-mirror 守護進程
兩個rbd-mirror守護進程負責監聽遠端image日志、伙伴集群和重放本地集群的日志事件。RBD image日志特性安裝出現的順序記錄下所有對image的修改。這確保了遠程鏡像的crash-consistent在本地可以。
每個rbd-mirror守護進程應該使用唯一的Ceph用戶ID。要使用ceph創建一個Ceph用戶,需要額外的auth get-or-create命令,用戶名、監視器上限和OSD上限:
ceph auth get-or-create client.rbd-mirror.{unique id} mon 'profile rbd-mirror' osd 'profile rbd'
通過指定用戶ID作為守護進程實例,systemd可以管理rbd-mirror守護進程:
systemctl enable ceph-rbd-mirror@rbd-mirror.{unique id}
rbd-mirror也可以在前台通過rbd-mirror命令啟動:
rbd-mirror -f --log-file={log_path}
image實時遷移
RBD images可以在同一集群的不同資源池或不同image格式和布局之間實時遷移。啟動時,源image會被深拷貝到目標image上,提取所有快照歷史記錄,並可選擇保留到源image的父image的任何鏈接,以幫助保持稀疏性。
新的目標image在使用的同時賦值操作可以安全地在后台運行。在准備遷移之前,需要暫時停止使用源image,這有助於確保該image的客戶端被更新為指向新的目標image。

實時遷移過程由三步組成:
- 准備遷移:初始步驟創建新的目標image並交叉鏈接源image和目標image。與分層映像相似,嘗試讀取目標image中未初始化的區域將在內部重定向到源image,而寫入目標image中未初始化區域將在內部將重疊的源image塊深拷貝到目標image。
- 執行遷移:將所有初始化的塊從源image深拷貝到目標,該操作在后台執行。此步驟可以在客戶端活躍訪問新目標image時執行。
- 結束遷移:一旦后台遷移操作完成,就可以提交或者中斷遷移。提交遷移將刪除源與目標image之間的交叉鏈接並移除源image。中斷遷移將移除交叉鏈接並移除目標image。
准備遷移
執行rbd migration prepare命令初始化實時遷移操作,需要體統源與目標images:
$ rbd migration prepare migration_source [migration_target]
rbd migration prepare命令接收與rbd create命令相同的布局選項,它允許更改磁盤上不可更改的image布局。如果只是更改磁盤上的布局,migration_target可省略,沿用原始image名稱。
准備進行實時遷移前,所有使用源image的客戶端都必須停止使用。如果發現有任何客戶端以讀/寫模式打開image,准備步驟將會失敗。一旦准備步驟完成,客戶端可以使用心得目標image名稱重啟。嘗試使用源image重啟的客戶端將重啟失敗。
rbd status命令可以展示實時遷移的當前狀態:
$ rbd status migration_target
Watchers: none
Migration:
source: rbd/migration_source (5e2cba2f62e)
destination: rbd/migration_target (5e2ed95ed806)
state: prepared
注意,源image將被移動到RBD回收站中,以防遷移過程中的誤操作:
$ rbd info migration_source
rbd: error opening image migration_source: (2) No such file or directory
$ rbd trash ls --all
5e2cba2f62e migration_source
執行遷移
准備完實時遷移之后,image塊必須從源image中復制到目標image中。執行rbd migration execute命令可以實現上述操作:
$ rbd migration execute migration_target
Image migration: 100% complete...done.
rbd status命令也可提供深拷貝過程中遷移塊操作的反饋:
$ rbd status migration_target
Watchers:
watcher=1.2.3.4:0/3695551461 client.123 cookie=123
Migration:
source: rbd/migration_source (5e2cba2f62e)
destination: rbd/migration_target (5e2ed95ed806)
state: executing (32% complete)
提交遷移
一旦實時遷移完成從源image到目標image所有數據塊的深拷貝操作,遷移操作就可以提交:
$ rbd status migration_target
Watchers: none
Migration:
source: rbd/migration_source (5e2cba2f62e)
destination: rbd/migration_target (5e2ed95ed806)
state: executed
$ rbd migration commit migration_target
Commit image migration: 100% complete...done.
如果migration_sourceimage是一個或者多個克隆體的父節點,在確保所有的克隆體都停用后需要額外提供 -force選項。
提交遷移將刪除源與目標image之間的交叉鏈接並移除源image:
$ rbd trash list --all
中斷遷移
如果你想回退准備或執行步驟,執行rbd migration abort命令可以回退遷移過程:
$ rbd migration abort migration_target
Abort image migration: 100% complete...done.
中斷遷移將刪除目標image,並訪問要恢復的原始源image:
$ rbd ls
migration_source
RBD 持久緩存
共享的、只讀父image緩存
從父image克隆的RBD images通常只修改了image中的一小部分。例如,在VDI工作模式下,VMs是從同一基礎image克隆的,僅主機名稱和IP地址不同。在啟動階段,從集群里重新讀取的父image其實很大部分是重復的。如果本地有父image的緩存,不僅可以加快讀取速度、降低等待事件,還能減少客戶機到集群的網絡流量。RBD共享的只讀父image緩存需要在ceph.conf中顯式啟用。ceph-immmutable-object-cache守護進程負責將父內容緩存到本地磁盤上,將來對該數據的讀取將從本地緩存提供服務。

啟用RBD共享只讀父image緩存
要啟用RBD共享只讀父image緩存,需要在你的ceph.conf文件中的[client]部分添加如下設置:
rbd parent cache enabled = true
不可變對象緩存守護進程
ceph-immmutable-object-cache守護進程負責將父內容緩存到本地緩存目錄上。為了獲得更好的性能,建議使用SSD作為底層存儲介質。
守護進程的關鍵組件有:
$\qquad\(1. **Domain socket based IPC**:守護進程將在啟動時監聽本地域套接字,並等待來自librbd客戶端的連接。 \)\qquad\(2. **LRU based promotion/demotion policy**:守護進程將維護每個緩存文件上緩存命中的內存統計信息。如果容量達到配置的閾值,它將降級冷緩存。 \)\qquad$3. File-based caching store:守護進程將維護一個基於緩存存儲的簡單文件。在升級是,將從RADOS集群獲取RADOS對象並存儲到本地緩存目錄中。
在打開每個克隆的rbd image時,librbd會嘗試通過它的域套接字來連接緩存守護進程。如果成功連接,librbd將在后續讀取時自動與守護進程進行檢查。如果有未緩存的讀操作,守護進程將把RADOS對象提升到本地緩存目錄,所以下次對該對象的讀操作將從本地文件提供服務。守護進程還會維護簡答的LRU統計數據,因此如果沒有足夠的容量,它將刪除一些冷緩存文件。
以下是一些與下列設置相對應的重要緩存選項:
- immutable_object_cache_path 不可變對象緩存數據目錄
- immutable_object_cache_max_size 不可變緩存最大值
- immutable_object_cache_watermark 緩存水印。如果容量達到這個水印,守護進程將會根據LRU統計數據刪除冷緩存。
ceph-immutable-object-cache守護進程可在可選的ceph-immutable-object-cache分發包中使用。
ceph-immutable-object-cache守護進程應該使用唯一的Ceph用戶ID。要要創建Ceph用戶,使用ceph auth get-or-create命令,需要提供用戶名,監視器權限,OSD權限:
ceph auth get-or-create client.ceph-immutable-object-cache.{unique id} mon 'allow r' osd 'profile rbd-read-only'
作為守護進程實例,ceph-immutable-object-cache守護進程可以通過systemd使用指定的用戶ID進行管理:
systemctl enable ceph-immutable-object-cache@immutable-object-cache.{unique id}
ceph-immutable-object-cache守護進程也可在前台通過ceph-immutable-object-cache命令執行:
ceph-immutable-object-cache -f --log-file={log_path}
librbd 配置設置
詳情參見塊設備。
緩存設置
Ceph塊設備的用戶空間實現(即librbd)無法使用Linux頁面緩存,因此她包含了自己的內存緩存,名為“RBD緩存”。RBD緩存行為類似於性能良好的硬盤緩存。當系統發送中斷或刷新請求時,所有的數據都會被寫入OSDs。這意味着回寫式緩存與使用性能良好的物理硬盤一樣安全,其中的VM可以正確地發送刷新(Linux內核>=2.6.32)。緩存使用Least Recently Used(LRU)算法,並且在回寫模式下,為了更高的吞吐量它可以合並相鄰的請求。
內核緩存: Ceph塊設備的內核驅動可以使用Linux頁面緩存提升性能。
librbd緩存默認啟用並三種不同的緩存策略:write-around,write-back和write-through。在write-around和write-back策略下寫操作立即返回,除非有超過RBD緩存最大未寫入字節寫到存儲集群中。write-around策略不同於write-back在於它不嘗試為從緩存中讀取請求提供服務,因此在寫入工作負載下擁有更高的性能。在write-through策略下,只有在所有副本中數據都落盤時才會返回,但讀操作可能來自緩存。
在收到刷新請求之前,緩存的行為類似write-through緩存,以確保舊操作系統不發送刷新請求來保證crash-consistent。
如果librbd緩存禁用,讀寫操作將直接作用於存儲集群,寫操作只有在所有副本中數據都落盤時才會返回。
RBD的設置應被設置在你的ceph.conf配置文件中[client]部分,設置包括:
rbd cache:
\(\qquad\) 描述:啟用RADOS塊設備(RBD)緩存
\(\qquad\) 類型:Boolean
\(\qquad\) 必要:否
\(\qquad\) 默認值:true
rbd cache policy:
\(\qquad\) 描述:為librbd選擇緩存策略
\(\qquad\) 類型:Enum
\(\qquad\) 必要:否
\(\qquad\) 默認值:writearound
\(\qquad\) 可選值:writearound,writeback,writethrough
rbd cache writethrough until flush:
\(\qquad\) 描述:從write-through模式開始,在收到第一個刷新請求后切換到write-back。啟用這個選項是一個保守但安全的設置,以防運行在rbd上的vm太老而無法發送刷新,就像2.6.32之前Linux中的virtio驅動程序一樣。
\(\qquad\) 類型:Boolean
\(\qquad\) 必要:否
\(\qquad\) 默認值:true
rbd cache size:
\(\qquad\) 描述:RBD緩存字節數
\(\qquad\) 類型:64-bit Integer
\(\qquad\) 必要:否
\(\qquad\) 默認值:32 MiB
\(\qquad\) 策略:write-back和write-through
rbd cache max dirty:
\(\qquad\) 描述:在緩存中觸發write-back的dirty字節限制,如果是0,使用write-through緩存
\(\qquad\) 類型:64-bit Integer
\(\qquad\) 必要:否
\(\qquad\) 限制:必須小於rbd cache size
\(\qquad\) 默認值:24 MiB
\(\qquad\) 策略:write-through和write-back
rbd cache target dirty:
\(\qquad\) 描述:在緩存開始向數據存儲寫入數據之前的target dirty。不阻塞對緩存的寫入
\(\qquad\) 類型:64-bit Integer
\(\qquad\) 必要:否
\(\qquad\) 限制:必須小於rbd cache max dirty
\(\qquad\) 默認值:16 MiB
\(\qquad\) 策略:write-back
rbd cache max dirty age:
\(\qquad\) 描述:writeback開始前dirty數據在緩存中的保留秒數
\(\qquad\) 類型:Float
\(\qquad\) 必要:否
\(\qquad\) 默認值:1.0
\(\qquad\) 策略:write-back
預讀設置
librbd支持預讀/預處理以優化小、有序的讀取。在VM的情況下,這通常應該由客戶機系統來處理,但引導加載器可能不會發出有效的讀取操作。如果禁用緩存或緩存策略是write-around,預讀操作將自動禁用。
rbd readahead trigger requests
\(\qquad\) 描述:觸發預讀操作的有序讀請求的數量
\(\qquad\) 類型:Integer
\(\qquad\) 必要:否
\(\qquad\) 默認值:10
rbd readahead max bytes
\(\qquad\) 描述:最大預讀請求數量。如果為0,禁用預讀
\(\qquad\) 類型:64-bit Integer
\(\qquad\) 必要:否
\(\qquad\) 默認值:512 KiB
rbd readahead disable after bytes
\(\qquad\) 描述:當從RBD image讀取到如此多字節后,該image的預讀操作將被禁用直至它關閉。這允許客戶機系統在啟動后接管預讀。如果是0,預讀一直啟用。
\(\qquad\) 類型:64-bit Integer
\(\qquad\) 必要:否
\(\qquad\) 默認值:50 MiB
image 特性
RBD支持高級特性,可以在創建image時通過命令行指定,也可以通過Ceph配置文件通過‘rbd_default_features = <sum of feature numeric values>’ or ‘rbd_default_features = <comma-delimited list of CLI values>’來指定。
Layering
\(\qquad\) 描述:分層使你可以使用克隆
\(\qquad\) 內部值:1
\(\qquad\) CLI值:layering
\(\qquad\) 引入:v0.70(Emperor)
\(\qquad\) KRBD支持:從v3.10
\(\qquad\) 默認:是
Striping v2
\(\qquad\) 描述:條帶化將數據傳播到多個對象。條帶化有助於提高順序讀寫工作負載的並行性。
\(\qquad\) 內部值:2
\(\qquad\) CLI值:striping
\(\qquad\) 引入:v0.70(Emperor)
\(\qquad\) KRBD支持:從v3.10
\(\qquad\) 默認:是
Exclusive locking
\(\qquad\) 描述:如果啟用,它要求客戶端在對象上執行寫入前獲取所。僅當單個客戶端同時訪問image時,才應啟用獨占鎖。
\(\qquad\) 內部值:4
\(\qquad\) CLI值:exclusive-lock
\(\qquad\) 引入:v0.92(Hammer)
\(\qquad\) KRBD支持:從v4.9
\(\qquad\) 默認:是
Object map
\(\qquad\) 描述:對象映射的支持基於獨占鎖的支持。塊設備是精簡配置的,意味着,它們只存儲實際存在的數據。對象映射支持幫助追蹤哪些對象實際存在(已將數據存儲在驅動上)。啟用對象映射支持可加速用於克隆的I/O操作、導入和導出稀疏映像、刪除。
\(\qquad\) 內部值:8
\(\qquad\) CLI值:object-map
\(\qquad\) 引入:v0.92(Hammer)
\(\qquad\) KRBD支持:從v5.3
\(\qquad\) 默認:是
Fast-diff
\(\qquad\) 描述:Fast-diff的支持依賴於對象映射的支持和獨占鎖的支持。它想對象映射添加了另一個屬性,這使得生成image快照之間的差異和快照實際數據使用之間的差異要快很多。
\(\qquad\) 內部值:16
\(\qquad\) CLI值:fast-diff
\(\qquad\) 引入:v9.0.1(Infernalis)
\(\qquad\) KRBD支持:從v5.3
\(\qquad\) 默認:是
Deep-flatten
\(\qquad\) 描述:Deep-flatten使rbd flatten工作於image本身之外的所有快照。沒有它,image快照仍然依賴於父級,因此父級在快照被刪除之前是不可刪除的。Deep-flatten使父類獨立於它的克隆,即使它們有快照。
\(\qquad\) 內部值:32
\(\qquad\) CLI值:deep-flatten
\(\qquad\) 引入:v9.0.2(Infernalis)
\(\qquad\) KRBD支持:從v5.1
\(\qquad\) 默認:是
Journaling
\(\qquad\) 描述:日志的支持依賴於獨占鎖的支持。日志按照出現的順序記錄下所有對image的修改。RBD鏡像利用日志將crash-consistent image復制到遠程集群。
\(\qquad\) 內部值:64
\(\qquad\) CLI值:journaling
\(\qquad\) 引入:v10.0.1(Jewel)
\(\qquad\) KRBD支持:否
\(\qquad\) 默認:否
Data Pool
\(\qquad\) 描述:在erasure-coded池中,需要將image數據塊對象存儲在於image元數據分開的池中。
\(\qquad\) 內部值:128
\(\qquad\) 引入:v11.1.1(Kraken)
\(\qquad\) KRBD支持:從v4.11
\(\qquad\) 默認:否
Operations
\(\qquad\) 描述:用於限制舊客戶端對image執行某些維護操作(例如克隆、創建快照)。
\(\qquad\) 內部值:256
\(\qquad\) 引入:v13.0.2(Mimic)
\(\qquad\) KRBD支持:從v4.16
Migrating
\(\qquad\) 描述:用於限制舊客戶端在image處於遷移狀態是打開image。
\(\qquad\) 內部值512
\(\qquad\) 引入:v14.0.1(Nautilus)
\(\qquad\) KRBD支持:否
QOS設置
librbd支持限制每個image IO,由以下設置控制。
rbd qos iops limit
\(\qquad\) 描述:每秒IO操作的極限
\(\qquad\) 類型:Unsigned Integer
\(\qquad\) 必須:否
\(\qquad\) 默認:0
rbd qos bps limit
\(\qquad\) 描述:每秒IO字節的極限
\(\qquad\) 類型:Unsigned Integer
\(\qquad\) 必須:否
\(\qquad\) 默認:0
rbd qos read iops limit
\(\qquad\) 描述:每秒讀操作的極限
\(\qquad\) 類型:Unsigned Integer
\(\qquad\) 必須:否
\(\qquad\) 默認:0
rbd qos write iops limit
\(\qquad\) 描述:每秒寫操作的極限
\(\qquad\) 類型:Unsigned Integer
\(\qquad\) 必須:否
\(\qquad\) 默認:0
rbd qos read bps limit
\(\qquad\) 描述:每秒讀取字節的極限
\(\qquad\) 類型:Unsigned Integer
\(\qquad\) 必須:否
\(\qquad\) 默認:0
rbd qos write bps limit
\(\qquad\) 描述:每秒寫入字節的極限
\(\qquad\) 類型:Unsigned Integer
\(\qquad\) 必須:否
\(\qquad\) 默認:0
rbd qos iops burst
\(\qquad\) 描述:IO操作的爆炸極限
\(\qquad\) 類型:Unsigned Integer
\(\qquad\) 必須:否
\(\qquad\) 默認:0
rbd qos bps burst
\(\qquad\) 描述:IO字節的爆炸極限
\(\qquad\) 類型:Unsigned Integer
\(\qquad\) 必須:否
\(\qquad\) 默認:0
rbd qos read iops burst
\(\qquad\) 描述:讀操作的爆炸極限
\(\qquad\) 類型:Unsigned Integer
\(\qquad\) 必須:否
\(\qquad\) 默認:0
rbd qos write iops burst
\(\qquad\) 描述:寫操作的爆炸極限
\(\qquad\) 類型:Unsigned Integer
\(\qquad\) 必須:否
\(\qquad\) 默認:0
rbd qos read bps burst
\(\qquad\) 描述:讀字節的爆炸極限
\(\qquad\) 類型:Unsigned Integer
\(\qquad\) 必須:否
\(\qquad\) 默認:0
rbd qos write bps burst
\(\qquad\) 描述:寫字節的爆炸極限
\(\qquad\) 類型:Unsigned Integer
\(\qquad\) 必須:否
\(\qquad\) 默認:0
rbd qos schedule tick min
\(\qquad\) 描述:QOS的最小時間調度(以毫秒為單位)
\(\qquad\) 類型:Unsigned Integer
\(\qquad\) 必須:否
\(\qquad\) 默認:50
RBD重播
RBD replay是一系列捕獲和重播RBD工作負載的工具。要捕獲RBD工作負載,客戶端必須安裝lttng-tools,且librbd必須是v0.87(Giant)或之后的版本。要重播RBD工作負載,客戶端上的librbd必須是v0.87(Giant)或之后的版本。
捕獲和重播需要三步:
- 捕獲記錄。確保捕獲pthread_id上下文:
mkdir -p traces
lttng create -o traces librbd
lttng enable-event -u 'librbd:*'
lttng add-context -u -t pthread_id
lttng start
# run RBD workload here
lttng stop
- 使用rbd-replay-prep處理記錄:
rbd-replay-prep traces/ust/uid// replay.bin
- 使用rbd-replay重播記錄。使用只讀,直到你知道它在做你想在的:
rbd-replay --read-only replay.bin
重新播放的工作負載不必針對相同的RBD映像,甚至不必針對與捕獲的工作負載相同的集群。為了說明差異,您可能需要使用rbd-replay的-pool和-map-image選項。
Ceph塊設備第三方集成
內核模塊操作
獲取image列表
要掛載塊設備image,首先需要獲取image列表:
rbd list
映射塊設備
使用rbd映射image名稱到內核模塊。你必須指定image名稱,資源池名稱和用戶名。如果尚未加載rbd內核模塊,rbd將為你加載它:
sudo rbd device map {pool-name}/{image-name} --id {user-name}
例如:
sudo rbd device map rbd/myimage --id admin
如果你使用cephx認證,你必須額外指明密碼。它可能來自密鑰環或包含密碼的文件:
sudo rbd device map rbd/myimage --id admin --keyring /path/to/keyring
sudo rbd device map rbd/myimage --id admin --keyfile /path/to/file
展示已映射的塊設備
要使用rbd展示映射到內核模塊的塊設備image,指定參數device list:
rbd device list
取消映射
要使用rbd命令取消塊設備image映射,需要指定device unmap參數和設備名稱(例如,按照慣例,有塊設備image同名):
sudo rbd device unmap /dev/rbd/{poolname}/{imagename}
例如:
sudo rbd device unmap /dev/rbd/rbd/foo
QEMU 與塊設備
最常見的Ceph塊設備使用場景是為虛擬機提供塊設備images。例如,用戶可以在理想的配置中使用OS和相關軟件創建一個“黃金”image。然后用戶創建一個這個image的快照。最后,用戶克隆這個快照(通常是很多次)。詳見Snapshots。對快照進行寫時復制的能力意味着Ceph可以快速地將塊設備image提供給虛擬機,因為客戶端不必在每次啟用一個新的虛擬機時下載整個image。

Ceph塊設備可以跟QEMU虛擬機融為一體。關於QEMU詳情,請查看QEMU Open Source Processor Emulator。QEMU文件參見文檔,安裝細節,參見安裝。
使用指南
QEMU命令行期望你指定資源池名稱和image名稱。你也可以指明快照名稱。
QEMU假設Ceph配置文件存放在默認的路徑(即/etc/ceph/$cluster.conf),且你可以使用默認的client.admin用戶執行命令,除非你指明其它的Ceph配置文件路徑或用戶。當指定用戶是,QEMU只使用ID而不是全部的TYPE:ID。詳見用戶管理-用戶。在用戶ID之前不用使用client類型的前綴(例如,client.),否則你會收到認證錯誤。使用:id={user}選項時你應該持有管理員用戶或其他用戶的密鑰,密鑰文件應該存儲在默認路徑(即,/etc/ceph)或具有合適的文件所有權和權限的本地路徑。用法格式如下:
qemu-img {command} [options] rbd:{pool-name}/{image-name}[@snapshot-name][:option1=value1][:option2=value2...]
例如:
qemu-img {command} [options] rbd:glance-pool/maipo:id=glance:conf=/etc/ceph/ceph.conf
使用QEMU創建images
你可以從QEMU中創建塊設備image。你必須指明rbd,資源池名稱以及你想要創建的image名稱,同時你還必須指明image大小。
qemu-img create -f raw rbd:{pool-name}/{image-name} {size}
例如:
qemu-img create -f raw rbd:data/foo 10G
使用QEMU重置image大小
你可以從QEMU中重置塊設備image的大小。你必須指明rbd,資源池名稱以及你想重置大小的image的名稱。你還必須指明image的大小。
qemu-img resize rbd:{pool-name}/{image-name} {size}
例如:
qemu-img resize rbd:data/foo 10G
使用QEMU檢索image信息
你可以從QEMU中檢索塊設備image的信息。你必須指明rbd,資源池名稱以及image名稱。
qemu-img info rbd:{pool-name}/{image-name}
例如:
qemu-img info rbd:data/foo
使用rbd運行QEMU
QEMU可以將塊設備從主機上傳遞給客戶機,但從QEMU 0.15起,不再需要將image映射為主機上的塊設備了。取而代之的是,QEMU可以通過librbd直接訪問作為虛擬塊設備的image。這樣做更高效,因為這樣避免了上下文切換的額外開銷,同時也能利用RBD緩存。
你可使用qemu-img將已存在的虛擬機image轉換成Ceph的塊設備image。例如,加入你有一個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,你可以將librbd緩存配置(跟任何Ceph配置選項一樣)設置為“文件”參數的一部分:
qemu -m 1024 -drive format=raw,file=rbd:data/squeeze:rbd_cache=true,cache=writeback
啟用 Discard/Trim
從Ceph 0.46版本和QEMU 1.1版本開始,Ceph塊設備支持丟棄操作。這意味着客戶機可以發送裁剪(Trim)請求來讓Ceph塊設備回收未使用的空間。在客戶機使用discard選項掛載ext4或XFS可以啟用該功能。
為了在客戶機上可用,塊設備必須顯式啟用該功能。要做到這些,你必須指明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設備不支持丟棄。
如果使用libvirt,使用virsh編輯你的libvirt守護進程的配置文件,添加xmlns:qemu。然后,添加qemu:commandline塊作為守護進程的子進程。下面的示例說明如何將emu id=的兩個設備設置為不同的discard_particle值。
<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緩存選項
QEMU的緩存選項與下面的CephRBD緩存設置相符合。
Writeback:
rbd_cache = true
Writethrough:
rbd_cache = true
rbd_cache_max_dirty = 0
None:
rbd_cache = false
QEMU的緩存設置會覆蓋Ceph的緩存設置(包括在Ceph配置文件中明確設置的配置)。
libvirt與Ceph RBD
libvirt庫在管理程序接口和使用它們的軟件應用程序之間創建了一個虛擬機抽象層。使用libvirt,在許多不同的管理程序間,開發者和系統管理員可以關注於通用管理框架、通用API和通用shell接口(即,virsh),包括:
- QEMU/KVM
- XEN
- LXC
- VirtualBox
- 等等
Ceph塊設備支持QEMU/KVM。你可以通過使用libvirt接口的軟件來使用Ceph塊設備。下圖描述了libvirt和QEMU如何通過librbd來使用Ceph塊設備。

最常見的需要libvirt提供Ceph塊設備的使用場景是雲解決方案,例如OpenStack和CloudStack。雲解決方案使用libvirt與QEMU/KVM進行交互,QEMU/KVM通過librbd與Ceph塊設備進行交互。詳見塊設備與OpenStack和塊設備與CloudStack。安裝詳見安裝。
你也可以通過Libvirt、virsh和libvirt API來使用Ceph塊設備。詳見libvirt虛擬化API。
要使用Ceph塊設備創建VMs,可使用以下章節中的操作。在接下來的示例中,我們使用libvirt-pool作為資源池名稱,client.libvirt作為用戶名,new-libvirt-image作為image名稱。當然你可以使用你喜歡的名稱,但請確保在隨后的操作中執行命令時替換這些名稱。
配置Ceph
要配置Ceph以便libvirt使用,執行下列步驟:
- 創建資源池。下面的示例是創建一個擁有128個歸置組的名為libvirt-pool的資源池:
ceph osd pool create libvirt-pool 128 128
確認資源池已存在:
ceph osd lspools
- 使用rbd工具RBD初始化資源池:
rbd pool init <pool-name>
- 創建Ceph用戶。下面的示例是使用名為client.libvirt的用戶和引用libvirt-pool:
ceph auth get-or-create client.libvirt mon 'profile rbd' osd 'profile rbd pool=libvirt-pool'
確認用戶已存在:
ceph auth ls
- 使用QEMU在你的RBD池中創建image。下面嗎的示例是引用libvirt-pool創建名為new-libvirt-image的image:
qemu-img create -f rbd rbd:libvirt-pool/new-libvirt-image 2G
確認image以存在:
rbd -p libvirt-pool ls
你也可以使用[rbd create]來創建image,但我們建議確保QEMU可以正常工作。
准備VM管理員
你可能在沒有VM管理員的情況下使用libvirt,但你會發現使用virt-manager來創建你的第一域更簡單。
- 安裝虛擬機管理員。詳見[KVM/VirtManager]。
sudo apt-get install virt-manager
- 如果需要,下載系統鏡像。
- 啟用虛擬機管理:
sudo virt-manager
創建一個VM
要使用virt-manager創建一個VM,執行以下步驟:
- 按下Create New Virtual Machine按鈕
- 命名新的虛擬機域。在接下來的示例中,我們使用libvirt-virtual-machine名稱。你也可以使用你想要的名稱,但要確保在接下的命令行和配置示例中替換你選則的名稱。
libvirt-virtual-machine
- 導入鏡像
/path/to/image/recent-linux.img
注意,導入最近的鏡像。某些老的鏡像可能無法重新掃描為正確的虛擬設備。
- 配置從啟動VM
- 你可以使用
virsh list來確認VM域已存在
sudo virsh list
- 登錄VM(root/root)
- 配置VM使用Ceph前需要先關閉
配置VM
在為Ceph配置VM時,在適當的地方使用virsh是很重要的。此外,virsh命令通常需要root權限(例如,sudo)且不會返回適當的結果,也不會通知你需要root權限。關於virsh命令的引用,詳見Virsh Command Reference。
- 使用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可能不會正常工作。
- 將你創建的Ceph RBD image作為<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},替換資源池或image名稱也是必要。你也可以為你的Ceph監視器添加多個<host>條目。邏輯設備的屬性可在你的VM的/dev目錄下找到。bus屬性選項指示要模擬的硬盤設備的類型。驅動的有效設置是明確的(即,“ide”,“scsi”,“virtio”,“xen”,“usb”或“sata”)。
<disk>元素及其子元素和屬性,詳見Disks。
- 保存文件
- 如果你的Ceph存儲集群已啟用Ceph 認證(默認啟用),你必須生成密碼
cat > secret.xml <<EOF
<secret ephemeral='no' private='no'>
<usage type='ceph'>
<name>client.libvirt secret</name>
</usage>
</secret>
EOF
- 定義密碼
sudo virsh secret-define --file secret.xml
<uuid of secret is output here>
- 獲取並保存client.libvirt密鑰到文件中
ceph auth get-key client.libvirt | sudo tee client.libvirt.key
- 設置密碼的UUID
sudo virsh secret-set-value --secret {uuid of secret} --base64 $(cat client.libvirt.key) && rm client.libvirt.key secret.xml
你必須通過手動添加下面的<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,而不是第二部配置Ceph生成的Ceph名稱 client.libvirt。確保你使用的Ceph名稱的ID組件是你生成的。如果由於某些原因你需要重新生成密碼。在你再次執行
sudo virsh secret-set-value命令之前,你必須要先執行sudo virsh secret-undefine {uuid}命令。
總結
在你配置你的VM使用Ceph之前,你可以先啟動VM。建議先確認VM和Ceph狀態,你可以使用下面的操作。
- 檢查Ceph是否運行:
ceph health
- 檢查VM是否運行:
sudo virsh list
- 檢查VM是否可以訪問Ceph。使用的VM域替換{vm-domain-name}:
sudo virsh qemu-monitor-command --hmp {vm-domain-name} 'info block'
- 檢查
<target dev='hdb' bus='ide'/>下的驅動是否存在/dev或/proc/partitions下:
ls /dev
cat /proc/patitions
如果每一步都成功,那么你可以在你的VM中使用Ceph塊設備了。
塊設備與OpenStack
你可以通過libvirt在OpenStack中使用Ceph塊設備images,將QEMU接口配置為librbd。Ceph在集群中將塊設備images條帶化為對象,這意味着大型的Ceph塊設備images擁有比單獨的服務器更好的性能!
要在OpenStack中使用Ceph塊設備,首先你必須安裝QEMU,libvirt和OpenStack。我們建議你使用單獨的物理設備安裝OpenStack。OpenStack建議最小8GB RAM和四核處理器。下圖描繪了OpenStack/Ceph的技術棧。

OpenStack的三個部分與Ceph塊設備集成:
- Images:OpenStack Glance管理着VMs的鏡像。鏡像是不可變的。OpenStack將鏡像視為二進制塊並對應的下載它們。
- Volumes:Volumes是塊設備。OpenStack使用volume引導VMs,或掛載volumes來運行VMs。OpenStack使用Cinder服務管理volumes。
- Guest Disks:客戶硬盤時客戶操作系統的硬盤。默認情況下,當你啟動虛擬機時,它的硬盤作為文件出現在虛擬機監控程序的文件系統上(通常在/var/lib/nova/instances/<uuid>/下)。在OpenStack Havana之前,在Ceph中啟動VM的唯一方法是使用Cinder的boot-from-volume功能。然后,現在不使用Cinder,直接在Ceph中啟動每個虛擬機成為可能,這是非常有利的,應為它允許你使用實時遷移過程輕松地執行維護操作。此外,如果你的管理程序失效,還可以方便地觸發nova疏散並在其它地方幾乎無縫地運行虛擬機。
你也可以在Ceph塊設備中使用OpenStack Glance來存儲鏡像,並且你可以通過寫時復制克隆一個image來使用Cinder引導VM。
接下來的詳細介紹Glance,Cinder和Nova,盡管它們不必一起使用。你可以在本地磁盤運行VM時將image存儲到Ceph塊設備中,反之亦可。
創建資源池
默認情況下,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
資源池中歸置組數量的說明詳見Create a Pool,資源池中你應該設置的歸置組數量詳見Placement Groups。
新創建的資源池在使用之前必須初始化。使用rbd工具初始化這些資源池:
rbd pool init volumes
rbd pool init images
rbd pool init backups
rbd pool init vms
配置OpenStack Ceph客戶端
運行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
安裝Ceph客戶端包
在glance-api節點,你需要librbd的Python包:
sudo apt-get install python-rbd
sudo yum install python-rbd
在nove-compute、cinder-backup和cinder-volume節點,需要同時安裝Python包和客戶端命令行工具:
sudo apt-get install ceph-common
sudo yum install ceph-common
安裝Ceph 客戶端認證
如果你已經啟用了cephx authentication,需要為Nova/Cinder和Glance創建用戶。執行以下命令:
ceph auth get-or-create client.glance mon 'profile rbd' osd 'profile rbd pool=images'
ceph auth get-or-create client.cinder mon 'profile rbd' osd 'profile rbd pool=volumes, profile rbd pool=vms, profile rbd-read-only pool=images'
ceph auth get-or-create client.cinder-backup mon 'profile rbd' osd 'profile rbd 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的節點需要nova-compute進程的密鑰環文件:
ceph auth get-or-create client.cinder | ssh {your-nova-compute-server} sudo tee /etc/ceph/ceph.client.cinder.keyring
在libvirt中,也需要存儲client.cinder用戶的密碼。在從Cinder附加一個塊設備時,libvirt需要它來訪問集群。
在運行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。
配置OpenStack使用Ceph
配置Glance
Glance可以使用多個后端來存儲鏡像。要默認使用Ceph塊設備,如下配置Glance。
KILO and After
編輯/etc/glance/glance-api.conf並新增如下[glance_store]章節:
[glance_store]
stores = rbd
default_store = rbd
rbd_store_pool = images
rbd_store_user = glance
rbd_store_ceph_conf = /etc/ceph/ceph.conf
rbd_store_chunk_size = 8
更多有關Glance中可用的配置選項,請查看OpenStack配置應用:http://docs.openstack.org/。
啟用鏡像的寫時復制
注意這會通過Glance的API公開后端位置,所以啟用此選項的終端不應公開訪問。
除了Mitaka外的所有OpenStack發行版
如果你想啟用鏡像的寫時復制克隆,在[DEFAULT]章節下新增:
show_image_direct_url = True
禁用緩存管理(所有OpenStack發行版)
假設你的配置文件中有flavor = keystone+cachemanagement,禁用Glance的緩存管理以免在/var/lib/glance/image-cache/下緩存鏡像:
[paste_deploy]
flavor = keystone
鏡像屬性
我們建議為你的鏡像使用如下屬性:
- hw_scsi_model=virtio-scsi:添加virtio-scsi控制,獲得更好的性能,支持丟棄選項
- hw_disk_bus=scsi:連接每個Cinder塊設備到控制器
- hw_qemu_guest_agent=yes:啟用QEMU客戶代理
- os_require_quiesce=yes:通過QEMU客戶代理發送fs-freeze/thaw請求
配置Cinder
OpenStack需要一個驅動與Ceph塊設備進行交互。你必須為塊設備指明資源池名稱。在你的OpenStack節點上,編輯/etc/cinder/cinder.conf ,添加:
[DEFAULT]
...
enabled_backends = ceph
glance_api_version = 2
...
[ceph]
volume_driver = cinder.volume.drivers.rbd.RBDDriver
volume_backend_name = ceph
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
如果你已經啟用了cephx authentication,如之前所述,你還要配置你添加的密碼的用戶和UUID:
[ceph]
...
rbd_user = cinder
rbd_secret_uuid = 457eb676-33da-42ec-9a8c-9293d545c337
注意,如果你配置了多個Cinder后端,在[DEFAULT]章節下必須設置glance_api_version = 2。
配置Cinder備份
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
為附加Ceph RBD塊設備配置Nova
為了附件Cinder設備(無論是普通的塊設備還是從volume中引導),你必須告訴Nova(和libvirt)在附加設備時引用的是哪個用戶和UUID。在連接和認證Ceph集群時,libvirt將使用這個用戶。
[libvirt]
...
rbd_user = cinder
rbd_secret_uuid = 457eb676-33da-42ec-9a8c-9293d545c337
這兩個標志會被Nova臨時后端使用。
配置Nova
為了直接從Ceph中引導所有的虛擬機,你必須為Nova配置臨時后端。
建議在你的Ceph配置文件中(從Giant開始默認啟用)啟用RBD緩存。例外,啟用管理員套接字在定位問題時將帶來很多好處。使用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用戶和libvirt組可能因系統而異。提供的例子是基於RedHat系統工作的。
重啟OpenStack
為了激活Ceph塊設備驅動和導入配置中的塊設備資源池,你必須重啟OpenStack。對於基於Debian系統,在合適的節點執行下列命令:
sudo glance-control api restart
sudo service nova-compute restart
sudo service cinder-volume restart
sudo service cinder-backup restart
對於基於RedHa他系統,執行:
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}
你可以使用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塊設備,因為image是寫時復制克隆,所以它可以快速地創建一個新的卷。在OpenStack dashboard中,通過下列步驟,你可以從卷中啟動:
- 創建一個新的實例
- 選擇與寫時復制克隆相關聯的image
- 選擇“從卷啟動”
- 選擇你創建的卷
Ceph iSCSI網關
iSCSI網關是Ceph存儲與iSCSI標准融為一體,以提供高可用(HA)的iSCSI target,來將RADOS塊設備導出為SCSI硬盤。iSCSI協議運行客戶端(initiators)通過TCP/IP網絡發送SCSI命令給SCSI存儲設備(target)。這使得各種客戶端,例如Microsoft Windows,可以訪問Ceph存儲集群。
每個iSCSI網關都運行在Linux IO target內核子系統(LIO)內以提供iSCSI協議支持。LIO利用用戶空間passthrough(TCMU)與Ceph的librbd庫交互,並向iSCSI客戶端導出RBD image。使用Ceph的iSCSI網關,你可以有效地運行一個完全集成的塊設備基礎設施,它具有傳統存儲區域網絡(SAN)的所有特性和優點。

ISCSI網關要求
要實現Ceph iSCSI網關,需要滿足一些要求。高可用的Ceph iSCSI網關解決方案推薦使用2到4個iSCSI網關節點。
關於推薦硬件,詳見Hardware Recommendations。
對於Ceph Monitors或OSDs來說,iSCSI網關選項沒有特殊說明,降低檢查OSDs的默認定時器是很重要的,這將減少啟動器超時的可能性。對於存儲集群中的每個OSD節點,建議使用以下配置選項:
[osd]
osd heartbeat grace = 20
osd heartbeat interval = 5
- 使用Ceph Monitor在線更新:
ceph tell <daemon_type>.<id> config set <parameter_name> <new_value>
ceph tell osd.0 config set osd_heartbeat_grace 20
ceph tell osd.0 config set osd_heartbeat_interval 5
- 在OSD節點在線更新
ceph daemon <daemon_type>.<id> config set osd_client_watch_timeout 15
ceph daemon osd.0 config set osd_heartbeat_grace 20
ceph daemon osd.0 config set osd_heartbeat_interval 5
更多Ceph配置選項,參見配置Ceph。
ISCSI Targets
傳統上來說,對Ceph存儲集群的塊級別的訪問僅限於QEMU和librbd,這樣是OpenStack環境中采用的關鍵因素。從Ceph Luminous版本開始,塊級別的訪問正在擴展,以提供標准的iSCSI支持,允許更廣泛的平台使用,並可能打開新的使用場景。
- Red Hat Enterprise Linux/CentOS 7.5 (or newer); Linux kernel v4.16 (or newer)
- 使用ceph-ansible或使用命令行部署的工作Ceph存儲集群
- iSCSI網關節點,可以與OSD節點或專用節點共存
- 為iSCSI前端流量和Ceph后端流量分離網絡子網
使用ansible配置ISCSI Target
Ceph iSCSI網關既是iSCSI target節點,也是Ceph client節點。Ceph iSCSI網關可以是一個單獨的節點,也可以托管於Ceph對象存儲磁盤(OSD)節點。完成以下步驟后,將安裝並配置Ceph iSCSI網關進行基本操作。
要求:
- 運行中的Ceph Luminous(12.2.x)或更新的集群
- Red Hat Enterprise Linux/CentOS 7.5 (or newer); Linux kernel v4.16 (or newer)
- 在所有iSCSI網關節點上安裝
ceph-iscsi包
安裝:
在Ansible安裝節點,可以是管理節點或專業部署節點,執行以下操作:
- 使用
root安裝ceph-ansible包:
> # yum install ceph-ansible
- 在
/etc/ansible/hosts文件中未網關組添加條目:
```text
[iscsigws]
ceph-igw-1
ceph-igw-2
```
配置:
ceph-ansible包在/usr/share/ceph-ansible/group_vars/目錄下放置了一個名為iscsigws.yml.sample的文件。創建一個這個示例文件的副本,命名為iscsigws.yml。查看以下Ansible變量和說明,並進行相應更新。可在iscsigws.yml.sample文件查閱高級變量的完整列表。
| 變量 | 意義/目的 |
|---|---|
| seed_monitor | 由於RADOS和rbd的調用,每個網關都需要訪問ceph集群。這意味着iSCSI網關必須定義一個適當的/etc/ceph/目錄。seed_monitor主機用於填充iSCSI網關的/etc/ceph/目錄。 |
| cluster_name | 定義一個慣用的存儲集群名稱。 |
| gateway_keyring | 定義一個慣用的密鑰環名稱。 |
| deploy_setting | 如設置為True,則在運行playbook時部署設置。 |
| perform_system_checks | 這是一個布爾值,用於檢查每個網關上的多路徑和lvm配置設置。至少在第一次運行時,必須將其設置為true,以確保正確配置了multipathd和lvm。 |
| api_user | API的用戶名。默認為admin。 |
| api_password | 使用API的密碼。默認為admin。 |
| api_port | 使用API的TCP端口。默認為5000. |
| api_secure | 設為True時,必須使用TLS。默認為false。如果為True,用戶必須創建必要的證書和密鑰文件。詳見gwcli man文件。 |
| trusted_ip_list | 有權訪問API的IPV4或IPV6列表。默認情況下,只有iSCSI網關節點有權訪問。 |
部署:
在Ansible安裝節點,執行以下操作:
- 使用root執行Ansible手冊:
> # cd /usr/share/ceph-ansible
> # ansible-playbook site.yml --limit iscsigws
- 從iSCSI網關節點驗證配置:
> # gwcli ls
服務管理:
ceph-iscsi包安裝了配置管理邏輯和名為rbd-target-api的systemd服務。啟用服務后,rbd-target-api會在引導時啟動並恢復Linux IO狀態。在部署期間,Ansible playbook禁用target 服務。下面是使用rbd-target-api systemd服務交互的結果:
# systemctl <start|stop|restart|reload> rbd-target-api
- reload
\(\qquad\)reload請求強制rbd-target-api重讀配置並在當前環境下應用它。這不是常用請求,因為更改將從Ansible平行部署到所有的iSCSI網關節點。
- stop
\(\qquad\)stop請求將關閉網關的進出口,丟棄到客戶端的連接並且從內核中擦除當前的LIO連接。這會將iSCSI網關返回到干凈狀態。當客戶端斷開連接時,客戶端多路徑層將活動I / O重新調度到其他iSCSI網關。
移除配置:
ceph-ansible包提供了一個Ansible手冊,用於移除iSCSI網關配置和連接RBD images。Ansible手冊是/usr/share/ceph-ansible/purge_gateways.yml。當執行Ansible playbook時,系統會提示選擇清除操作的類型:
lio:
在該模式下,所有iSCSI網關定義的LIO配置都將被清除。Ceph存儲集群中創建的硬盤將保持不變。
all:
當選則all時,與LIO配置一同移除還有iSCSI網關環境中定義的所有RBD images,其它不相關的RBD images並不會被移除。確保選擇了正確的模式,該操作將刪除所有數據。
[root@rh7-iscsi-client ceph-ansible]# ansible-playbook purge_gateways.yml
Which configuration elements should be purged? (all, lio or abort) [abort]: all
PLAY [Confirm removal of the iSCSI gateway configuration] *********************
GATHERING FACTS ***************************************************************
ok: [localhost]
TASK: [Exit playbook if user aborted the purge] *******************************
skipping: [localhost]
TASK: [set_fact ] *************************************************************
ok: [localhost]
PLAY [Removing the gateway configuration] *************************************
GATHERING FACTS ***************************************************************
ok: [ceph-igw-1]
ok: [ceph-igw-2]
TASK: [igw_purge | purging the gateway configuration] *************************
changed: [ceph-igw-1]
changed: [ceph-igw-2]
TASK: [igw_purge | deleting configured rbd devices] ***************************
changed: [ceph-igw-1]
changed: [ceph-igw-2]
PLAY RECAP ********************************************************************
ceph-igw-1 : ok=3 changed=2 unreachable=0 failed=0
ceph-igw-2 : ok=3 changed=2 unreachable=0 failed=0
localhost : ok=2 changed=0 unreachable=0 failed=0
使用命令行接口配置iSCSI Target
Ceph iSCSI網關既是iSCSI target節點也是Ceph client節點。Ceph iSCSI網關可以是一個單獨的節點,也可以托管於Ceph對象存儲磁盤(OSD)節點。完成以下步驟后,將安裝並配置Ceph iSCSI網關進行基本操作。
要求:
- 運行中的Ceph Luminous(12.2.x)或更新的集群
- Red Hat Enterprise Linux/CentOS 7.5 (or newer); Linux kernel v4.16 (or newer)
- 必須從你的Linux 發行版的軟件倉庫安裝下列包:
- targetcli-2.1.fb47 or newer package
- python-rtslib-2.1.fb68 or newer package
- tcmu-runner-1.4.0 or newer package
- ceph-iscsi-3.2 or newer package
在繼續安裝章節前,需要在Ceph iSCSI網關節點執行以下步驟:
- 如果Ceph iSCSI網關沒有和OSD節點在一起,從存儲集群中運行的Ceph節點的
/etc/ceph目錄下復制Ceph配置文件到iSCSI網關節點。iSCSI網關節點上的Ceph配置文件必須存在於/etc/ceph目錄下。 - 安裝並配置Ceph Command-line Interface。
- 如果需要,打開防火牆上的TCP 3260和5000端口。
- 創建一個新的或使用已存在的RBD。
安裝:
如果使用上游ceph-iscsi包,請遵循手動安裝說明。
基於rpm指令執行以下命令:
- 在所有iSCSI網關節點上,使用root 安裝 ceph-iscsi包:
> # yum install ceph-iscsi
- 在所有iSCSI網關節點上,使用root 安裝 tcmu-runner包:
> # yum install tcmu-runner
構建:
- gwcli需要一個名為rbd的池,因此它可以存儲像iSCSI配置這樣的元數據。檢查這個池是否已經創建運行:
> # ceph osd lspools
如果不存在,創建資源池的操作可在RADOS pool operations page 找到。
- 在iSCSI網關節點上,使用root在
/etc/ceph目錄下創建名為iscsi-gateway.cfg文件:
> # touch /etc/ceph/iscsi-gateway.cfg
-
編輯
iscsi-gateway.cfg文件,添加以下內容:[config] # Name of the Ceph storage cluster. A suitable Ceph configuration file allowing # access to the Ceph storage cluster from the gateway node is required, if not # colocated on an OSD node. cluster_name = ceph # Place a copy of the ceph cluster's admin keyring in the gateway's /etc/ceph # drectory and reference the filename here gateway_keyring = ceph.client.admin.keyring # API settings. # The API supports a number of options that allow you to tailor it to your # local environment. If you want to run the API under https, you will need to # create cert/key files that are compatible for each iSCSI gateway node, that is # not locked to a specific node. SSL cert and key files *must* be called # 'iscsi-gateway.crt' and 'iscsi-gateway.key' and placed in the '/etc/ceph/' directory # on *each* gateway node. With the SSL files in place, you can use 'api_secure = true' # to switch to https mode. # To support the API, the bear minimum settings are: api_secure = false # Additional API configuration options are as follows, defaults shown. # api_user = admin # api_password = admin # api_port = 5001 # trusted_ip_list = 192.168.0.10,192.168.0.11
2. 使用root,將文件復制到所有iSCSI網關節點。
-
在所有iSCSI網關節點上,使用root用戶,啟用並開啟API服務:
# systemctl daemon-reload
# systemctl enable rbd-target-api
# systemctl start rbd-target-api
配置:
gwcli將創建和配置iSCSI target和RBD images,並復制上一節的網關設置中的配置。較低層的工具,如targetcli和rbd,可以用來查詢本地配置,但不應該用來修改它。下一節將演示如何創建iSCSI target並將RBD image導出為LUN 0。
-
在一個iSCSI網關節點,使用root,開啟iSCSI網關命令行接口:
# gwcli
-
轉到iscsi-target 並創建一個名為
iqn.2003-01.com.redhat.iscsi-gw:iscsi-igw的target:/> cd /iscsi-target
/iscsi-target> create iqn.2003-01.com.redhat.iscsi-gw:iscsi-igw -
創建iSCSI網關。下面使用的ip將用於iSCSI數據,如讀和寫命令。它們可以是trusted_ip_list中列出的用於管理操作的相同ip,但是建議使用不同的ip。
/iscsi-target> cd iqn.2003-01.com.redhat.iscsi-gw:iscsi-igw/gateways
/iscsi-target...-igw/gateways> create ceph-gw-1 10.172.19.21
/iscsi-target...-igw/gateways> create ceph-gw-2 10.172.19.22如果不使用RHEL/CentOS或使用上游或ceph-iscsi-test內核,則必須使用skipcheck =true參數。這將避免紅帽內核和rpm檢查:
/iscsi-target> cd iqn.2003-01.com.redhat.iscsi-gw:iscsi-igw/gateways
/iscsi-target...-igw/gateways> create ceph-gw-1 10.172.19.21 skipchecks=true
/iscsi-target...-igw/gateways> create ceph-gw-2 10.172.19.22 skipchecks=true -
在rbd池中新增名為disk_1的RBD image:
/iscsi-target...-igw/gateways> cd /disks
/disks> create pool=rbd image=disk_1 size=90G -
新建一個名為iqn.1994-05.com.redhat:rh7-client的initiator 客戶端:
/disks> cd /iscsi-target/iqn.2003-01.com.redhat.iscsi-gw:iscsi-igw/hosts
/iscsi-target...eph-igw/hosts> create iqn.1994-05.com.redhat:rh7-client -
設置客戶端的CHAP,用戶名為myiscsiusername,密碼為myiscsipassword:
/iscsi-target...at:rh7-client> auth username=myiscsiusername password=myiscsipassword
-
給客戶端添加硬盤:
/iscsi-target...at:rh7-client> disk add rbd/disk_1
配置iSCSI Initiators
iSCSI Initiator for Linux
准備:
- iscsi-initiator-utils包
- device-mapper-multipath包
安裝:
安裝iSCSI initiator和multipath工具:
# yum install iscsi-initiator-utils device-mapper-multipath
配置:
- 創建默認的
/etc/multipath.conf文件並啟用multipathd服務:
# mpathconf --enable --with_multipathd y
- 添加以下內容到
/etc/multipath.conf文件:
devices {
device {
vendor "LIO-ORG"
hardware_handler "1 alua"
path_grouping_policy "failover"
path_selector "queue-length 0"
failback 60
path_checker tur
prio alua
prio_args exclusive_pref_bit
fast_io_fail_tmo 25
no_path_retry queue
}
}
- 重啟multipathd服務:
# systemctl reload multipathd
iSCIS發現及安裝:
- 如果CHAP已安裝在iSCSI網關,請通過更新相應的
/etc/iscsi/iscsid.conf來提供CHAP的用戶和密碼。 - 發現target門戶:
# iscsiadm -m discovery -t st -p 192.168.56.101
192.168.56.101:3260,1 iqn.2003-01.org.linux-iscsi.rheln1
192.168.56.102:3260,2 iqn.2003-01.org.linux-iscsi.rheln1
- 登錄:
# iscsiadm -m node -T iqn.2003-01.org.linux-iscsi.rheln1 -l
Multipath IO安裝:
multipath守護進程(multipathd)將自動根據multipath.conf的設置來設置設備。運行multipath命令顯示故障轉移配置中的設備設置,每個路徑都有一個優先級組。
# multipath -ll
mpathbt (360014059ca317516a69465c883a29603) dm-1 LIO-ORG ,IBLOCK
size=1.0G features='0' hwhandler='1 alua' wp=rw
|-+- policy='queue-length 0' prio=50 status=active
| `- 28:0:0:1 sde 8:64 active ready running
`-+- policy='queue-length 0' prio=10 status=enabled
`- 29:0:0:1 sdc 8:32 active ready running
現在你可以像使用多路徑iSCSI磁盤一樣使用RBD image。
監視 iSCSI網關
Ceph為iSCSI網關環境提供了一個額外的工具,用於監視導出的RADOS塊設備(RBD) images的性能。
gwtop工具是一個類似於top的工具,它顯示通過iSCSI導出到客戶端的RBD images的聚合性能指標。度量來自性能度量域代理(PMDA)。來自Linux-IO target(LIO) PMDA的信息用於列出每個導出的RBD image及其連接的客戶機及其關聯的I/O指標。
要求:
- 運行中的Ceph iSCSI網
安裝:
- 使用root在每個iSCSI網關節點安裝
ceph-iscsi-tools包:
# yum install ceph-iscsi-tools
- 使用root在每個iSCSI網關節點安裝
co-pilot包:
# yum install pcp
- 使用root在每個iSCSI網關節點安裝LIO PMDA包:
# yum install pcp-pmda-lio
- 使用root在每個iSCSI網關節點上啟用並開啟performance co-pilot服務:
# systemctl enable pmcd
# systemctl start pmcd
- 使用root注冊pcp-pmda-lio代理:
cd /var/lib/pcp/pmdas/lio
./Install
默認情況下,默認情況下,gwtop假定iSCSI網關配置對象存儲在rbd池中名為gateway.conf的RADOS對象中。此配置定義了用於收集性能統計信息的iSCSI網關。這可以通過使用-g或-c標志覆蓋。參見gwtop --help 了解更多細節。
LIO配置決定從性能副駕駛中提取哪種類型的性能統計信息。當gwtop啟動時,它查看LIO配置,如果找到用戶空間磁盤,則gwtop自動選擇LIO收集器。
"gwtop"輸出示例
gwtop 2/2 Gateways CPU% MIN: 4 MAX: 5 Network Total In: 2M Out: 3M 10:20:00
Capacity: 8G Disks: 8 IOPS: 503 Clients: 1 Ceph: HEALTH_OK OSDs: 3
Pool.Image Src Size iops rMB/s wMB/s Client
iscsi.t1703 500M 0 0.00 0.00
iscsi.testme1 500M 0 0.00 0.00
iscsi.testme2 500M 0 0.00 0.00
iscsi.testme3 500M 0 0.00 0.00
iscsi.testme5 500M 0 0.00 0.00
rbd.myhost_1 T 4G 504 1.95 0.00 rh460p(CON)
rbd.test_2 1G 0 0.00 0.00
rbd.testme 500M 0 0.00 0.00
在客戶端列中,(CON)表示iSCSI啟動程序(客戶端)當前已登錄到iSCSI網關。如果顯示-multi-,則多個客戶機被映射到單個RBD image。
