Ceph RBD mirror介紹以及原理分析
1.Ceph RBD mirror簡(jiǎn)介
Ceph采用的是強(qiáng)一致性同步模型,所有副本都必須完成寫(xiě)操作才算一次寫(xiě)入成功,這就導(dǎo)致不能很好地支持跨域部署,因?yàn)槿绻北驹诋惖?,網(wǎng)絡(luò)延遲就會(huì)很大,拖垮整個(gè)集群的寫(xiě)性能。因此,Ceph集群很少有跨域部署的,也就缺乏異地容災(zāi)。Ceph RBD mirror是Ceph Jewel版本引入的新功能,支持兩個(gè)Ceph集群數(shù)據(jù)同步,其原理非常類似mysql的主從同步機(jī)制,前者基于journaling,后者基于binlog,二者都是基于日志回放完成主從同步的。
2.Ceph RBD mirror配置
2.1 環(huán)境準(zhǔn)備
體驗(yàn)Ceph RBD mirror功能,必須準(zhǔn)備好以下環(huán)境:
- Ceph版本Jewel或以上。
 - 兩個(gè)Ceph集群,并且這兩個(gè)集群可以互通。
 - Ceph集群開(kāi)啟journal特性。
 
我們知道一個(gè)ceph client節(jié)點(diǎn)可以同時(shí)訪問(wèn)多個(gè)Ceph集群,所有的ceph命令都可以通過(guò)-–cluster參數(shù)指定集群名字(更確切地說(shuō)應(yīng)該是一個(gè)命名空間),不指定該參數(shù),則默認(rèn)值為ceph,集群名字是通過(guò)/etc/ceph目錄下的配置文件名區(qū)分的,/etc/ceph/ceph.conf對(duì)應(yīng)名稱為ceph的集群名配置,而/etc/ceph/openstack.conf則對(duì)應(yīng)名稱為openstack的Ceph集群。密鑰文件命名也一樣。
假設(shè)我們?cè)趕erver-31、server-32上都部署了兩套獨(dú)立的allinone ceph環(huán)境,分別命名為31節(jié)點(diǎn)、32節(jié)點(diǎn),這兩個(gè)環(huán)境的ceph版本都是Jewel。在31節(jié)點(diǎn)上同時(shí)訪問(wèn)這兩個(gè)ceph集群,只需要復(fù)制配置文件到/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
 
請(qǐng)確認(rèn)ceph用戶具有讀權(quán)限,否則服務(wù)起不來(lái)
驗(yàn)證:
- [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
 
開(kāi)啟journaling功能,可以在創(chuàng)建RBD image時(shí)通過(guò)--image-feature參數(shù)指定,也可以通過(guò)配置文件設(shè)置默認(rèn)開(kāi)啟的features,features通過(guò)一個(gè)無(wú)符號(hào)長(zhǎng)整型數(shù)的位標(biāo)識(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)
 
我們?cè)O(shè)置default_rbd_features值為125,在所有的配置文件的[global]配置組下配置:
- rbd_default_features = 125
 
2.2 安裝rbd-mirror服務(wù)
開(kāi)啟Ceph RBD mirror功能,必須額外安裝rbd-mirror服務(wù),CentOS下直接安裝即可:
- yum install -y rbd-mirror
 
啟動(dòng)服務(wù):
- systemctl enable ceph-rbd-mirror@admin.service
 - systemctl start ceph-rbd-mirror@admin.service
 
以上@admin的admin是client的用戶名,我們使用admin這個(gè)用戶。
注意,以上操作,必須在31、32節(jié)點(diǎn)上都執(zhí)行。
2.3 RBD mirror配置
RBD mirror既可以針對(duì)一個(gè)pool進(jìn)行配置,此時(shí)pool的每一個(gè)image都會(huì)自動(dòng)同步,也可以針對(duì)某一個(gè)RBD image進(jìn)行mirror,此時(shí)只會(huì)同步該指定的image,接下來(lái)以mirror pool為例。
首先在31、32節(jié)點(diǎn)上創(chuàng)建兩個(gè)相同的pool:
- systemctl enable ceph-rbd-mirror@admin.service
 - systemctl start ceph-rbd-mirror@admin.service
 
開(kāi)啟pool mirror功能:
- rbd --cluster server-31 mirror pool enable int32bit-test pool
 - rbd --cluster server-32 mirror pool enable int32bit-test pool
 
分別設(shè)置peer集群,即需要同步的目標(biāo)集群,這里我們?cè)O(shè)置他們互為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)建一個(gè)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
 
