當(dāng)前位置:首頁 >  站長 >  編程技術(shù) >  正文

Ceph RBD mirror介紹以及原理分析

 2017-04-21 15:43  來源: 互聯(lián)網(wǎng)   我來投稿 撤稿糾錯(cuò)

  域名預(yù)訂/競價(jià),好“米”不錯(cuò)過

1.Ceph RBD mirror簡介

Ceph采用的是強(qiáng)一致性同步模型,所有副本都必須完成寫操作才算一次寫入成功,這就導(dǎo)致不能很好地支持跨域部署,因?yàn)槿绻北驹诋惖兀W(wǎng)絡(luò)延遲就會很大,拖垮整個(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對應(yīng)名稱為ceph的集群名配置,而/etc/ceph/openstack.conf則對應(yīng)名稱為openstack的Ceph集群。密鑰文件命名也一樣。

假設(shè)我們在server-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目錄下即可,并且指定配置文件和密鑰文件名,如下:

  1. cd /etc/ceph 
  2. cp ceph.conf server-31.conf 
  3. cp ceph.client.admin.keyring server-31.client.admin.keyring 
  4. scp server-32:/etc/ceph/ceph.conf server-32.conf 
  5. scp server-32:/etc/ceph/ceph.client.admin.keyring server-32.client.admin.keyring 

最后ceph配置如下:

  1. [root@server-31 ceph]# ll server* 
  2. -rw-r--r-- 1 root root 137 Jan 23 11:58 server-31.client.admin.keyring 
  3. -rw-r--r-- 1 root root 497 Jan 23 11:59 server-31.conf 
  4. -rw-r--r-- 1 root root 129 Jan 23 11:28 server-32.client.admin.keyring 
  5. -rw-r--r-- 1 root root 276 Jan 23 11:33 server-32.conf 

請確認(rèn)ceph用戶具有讀權(quán)限,否則服務(wù)起不來

驗(yàn)證:

  1. [root@server-31 ceph]# ceph --cluster server-31 df 
  2. GLOBAL
  3.     SIZE     AVAIL     RAW USED     %RAW USED 
  4.     249G      235G       14669M          5.74 
  5. POOLS: 
  6.     NAME              ID     USED     %USED     MAX AVAIL     OBJECTS 
  7.     openstack         5      169M      0.07          235G          81 
  8.     rbd               6         0         0          235G           0 
  9.     int32bit-test     8      1040         0          235G          18 
  10. [root@server-31 ceph]# ceph --cluster server-32 df 
  11. GLOBAL
  12.     SIZE     AVAIL     RAW USED     %RAW USED 
  13.     249G      243G        6413M          2.51 
  14. POOLS: 
  15.     NAME              ID     USED     %USED     MAX AVAIL     OBJECTS 
  16.     rbd               10      114         0          243G           4 
  17.     int32bit-test     13      228         0          243G          10 

開啟journaling功能,可以在創(chuàng)建RBD image時(shí)通過--image-feature參數(shù)指定,也可以通過配置文件設(shè)置默認(rèn)開啟的features,features通過一個(gè)無符號長整型數(shù)的位標(biāo)識,參考CEPH RBD Features,代碼如下:

  1. #define RBD_FEATURE_LAYERING        (1ULL<<0) 
  2. #define RBD_FEATURE_STRIPINGV2      (1ULL<<1) 
  3. #define RBD_FEATURE_EXCLUSIVE_LOCK  (1ULL<<2) 
  4. #define RBD_FEATURE_OBJECT_MAP      (1ULL<<3) 
  5. #define RBD_FEATURE_FAST_DIFF           (1ULL<<4) 
  6. #define RBD_FEATURE_DEEP_FLATTEN        (1ULL<<5) 
  7. #define RBD_FEATURE_JOURNALING          (1ULL<<6) 
  8. #define RBD_FEATURE_DATA_POOL           (1ULL<<7) 

我們設(shè)置default_rbd_features值為125,在所有的配置文件的[global]配置組下配置:

  1. rbd_default_features = 125 

2.2 安裝rbd-mirror服務(wù)

開啟Ceph RBD mirror功能,必須額外安裝rbd-mirror服務(wù),CentOS下直接安裝即可:

  1. yum install -y rbd-mirror 

啟動服務(wù):

  1. systemctl enable ceph-rbd-mirror@admin.service 
  2. systemctl start ceph-rbd-mirror@admin.service 

以上@admin的admin是client的用戶名,我們使用admin這個(gè)用戶。

注意,以上操作,必須在31、32節(jié)點(diǎn)上都執(zhí)行。

2.3 RBD mirror配置

RBD mirror既可以針對一個(gè)pool進(jìn)行配置,此時(shí)pool的每一個(gè)image都會自動同步,也可以針對某一個(gè)RBD image進(jìn)行mirror,此時(shí)只會同步該指定的image,接下來以mirror pool為例。

首先在31、32節(jié)點(diǎn)上創(chuàng)建兩個(gè)相同的pool:

  1. systemctl enable ceph-rbd-mirror@admin.service 
  2. systemctl start ceph-rbd-mirror@admin.service 

開啟pool mirror功能:

  1. rbd --cluster server-31 mirror pool enable int32bit-test pool 
  2. rbd --cluster server-32 mirror pool enable int32bit-test pool 

分別設(shè)置peer集群,即需要同步的目標(biāo)集群,這里我們設(shè)置他們互為peer:

  1. rbd --cluster server-31 mirror pool peer add int32bit-test client.admin@server-32 
  2. rbd --cluster server-32 mirror pool peer add int32bit-test client.admin@server-31 

查看peer狀態(tài):

  1. # rbd -p int32bit-test mirror pool info 
  2. Mode: pool 
  3. Peers: 
  4.   UUID                                 NAME      CLIENT 
  5.   068cd9a1-a7ff-4120-8194-88261e37a39a server-32 client.admin 

在31集群上創(chuàng)建一個(gè)rbd image,并在server-32集群上查看是否同步:

  1. rbd --cluster server-31 -p int32bit-test create rbd-mirror-test --size 1024 
  2. rbd --cluster server-32 -p int32bit-test info rbd-mirror-test 
  3. rbd image 'rbd-mirror-test'
  4.         size 1024 MB in 256 objects 
  5.         order 22 (4096 kB objects) 
  6.         block_name_prefix: rbd_data.ada71ca0c5fa 
  7.         format: 2 
  8.         features: layering, exclusive-lock, object-map, fast-diff, deep-flatten, journaling 
  9.         flags: 
  10.         journal: ada71ca0c5fa 
  11.         mirroring state: enabled 
  12.         mirroring global id: 163688ba-52fe-4610-a3d5-eb90c663bd4c 
  13.         mirroring primaryfalse 

從結(jié)果上看,我們在server-31集群上創(chuàng)建的image已經(jīng)同步到server-32上,并且從info中可以查看mirror信息。其中mirroring primary屬性標(biāo)明是否主image,只有primary image才能寫,非primary image是只讀的,不能進(jìn)行寫操作。通過rbd命令可以把主image降級為非primary image,或者把非primary image提升為prmary image,換句話說,rbd mirror不支持AA模式,只支持主備模式。除此之外,mirror目前只支持1對1,不支持一對多模式,即不能設(shè)置多個(gè)peer。

可以使用rbd mirror image status命令查看同步狀態(tài):

  1. [root@server-31 int32bit]# rbd --cluster server-32 mirror image status int32bit-test/rbd-mirror-test 
  2. rbd-mirror-test: 
  3.   global_id:   163688ba-52fe-4610-a3d5-eb90c663bd4c 
  4.   state:       up+syncing 
  5.   description: bootstrapping, OPEN_LOCAL_IMAGE 
  6.   last_update: 2017-01-24 11:42:37 

syncing表示正在同步,同步完成后狀態(tài)為replaying。也可以通過rbd mirror pool status查看整個(gè)pool的同步狀態(tài):

  1. # rbd --cluster server-32 mirror pool status  --verbose int32bit-test 
  2. health: OK 
  3. images: 5 total 
  4.     4 replaying 
  5.     1 stopped 
  6.     ... 

當(dāng)health為OK時(shí),說明所有image同步完成。

2.4 關(guān)于map操作

當(dāng)RBD image開啟了某些高級特性后,內(nèi)核可能不支持,因此不能執(zhí)行rbd map操作,否則出現(xiàn)RBD image feature set mismatch錯(cuò)誤。

  1. # rbd map int32bit-test/mirror-test 
  2. rbd: sysfs write failed 
  3. RBD image feature set mismatch. You can disable features unsupported by the kernel with "rbd feature disable"
  4. 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模塊:

  1. yum install rbd-nbd 

map image到本地nbd設(shè)備:

  1. # rbd nbd map int32bit-test/mirror-test 
  2. /dev/nbd0 

安裝文件系統(tǒng)后就可以掛載到本地文件系統(tǒng)了:

  1. mkfs.ext4 /dev/nbd0 
  2. 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),首先會嘗試寫入journal,一旦寫入完成會向client發(fā)起ACK確認(rèn),此時(shí)開始執(zhí)行底層的image寫入操作,與此同時(shí)rbd-mirror開始根據(jù)journal執(zhí)行回放操作,同步到遠(yuǎn)端的ceph集群中。如圖所示:

