1.Ceph RBD mirror簡介
Ceph采用的是強一致性同步模型,所有副本都必須完成寫操作才算一次寫入成功,這就導致不能很好地支持跨域部署,因為如果副本在異地,網(wǎng)絡延遲就會很大,拖垮整個集群的寫性能。因此,Ceph集群很少有跨域部署的,也就缺乏異地容災。Ceph RBD mirror是Ceph Jewel版本引入的新功能,支持兩個Ceph集群數(shù)據(jù)同步,其原理非常類似mysql的主從同步機制,前者基于journaling,后者基于binlog,二者都是基于日志回放完成主從同步的。
2.Ceph RBD mirror配置
2.1 環(huán)境準備
體驗Ceph RBD mirror功能,必須準備好以下環(huán)境:
- Ceph版本Jewel或以上。
- 兩個Ceph集群,并且這兩個集群可以互通。
- Ceph集群開啟journal特性。
我們知道一個ceph client節(jié)點可以同時訪問多個Ceph集群,所有的ceph命令都可以通過-–cluster參數(shù)指定集群名字(更確切地說應該是一個命名空間),不指定該參數(shù),則默認值為ceph,集群名字是通過/etc/ceph目錄下的配置文件名區(qū)分的,/etc/ceph/ceph.conf對應名稱為ceph的集群名配置,而/etc/ceph/openstack.conf則對應名稱為openstack的Ceph集群。密鑰文件命名也一樣。
假設我們在server-31、server-32上都部署了兩套獨立的allinone ceph環(huán)境,分別命名為31節(jié)點、32節(jié)點,這兩個環(huán)境的ceph版本都是Jewel。在31節(jié)點上同時訪問這兩個ceph集群,只需要復制配置文件到/etc/ceph目錄下即可,并且指定配置文件和密鑰文件名,如下:
- cd /etc/ceph
- cp ceph.conf server-31.conf
- cp ceph.client.admin.keyring server-31.client.admin.keyring
- scp server-32:/etc/ceph/ceph.conf server-32.conf
- scp server-32:/etc/ceph/ceph.client.admin.keyring server-32.client.admin.keyring
最后ceph配置如下:
- [root@server-31 ceph]# ll server*
- -rw-r--r-- 1 root root 137 Jan 23 11:58 server-31.client.admin.keyring
- -rw-r--r-- 1 root root 497 Jan 23 11:59 server-31.conf
- -rw-r--r-- 1 root root 129 Jan 23 11:28 server-32.client.admin.keyring
- -rw-r--r-- 1 root root 276 Jan 23 11:33 server-32.conf
請確認ceph用戶具有讀權限,否則服務起不來
驗證:
- [root@server-31 ceph]# ceph --cluster server-31 df
- GLOBAL:
- SIZE AVAIL RAW USED %RAW USED
- 249G 235G 14669M 5.74
- POOLS:
- NAME ID USED %USED MAX AVAIL OBJECTS
- openstack 5 169M 0.07 235G 81
- rbd 6 0 0 235G 0
- int32bit-test 8 1040 0 235G 18
- [root@server-31 ceph]# ceph --cluster server-32 df
- GLOBAL:
- SIZE AVAIL RAW USED %RAW USED
- 249G 243G 6413M 2.51
- POOLS:
- NAME ID USED %USED MAX AVAIL OBJECTS
- rbd 10 114 0 243G 4
- int32bit-test 13 228 0 243G 10
開啟journaling功能,可以在創(chuàng)建RBD image時通過--image-feature參數(shù)指定,也可以通過配置文件設置默認開啟的features,features通過一個無符號長整型數(shù)的位標識,參考CEPH RBD Features,代碼如下:
- #define RBD_FEATURE_LAYERING (1ULL<<0)
- #define RBD_FEATURE_STRIPINGV2 (1ULL<<1)
- #define RBD_FEATURE_EXCLUSIVE_LOCK (1ULL<<2)
- #define RBD_FEATURE_OBJECT_MAP (1ULL<<3)
- #define RBD_FEATURE_FAST_DIFF (1ULL<<4)
- #define RBD_FEATURE_DEEP_FLATTEN (1ULL<<5)
- #define RBD_FEATURE_JOURNALING (1ULL<<6)
- #define RBD_FEATURE_DATA_POOL (1ULL<<7)
我們設置default_rbd_features值為125,在所有的配置文件的[global]配置組下配置:
- rbd_default_features = 125
2.2 安裝rbd-mirror服務
開啟Ceph RBD mirror功能,必須額外安裝rbd-mirror服務,CentOS下直接安裝即可:
- yum install -y rbd-mirror
啟動服務:
- systemctl enable ceph-rbd-mirror@admin.service
- systemctl start ceph-rbd-mirror@admin.service
以上@admin的admin是client的用戶名,我們使用admin這個用戶。
注意,以上操作,必須在31、32節(jié)點上都執(zhí)行。
2.3 RBD mirror配置
RBD mirror既可以針對一個pool進行配置,此時pool的每一個image都會自動同步,也可以針對某一個RBD image進行mirror,此時只會同步該指定的image,接下來以mirror pool為例。
首先在31、32節(jié)點上創(chuàng)建兩個相同的pool:
- systemctl enable ceph-rbd-mirror@admin.service
- systemctl start ceph-rbd-mirror@admin.service
開啟pool mirror功能:
- rbd --cluster server-31 mirror pool enable int32bit-test pool
- rbd --cluster server-32 mirror pool enable int32bit-test pool
分別設置peer集群,即需要同步的目標集群,這里我們設置他們互為peer:
- rbd --cluster server-31 mirror pool peer add int32bit-test client.admin@server-32
- rbd --cluster server-32 mirror pool peer add int32bit-test client.admin@server-31
查看peer狀態(tài):
- # rbd -p int32bit-test mirror pool info
- Mode: pool
- Peers:
- UUID NAME CLIENT
- 068cd9a1-a7ff-4120-8194-88261e37a39a server-32 client.admin
在31集群上創(chuàng)建一個rbd image,并在server-32集群上查看是否同步:
- rbd --cluster server-31 -p int32bit-test create rbd-mirror-test --size 1024
- rbd --cluster server-32 -p int32bit-test info rbd-mirror-test
- rbd image 'rbd-mirror-test':
- size 1024 MB in 256 objects
- order 22 (4096 kB objects)
- block_name_prefix: rbd_data.ada71ca0c5fa
- format: 2
- features: layering, exclusive-lock, object-map, fast-diff, deep-flatten, journaling
- flags:
- journal: ada71ca0c5fa
- mirroring state: enabled
- mirroring global id: 163688ba-52fe-4610-a3d5-eb90c663bd4c
- mirroring primary: false
從結果上看,我們在server-31集群上創(chuàng)建的image已經(jīng)同步到server-32上,并且從info中可以查看mirror信息。其中mirroring primary屬性標明是否主image,只有primary image才能寫,非primary image是只讀的,不能進行寫操作。通過rbd命令可以把主image降級為非primary image,或者把非primary image提升為prmary image,換句話說,rbd mirror不支持AA模式,只支持主備模式。除此之外,mirror目前只支持1對1,不支持一對多模式,即不能設置多個peer。
可以使用rbd mirror image status命令查看同步狀態(tài):
- [root@server-31 int32bit]# rbd --cluster server-32 mirror image status int32bit-test/rbd-mirror-test
- rbd-mirror-test:
- global_id: 163688ba-52fe-4610-a3d5-eb90c663bd4c
- state: up+syncing
- description: bootstrapping, OPEN_LOCAL_IMAGE
- last_update: 2017-01-24 11:42:37
syncing表示正在同步,同步完成后狀態(tài)為replaying。也可以通過rbd mirror pool status查看整個pool的同步狀態(tài):
- # rbd --cluster server-32 mirror pool status --verbose int32bit-test
- health: OK
- images: 5 total
- 4 replaying
- 1 stopped
- ...
當health為OK時,說明所有image同步完成。
2.4 關于map操作
當RBD image開啟了某些高級特性后,內核可能不支持,因此不能執(zhí)行rbd map操作,否則出現(xiàn)RBD image feature set mismatch錯誤。
- # rbd map int32bit-test/mirror-test
- rbd: sysfs write failed
- RBD image feature set mismatch. You can disable features unsupported by the kernel with "rbd feature disable".
- In some cases useful info is found in syslog - try "dmesg | tail" or so.
好在從J版本后,RBD支持將RBD image map為本地nbd設備,通過rbd nbd map命令即可映射為本地nbd設備。首先需要安裝rbd-nbd模塊:
- yum install rbd-nbd
map image到本地nbd設備:
- # rbd nbd map int32bit-test/mirror-test
- /dev/nbd0
安裝文件系統(tǒng)后就可以掛載到本地文件系統(tǒng)了:
- mkfs.ext4 /dev/nbd0
- mount /dev/nbd0 /mnt
由此解決了無法map的問題。
3.Ceph RBD mirror原理介紹
Ceph RBD mirror原理其實和mysql的主從同步原理非常類似,簡單地說就是通過日志進行回放(replay)。這里僅簡單介紹下。
前面提到RBD mirror必須依賴于journeling特性,且需要額外部署rbd-mirror服務。
rbd-mirror服務負責不同Ceph集群的數(shù)據(jù)同步,當用戶執(zhí)行IO write操作時(必須寫入primary image),首先會嘗試寫入journal,一旦寫入完成會向client發(fā)起ACK確認,此時開始執(zhí)行底層的image寫入操作,與此同時rbd-mirror開始根據(jù)journal執(zhí)行回放操作,同步到遠端的ceph集群中。如圖所示:
需要注意的是,一旦同步出現(xiàn)腦裂情況,rbd-mirror將中止同步操作,此時你必須手動決定哪邊的image是有用的,然后通過手動執(zhí)行rbd mirror image resync命令恢復同步。
4.Ceph RBD mirror在Openstack上的實踐
目前很多用戶都會選擇使用Ceph作為Openstack后端存儲,對接Glance、Nova以及Cinder服務,甚至使用RGW對接Swift API。目前Openstack也對異地容災支持也不太好,可選的多region方案也存在很多問題。Openstack異地容災的關鍵是存儲的容災,即塊設備容災,這些包括了用戶的所有虛擬機根磁盤、glance鏡像以及cinder數(shù)據(jù)卷,DRBD是一種策略。如果能夠把RBD mirror應用到Openstack中,或許能夠解決異地容災問題。
Openstack后端開啟mirror功能,并不需要額外修改Openstack的配置,只需要部署rbd-mirror服務并對Openstack使用的pool開啟mirror功能即可。
【本文是51CTO專欄作者“付廣平”的原創(chuàng)文章,如需轉載請通過51CTO獲得聯(lián)系】
戳這里,看該作者更多好文
申請創(chuàng)業(yè)報道,分享創(chuàng)業(yè)好點子。點擊此處,共同探討創(chuàng)業(yè)新機遇!