Ceph採用的是強一致性同步模型,全部副本都必須完成寫操做纔算一次寫入成功,這就致使不能很好地支持跨域部署,由於若是副本在異地,網絡延遲就會很大,拖垮整個集羣的寫性能。所以,Ceph集羣不多有跨域部署的,也就缺少異地容災。Ceph RBD mirror是Ceph Jewel版本引入的新功能,支持兩個Ceph集羣數據同步,其原理很是相似mysql的主從同步機制,前者基於journaling,後者基於binlog,兩者都是基於日誌回放完成主從同步的。node
ceph在內部是強一致性的,這個對於跨區域的狀況數據同步是沒法接受的,一個請求須要異地返回再確認完成,這個在性能上確定是沒法接受的,這就是爲何基本上沒法部署跨區域的ceph集羣, 所以咱們須要有一種機制可以讓咱們在不一樣區域的集羣之間複製塊設備。這個可以幫助咱們實現兩個功能:mysql
簡單來講,就是利用日誌(Journal)進行回放(replay),來完成主從同步。有點相似於Mysql中的binlog。當咱們使用RBD Mirror功能時,須要打開RBDJournal功能(注:不是OSD Journal),此時,全部數據寫操做會先寫入RBDJournal,而後後臺線程再把數據從Journal區域寫入對應的image。同時,還須要啓動rbd-mirror服務,該服務負責監控遠程Ceph集羣的Journal,如有更新,則replay該Journal到本地RBD image。sql
當RBD Journal功能打開後,全部的數據更新請求會先寫入RBD Journal,而後後臺線程再把數據從Journal區域刷新到對應的image區域。RBD journal提供了比較完整的日誌記錄、讀取、變動通知以及日誌回收和空間釋放等功能,能夠認爲是一個分佈式的日誌系統。vim
從上圖所示是進行的主備模式的備份,其實這個只是看怎麼應用了,在裏面是自動實現的主主的模式,雙向同步的,只是在應用中須要注意不要去同時操做同一個image,這個功能是做爲主備去使用的,以備真正有問題的時候去實現故障恢復,這個同步是異步的跨域
1) 當接收到一個寫入請求後,I/O會先寫入主集羣的Image Journal網絡
2) Journal寫入成功後,通知客戶端架構
3) 客戶端獲得響應後,開始寫入imageapp
4) 備份集羣的mirror進程發現主集羣的Journal有更新後,從主集羣的Journal讀取數據,寫入備份集羣(和上面序號同樣,是由於這兩個過程同時發生)異步
5) 備份集羣寫入成功後,會更新主集羣Journal中的元數據,表示該I/O的Journal已經同步完成分佈式
6) 主集羣會按期檢查,刪除已經寫入備份集羣的Journal數據。
7) 以上就是一個rbd-mirror工做週期內的流程,在現有的版本中30s爲一次工做週期,暫時不能改變這個週期時間。
rbd-mirror進程負責將鏡像從一個Ceph集羣同步到另外一個集羣
根據複製的類型,rbd-mirror能夠在單個集羣上或者是鏡像的兩個集羣上都運行
1) 單向備份
當數據從主集羣備份到備用的集羣的時候,rbd-mirror僅在備份羣集上運行。
2) 雙向備份
若是兩個集羣互爲備份的時候,rbd-mirror須要在兩個集羣上都運行。
1) RBD Image模式:RBD image模式下,會把指定的image進行鏡像;
2) Pool模式:而Pool模式則把該Pool中全部的image進行鏡像。
作了mirroring的Image的狀態有:
當第一次對image進行開啓mirroring的時候 .Images 自動 promoted 爲 primary
若是安裝了多個掛載,則強制獨佔鎖的特性是將RBD鎖定到單個客戶機。這有助於解決多個掛載的客戶機試圖對同一對象進行寫操做時的寫衝突狀況。所以,在編寫時,若是一個客戶端首先在對象上創建一個獨佔鎖,那麼另外一個掛載的客戶端將在編寫以前首先檢查是否有對等端在對象上放置了鎖。
啓用此功能後,一次只能有一個客戶機修改RBD設備,特別是在快照建立/刪除等操做期間更改內部RBD結構時。它還爲失敗的客戶端提供了一些保護。例如,若是虛擬機彷佛沒有響應,而您在其餘地方用相同的磁盤啓動了它的副本,那麼第一個副本將在Ceph中被列入黑名單,而且沒法損壞新磁盤。
主機名 |
Public網絡 |
管理網絡 |
集羣網絡 |
說明 |
node001 |
192.168.2.40 |
172.200.50.40 |
192.168.3.40 |
MON,OSD,管理節點 |
node002 |
192.168.2.41 |
172.200.50.41 |
192.168.3.41 |
MON,OSD |
node003 |
192.168.2.42 |
172.200.50.42 |
192.168.3.42 |
MON,OSD |
主機名 |
Public網絡 |
管理網絡 |
集羣網絡 |
說明 |
node004 |
192.168.2.43 |
172.200.50.43 |
192.168.3.43 |
MON,OSD,管理節點 |
node005 |
192.168.2.44 |
172.200.50.44 |
192.168.3.44 |
MON,OSD |
node006 |
192.168.2.45 |
172.200.50.45 |
192.168.3.45 |
MON,OSD |
首先配置兩個集羣,配置的集羣都沒有更更名稱,默認都是ceph,咱們經過配置文件來控制集羣的識別,個人環境是兩套主機集羣,兩臺機器lab8106爲local集羣,lab8107爲remote集羣,準備把lab8106的image備份到lab8107的集羣上
1) 在ceph.conf當中添加
# vim /etc/ceph/ceph.conf rbd default features = 125
2) 具體數字表示意思
Node001 主機:
1) 建立池
# ceph osd pool create rbd 128 128 replicated # ceph osd pool application enable rbd rbd # rados lspools
2) 建立RBD,開啓特殊屬性日誌和排他鎖
# rbd create image-1 --size 1024 --pool rbd --image-feature exclusive-lock,journaling
3) 查看RBD信息
# rbd info rbd/image-1 rbd image 'image-1': size 1GiB in 256 objects order 22 (4MiB objects) block_name_prefix: rbd_data.85596b8b4567 format: 2 features: exclusive-lock, journaling flags: create_timestamp: Fri Apr 12 14:32:49 2019 journal: 85596b8b4567 mirroring state: disabled
# rbd feature disable rbd/image-1 exclusive-lock journaling
4) 開啓存儲池的mirror的模式
模式採用image,須要針對每一個映像明確啓用鏡像
語法:rbd mirror pool enable <pool-name> <mode>
# rbd mirror pool enable rbd image
Node004主機
1) 建立pool
# ceph osd pool create rbd 128 128 replicated # ceph osd pool application enable rbd rbd # rados lspools
2) 開啓存儲池的mirror的模式
# rbd mirror pool enable rbd image
1) 處理配置文件和kerring
# scp /etc/ceph/ceph.conf node004:/etc/ceph/local.conf # scp /etc/ceph/ceph.client.admin.keyring \ node004:/etc/ceph/local.client.admin.keyring
# cp /etc/ceph/ceph.conf /etc/ceph/local.conf # cp /etc/ceph/ceph.client.admin.keyring /etc/ceph/local.client.admin.keyring
# scp /etc/ceph/ceph.conf node001:/etc/ceph/remote.conf # scp /etc/ceph/ceph.client.admin.keyring \ node001:/etc/ceph/remote.client.admin.keyring
# cp /etc/ceph/ceph.conf /etc/ceph/remote.conf # cp /etc/ceph/ceph.client.admin.keyring /etc/ceph/remote.client.admin.keyring
2) 執行完了後在兩臺機器上給予權限 (兩臺主機都要)
# chown ceph:ceph -R /etc/ceph # chown ceph:ceph -R /etc/ceph # ll /etc/ceph/
3) 檢驗上面設置是否完成
# ceph --cluster local mon stat e1: 3 mons at {node001=[v2:192.168.2.40:3300/0,v1:192.168.2.40:6789/0],
# ceph --cluster remote mon stat e1: 3 mons at {node004=[v2:192.168.2.43:3300/0,v1:192.168.2.43:6789/0]
# ceph --cluster local mon stat e1: 3 mons at {node001=[v2:192.168.2.40:3300/0,v1:192.168.2.40:6789/0],
# ceph --cluster remote mon stat e1: 3 mons at {node004=[v2:192.168.2.43:3300/0,v1:192.168.2.43:6789/0]
到這裏就是兩個集羣能夠經過local和remote進行通訊了
1) 語法
rbd mirror pool peer add <pool-name> <client-name>@<cluster-name>
# rbd --cluster local mirror pool peer add rbd client.admin@remote
# rbd --cluster remote mirror pool peer add rbd client.admin@local
2) 查詢peer狀態(node001)
# rbd mirror pool info rbd --cluster local Mode: image Peers: UUID NAME CLIENT a050a0f5-9448-43f2-872f-87c394083871 remote client.admin
# rbd mirror pool info rbd --cluster remote Mode: image Peers: UUID NAME CLIENT 8d7b3fa4-be44-4e25-b0b7-cf4bdb62bf10 local client.admin
3) 查詢存儲池狀態
# rbd mirror pool status rbd --cluster local health: OK images: 0 total
# rbd mirror pool status rbd --cluster remote health: OK images: 0 total
# rbd mirror image enable rbd/image-1
# rbd info rbd/image-1 rbd image 'image-1': size 1GiB in 256 objects order 22 (4MiB objects) block_name_prefix: rbd_data.85756b8b4567 format: 2 features: exclusive-lock, journaling flags: create_timestamp: Sat Apr 13 10:50:37 2019 journal: 85756b8b4567 mirroring state: enabled mirroring global id: 72931f47-e1de-439a-b774-538d84dc8a06 mirroring primary: true ===> 角色 primary
1) 先用調試模式啓動進程看看狀況
l 在node004的機器上執行
# rbd-mirror -d --setuser ceph --setgroup ceph --cluster remote -i admin
2017-01-22 17:43:53.688820 7fc926dc6c40 0 set uid:gid to 167:167 (ceph:ceph)
2017-01-22 17:43:53.688840 7fc926dc6c40 0 ceph version 10.2.5 (c461ee19ecbc0c5c330aca20f7392c9a00730367), process rbd-mirror, pid 32080
node004:~ # rbd list
image-1 <=== 確認 image-1 鏡像 mirror 過來
2) 若是確認沒問題就用服務來控制啓動 (node001, node004)
# zypper in rbd-mirror
3) 修改systemd
Node004
# vim /usr/lib/systemd/system/ceph-rbd-mirror@.service
Environment=CLUSTER=remote
# systemctl daemon-reload
Node001
# vim /usr/lib/systemd/system/ceph-rbd-mirror@.service
Environment=CLUSTER=remote
# systemctl daemon-reload
4) 啓動服務 (node001,node004)
# systemctl start ceph-rbd-mirror@admin.service
# systemctl enable ceph-rbd-mirror@admin.service
5) 查詢鏡像的同步的狀態
# rbd mirror image status rbd/image-1 --cluster remote
image-1:
global_id: dabdbbed-7c06-4e1d-b860-8dd104509565
state: up+replaying
能夠看到,健康狀態OK
http://172.200.50.40:9443/#/block/mirroring
http://172.200.50.43:9443/#/block/mirroring
當RBD image開啓了某些高級特性後,內核可能不支持,所以不能執行rbd map操做,不然出現RBD image feature set mismatch錯誤
# rbd map image-1
rbd: sysfs write failed
RBD image feature set mismatch. Try disabling features unsupported by the kernel with "rbd feature disable".
In some cases useful info is found in syslog - try "dmesg | tail".
rbd: map failed: (6) No such device or address
從J版本後,RBD支持將RBD image map爲本地nbd設備,經過rbd nbd map命令便可映射爲本地nbd設備。
1) 安裝rbd-nbd模塊:
# zypper in rbd-nbd
2) map image到本地nbd設備:
# rbd nbd map rbd/image-1
/dev/nbd0
3) 顯示映射
# rbd nbd list
pid pool image snap device
12339 rbd image-1 - /dev/nbd0
4) 格式化掛載,而且建立文件
# mkfs.ext4 /dev/nbd0
# mount /dev/nbd0 /mnt
# touch /mnt/{1,2,3}
1) 卸載文件
# umount /mnt
# rbd nbd unmap /dev/nbd0
2) 將指定的鏡像降級爲非主要鏡像
l 在node001執行
# rbd mirror image demote rbd/image-1 --cluster=local
3) 查看轉變後,在執行下面一條命令
# rbd info rbd/image-1
rbd image 'image-1':
size 1GiB in 256 objects
order 22 (4MiB objects)
block_name_prefix: rbd_data.2f6f06b8b4567
format: 2
features: layering, exclusive-lock, object-map, fast-diff, deep-flatten, journaling
flags:
create_timestamp: Sat Apr 13 14:56:17 2019
journal: 2f6f06b8b4567
mirroring state: enabled
mirroring global id: f522d2c1-0b8b-446a-b203-eb7ed1774848
mirroring primary: false
4) 將指定的鏡像升級爲主要鏡像
# rbd mirror image promote rbd/image-1 --cluster=remote
# rbd info image-1 rbd image 'image-1': size 1GiB in 256 objects order 22 (4MiB objects) block_name_prefix: rbd_data.5ef56b8b4567 format: 2 features: layering, exclusive-lock, object-map, fast-diff, deep-flatten, journaling flags: create_timestamp: Sat Apr 13 15:19:55 2019 journal: 5ef56b8b4567 mirroring state: enabled mirroring global id: f522d2c1-0b8b-446a-b203-eb7ed1774848 mirroring primary: true
5) 安裝rbd-nbd模塊:
# zypper in rbd-nbd
6) map image到本地nbd設備:
# rbd nbd map rbd/image-1
/dev/nbd0
7) 顯示映射
# rbd nbd list pid pool image snap device 12339 rbd image-1 - /dev/nbd0
8) 格式化掛載,而且建立文件
# mount /dev/nbd0 /mnt # ll /mnt