從結(jié)果上看,我們?cè)趕erver-31集群上創(chuàng)建的image已經(jīng)同步到server-32上,并且從info中可以查看mirror信息。其中mirroring primary屬性標(biāo)明是否主image,只有primary image才能寫(xiě),非primary image是只讀的,不能進(jìn)行寫(xiě)操作。通過(guò)rbd命令可以把主image降級(jí)為非primary image,或者把非primary image提升為prmary image,換句話說(shuō),rbd mirror不支持AA模式,只支持主備模式。除此之外,mirror目前只支持1對(duì)1,不支持一對(duì)多模式,即不能設(shè)置多個(gè)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。也可以通過(guò)rbd mirror pool status查看整個(gè)pool的同步狀態(tài):
- # rbd --cluster server-32 mirror pool status --verbose int32bit-test
 - health: OK
 - images: 5 total
 - 4 replaying
 - 1 stopped
 - ...
 
當(dāng)health為OK時(shí),說(shuō)明所有image同步完成。
2.4 關(guān)于map操作
當(dāng)RBD image開(kāi)啟了某些高級(jí)特性后,內(nèi)核可能不支持,因此不能執(zhí)行rbd map操作,否則出現(xiàn)RBD image feature set mismatch錯(cuò)誤。
- # 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設(shè)備,通過(guò)rbd nbd map命令即可映射為本地nbd設(shè)備。首先需要安裝rbd-nbd模塊:
- yum install rbd-nbd
 
map image到本地nbd設(shè)備:
- # rbd nbd map int32bit-test/mirror-test
 - /dev/nbd0
 
安裝文件系統(tǒng)后就可以掛載到本地文件系統(tǒng)了:
- mkfs.ext4 /dev/nbd0
 - mount /dev/nbd0 /mnt
 
由此解決了無(wú)法map的問(wèn)題。
3.Ceph RBD mirror原理介紹
Ceph RBD mirror原理其實(shí)和mysql的主從同步原理非常類似,簡(jiǎn)單地說(shuō)就是通過(guò)日志進(jìn)行回放(replay)。這里僅簡(jiǎn)單介紹下。
前面提到RBD mirror必須依賴于journeling特性,且需要額外部署rbd-mirror服務(wù)。
rbd-mirror服務(wù)負(fù)責(zé)不同Ceph集群的數(shù)據(jù)同步,當(dāng)用戶執(zhí)行IO write操作時(shí)(必須寫(xiě)入primary image),首先會(huì)嘗試寫(xiě)入journal,一旦寫(xiě)入完成會(huì)向client發(fā)起ACK確認(rèn),此時(shí)開(kāi)始執(zhí)行底層的image寫(xiě)入操作,與此同時(shí)rbd-mirror開(kāi)始根據(jù)journal執(zhí)行回放操作,同步到遠(yuǎn)端的ceph集群中。如圖所示:
需要注意的是,一旦同步出現(xiàn)腦裂情況,rbd-mirror將中止同步操作,此時(shí)你必須手動(dòng)決定哪邊的image是有用的,然后通過(guò)手動(dòng)執(zhí)行rbd mirror image resync命令恢復(fù)同步。
4.Ceph RBD mirror在Openstack上的實(shí)踐
目前很多用戶都會(huì)選擇使用Ceph作為Openstack后端存儲(chǔ),對(duì)接Glance、Nova以及Cinder服務(wù),甚至使用RGW對(duì)接Swift API。目前Openstack也對(duì)異地容災(zāi)支持也不太好,可選的多region方案也存在很多問(wèn)題。Openstack異地容災(zāi)的關(guān)鍵是存儲(chǔ)的容災(zāi),即塊設(shè)備容災(zāi),這些包括了用戶的所有虛擬機(jī)根磁盤(pán)、glance鏡像以及cinder數(shù)據(jù)卷,DRBD是一種策略。如果能夠把RBD mirror應(yīng)用到Openstack中,或許能夠解決異地容災(zāi)問(wèn)題。
Openstack后端開(kāi)啟mirror功能,并不需要額外修改Openstack的配置,只需要部署rbd-mirror服務(wù)并對(duì)Openstack使用的pool開(kāi)啟mirror功能即可。
【本文是51CTO專欄作者“付廣平”的原創(chuàng)文章,如需轉(zhuǎn)載請(qǐng)通過(guò)51CTO獲得聯(lián)系】


















 
 
 








 
 
 
 