域名預(yù)訂/競(jìng)價(jià),好“米”不錯(cuò)過
1.Ceph RBD mirror簡介
Ceph采用的是強(qiáng)一致性同步模型,所有副本都必須完成寫操作才算一次寫入成功,這就導(dǎo)致不能很好地支持跨域部署,因?yàn)槿绻北驹诋惖?,網(wǎng)絡(luò)延遲就會(huì)很大,拖垮整個(gè)集群的寫性能。因此,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集群開啟journal特性。
我們知道一個(gè)ceph client節(jié)點(diǎn)可以同時(shí)訪問多個(gè)Ceph集群,所有的ceph命令都可以通過-–cluster參數(shù)指定集群名字(更確切地說應(yīng)該是一個(gè)命名空間),不指定該參數(shù),則默認(rèn)值為ceph,集群名字是通過/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í)訪問這兩個(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ù)起不來
驗(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
開啟journaling功能,可以在創(chuàng)建RBD image時(shí)通過--image-feature參數(shù)指定,也可以通過配置文件設(shè)置默認(rèn)開啟的features,features通過一個(gè)無符號(hào)長整型數(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ù)
開啟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,接下來以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
開啟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才能寫,非primary image是只讀的,不能進(jìn)行寫操作。通過rbd命令可以把主image降級(jí)為非primary image,或者把非primary image提升為prmary image,換句話說,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。也可以通過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í),說明所有image同步完成。
2.4 關(guān)于map操作
當(dāng)RBD image開啟了某些高級(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è)備,通過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
由此解決了無法map的問題。
3.Ceph RBD mirror原理介紹
Ceph RBD mirror原理其實(shí)和mysql的主從同步原理非常類似,簡單地說就是通過日志進(jìn)行回放(replay)。這里僅簡單介紹下。
前面提到RBD mirror必須依賴于journeling特性,且需要額外部署rbd-mirror服務(wù)。
rbd-mirror服務(wù)負(fù)責(zé)不同Ceph集群的數(shù)據(jù)同步,當(dāng)用戶執(zhí)行IO write操作時(shí)(必須寫入primary image),首先會(huì)嘗試寫入journal,一旦寫入完成會(huì)向client發(fā)起ACK確認(rèn),此時(shí)開始執(zhí)行底層的image寫入操作,與此同時(shí)rbd-mirror開始根據(jù)journal執(zhí)行回放操作,同步到遠(yuǎn)端的ceph集群中。如圖所示:
需要注意的是,一旦同步出現(xiàn)腦裂情況,rbd-mirror將中止同步操作,此時(shí)你必須手動(dòng)決定哪邊的image是有用的,然后通過手動(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方案也存在很多問題。Openstack異地容災(zāi)的關(guān)鍵是存儲(chǔ)的容災(zāi),即塊設(shè)備容災(zāi),這些包括了用戶的所有虛擬機(jī)根磁盤、glance鏡像以及cinder數(shù)據(jù)卷,DRBD是一種策略。如果能夠把RBD mirror應(yīng)用到Openstack中,或許能夠解決異地容災(zāi)問題。
Openstack后端開啟mirror功能,并不需要額外修改Openstack的配置,只需要部署rbd-mirror服務(wù)并對(duì)Openstack使用的pool開啟mirror功能即可。
【本文是51CTO專欄作者“付廣平”的原創(chuàng)文章,如需轉(zhuǎn)載請(qǐng)通過51CTO獲得聯(lián)系】
戳這里,看該作者更多好文
申請(qǐng)創(chuàng)業(yè)報(bào)道,分享創(chuàng)業(yè)好點(diǎn)子。點(diǎn)擊此處,共同探討創(chuàng)業(yè)新機(jī)遇!