當前位置:首頁 >  站長 >  編程技術 >  正文

Ceph RBD mirror介紹以及原理分析

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

  域名預訂/競價,好“米”不錯過

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目錄下即可,并且指定配置文件和密鑰文件名,如下:

  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 

請確認ceph用戶具有讀權限,否則服務起不來

驗證:

  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時通過--image-feature參數(shù)指定,也可以通過配置文件設置默認開啟的features,features通過一個無符號長整型數(shù)的位標識,參考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) 

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

  1. rbd_default_features = 125 

2.2 安裝rbd-mirror服務

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

  1. yum install -y rbd-mirror 

啟動服務:

  1. systemctl enable ceph-rbd-mirror@admin.service 
  2. 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:

  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 

分別設置peer集群,即需要同步的目標集群,這里我們設置他們互為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)建一個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 

從結果上看,我們在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):

  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查看整個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.     ... 

當health為OK時,說明所有image同步完成。

2.4 關于map操作

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

  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設備,通過rbd nbd map命令即可映射為本地nbd設備。首先需要安裝rbd-nbd模塊:

  1. yum install rbd-nbd 

map image到本地nbd設備:

  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原理其實和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è)新機遇!

相關文章

熱門排行

信息推薦