需要注意的是,一旦同步出現(xiàn)腦裂情況,rbd-mirror將中止同步操作,此時(shí)你必須手動決定哪邊的image是有用的,然后通過手動執(zhí)行rbd mirror image resync命令恢復(fù)同步。

4.Ceph RBD mirror在Openstack上的實(shí)踐

目前很多用戶都會選擇使用Ceph作為Openstack后端存儲,對接Glance、Nova以及Cinder服務(wù),甚至使用RGW對接Swift API。目前Openstack也對異地容災(zāi)支持也不太好,可選的多region方案也存在很多問題。Openstack異地容災(zāi)的關(guān)鍵是存儲的容災(zāi),即塊設(shè)備容災(zāi),這些包括了用戶的所有虛擬機(jī)根磁盤、glance鏡像以及cinder數(shù)據(jù)卷,DRBD是一種策略。如果能夠把RBD mirror應(yīng)用到Openstack中,或許能夠解決異地容災(zāi)問題。

Openstack后端開啟mirror功能,并不需要額外修改Openstack的配置,只需要部署rbd-mirror服務(wù)并對Openstack使用的pool開啟mirror功能即可。

【本文是51CTO專欄作者“付廣平”的原創(chuàng)文章,如需轉(zhuǎn)載請通過51CTO獲得聯(lián)系】

戳這里,看該作者更多好文

 

申請創(chuàng)業(yè)報(bào)道,分享創(chuàng)業(yè)好點(diǎn)子。點(diǎn)擊此處,共同探討創(chuàng)業(yè)新機(jī)遇!

相關(guān)文章

熱門排行

信息推薦