分佈式存儲Ceph RBD-Mirror災備方案(一)原理及存儲模式配置

由於rbd mirror的篇幅較長,將分為兩部分介紹說明。

一、介紹

  • 1.1 基本原理
分佈式存儲Ceph RBD-Mirror災備方案(一)原理及存儲模式配置

a) rbd mirror 的原理與MySQL的主從複製replication非常類似,前者基於journaling,後者基於binlog,簡單地說就是利用日誌進行回放(replay):通過在存儲系統中增加Mirror組件,採用異步複製的方式,實現異地備份。(此處的journal是指Ceph RBD的journal,而不是OSD的journal)

b) 由於ceph在內部是強一致性的,對於跨區域的數據同步是無法接受的,一個請求需要異地返回再確認完成,這個對性能有很大影響,這也是為什麼基本上無法部署跨區域的ceph集群。

  • 1.2 工作流程
分佈式存儲Ceph RBD-Mirror災備方案(一)原理及存儲模式配置

上圖英文翻譯:

  • 1、 當接收到一個寫入請求後,I/O會先寫入主集群的Image Journal
  • 2、 Journal寫入成功後,通知客戶端
  • 3、 客戶端得到響應後,開始寫入image
  • 3、 備份集群的mirror進程發現主集群的Journal有更新後,從主集群的Journal讀取數據,寫入備份集群(和上面序號一樣,是因為這兩個過程同時發生)
  • 4、 備份集群寫入成功後,會更新主集群Journal中的元數據,表示該I/O的Journal已經同步完成
  • 4、 主集群會定期檢查,刪除已經寫入備份集群的Journal數據。

以上就是一個rbd-mirror工作週期內的流程,在現有的Jewel版本中30s為一次工作週期,暫時不能改變這個週期時間。

  • 1.3 優點

- 1.3.1 當副本在異地的情況下,減少了單個集群不同節點間的數據寫入延時;

- 1.3.2 減少本地集群或異地集群由於意外斷電導致的數據丟失;

  • 1.4 單向備份與雙向備份

- 雙向備份:兩個集群之間互相同步,兩個集群都要運行rbd-mirror進程。

- 單向備份:分為主集群和從集群,只在從集群運行rbd-mirror進程,主集群的修改會自動同步到從集群。

  • 1.5 ceph mirror 是基於存儲池進行的peer,ceph支持兩種模式的鏡像:

- 存儲池模式

一個存儲池內的所有鏡像都會進行備份

- 鏡像模式

只有指定的鏡像才會進行備份

  • 1.6 安裝須知

- RBD 鏡像功能需要 Ceph Jewel 或更新的發行版本;

- 目前Jewel版本只支持一對一,不支持一對多;

- 兩個集群 (local和remote) 需要能夠互通,且具有相同名字的Pool;

- RBD mirroring 依賴兩個新的rbd屬性

- journaling:啟動後會記錄image的事件

- mirroring:明確告訴rbd-mirror需要複製這個鏡像

二、存儲池模式配置

  • 2.1 配置 rbd features 值

- 查看默認值

shell> ceph daemon /var/run/ceph/ceph-mon.$HOSTNAME.asok config show | grep features
分佈式存儲Ceph RBD-Mirror災備方案(一)原理及存儲模式配置

- 修改默認值(全局配置,默認新創建的 rbd 都開啟 journal 屬性)

# 在每個mon節點的 /etc/ceph/ceph.conf 里加入字段,如果不想所有的rbd都開啟備份模式,還可以創建後再開啟,然後重啟mon服務。
[global]
rbd_default_features = 125
分佈式存儲Ceph RBD-Mirror災備方案(一)原理及存儲模式配置

  • 2.2 創建存儲池
# 在主集群(以下簡稱 local )和備份集群(以下簡稱 remote )中分別執行
shell> ceph osd pool create 91donkey_pool 128 128
pool '91donkey_pool' created
shell> ceph osd pool application enable 91donkey_pool rbd
enabled application 'rbd' on pool '91donkey_pool'
  • 2.3 啟用存儲池mirror功能
# 在 local 和 remote 兩個集群中分別執行
# 語法:rbd mirror pool enable|disable {pool-name} {mode}
shell> rbd mirror pool enable 91donkey_pool pool
  • 2.4 創建RBD
# local 集群
shell> rbd create -p 91donkey_pool volume-b97558b2-fba7-11e9-8ce0-5254003111cb --size=10240
  • 2.5 查看 local 集群的 image 是否具有 journaling 屬性

開啟 exclusive-lock 和 journaling 屬性後才會記錄 image 的事件,才可以被 rbd-mirror 檢測到並同步到從集群

shell> rbd info 91donkey_pool/volume-b97558b2-fba7-11e9-8ce0-5254003111cb
rbd image 'volume-b97558b2-fba7-11e9-8ce0-5254003111cb':
 size 10 GiB in 2560 objects
 order 22 (4 MiB objects)
 id: 763296b8b4567
 block_name_prefix: rbd_data.763296b8b4567
 format: 2
 features: layering, exclusive-lock, object-map, fast-diff, deep-flatten, journaling
 op_features: 
 flags: 
 create_timestamp: Thu Oct 31 14:29:12 2019
 journal: 763296b8b4567
 mirroring state: enabled
 mirroring global id: 0802f1a4-3c84-4c5f-b7ac-ee27f11cf21d
 mirroring primary: true
  • 2.6 禁用部分 features 屬性
shell> rbd feature disable 91donkey_pool/volume-b97558b2-fba7-11e9-8ce0-5254003111cb fast-diff
shell> rbd feature disable 91donkey_pool/volume-b97558b2-fba7-11e9-8ce0-5254003111cb object-map
shell> rbd feature disable 91donkey_pool/volume-b97558b2-fba7-11e9-8ce0-5254003111cb deep-flatten
# 再次查看 local 集群的 image 屬性
shell> rbd info 91donkey_pool/volume-b97558b2-fba7-11e9-8ce0-5254003111cb
rbd image 'volume-b97558b2-fba7-11e9-8ce0-5254003111cb':
 size 10 GiB in 2560 objects
 order 22 (4 MiB objects)
 id: 763296b8b4567
 block_name_prefix: rbd_data.763296b8b4567
 format: 2
 features: layering, exclusive-lock, journaling
 op_features: 
 flags: 
 create_timestamp: Thu Oct 31 14:29:12 2019
 journal: 763296b8b4567
 mirroring state: enabled
 mirroring global id: 0802f1a4-3c84-4c5f-b7ac-ee27f11cf21d
 mirroring primary: true
  • 2.7 增加同伴集群

把 local 集群和 remote 集群設為同伴,這個是為了讓 rbd-mirror 進程找到它 peer 的集群存儲池

# 語法: rbd mirror pool peer add {pool-name} {client-name}@{cluster-name}
# local 集群
shell> rbd mirror pool peer add 91donkey_pool client.admin@remote
# remote 集群
shell> rbd mirror pool peer add 91donkey_pool client_admin@local

備註:刪除peer的語法,rbd mirror pool peer remove {pool-name} {peer-uuid}

  • 2.8 查看 peer 的情況

- local 集群

分佈式存儲Ceph RBD-Mirror災備方案(一)原理及存儲模式配置

- remote 集群

分佈式存儲Ceph RBD-Mirror災備方案(一)原理及存儲模式配置

  • 2.9 查看 mirror pool 狀態
shell> rbd mirror pool status 91donkey_pool --verbose
分佈式存儲Ceph RBD-Mirror災備方案(一)原理及存儲模式配置

  • 2.10 集群間配置文件分發
# local 集群
shell> scp /etc/ceph/ceph.conf :/etc/ceph/local.conf
shell> scp /etc/ceph/ceph.client.admin.keyring :/etc/ceph/local.client.admin.keyring
# remote 集群
shell> scp /etc/ceph/ceph.conf :/etc/ceph/remote.conf
shell> scp /etc/ceph/ceph.client.admin.keyring :/etc/ceph/remote.client.admin.keyring
# local and remote 集群
shell> chown -R ceph.ceph /etc/ceph
  • 2.11 開啟 rbd-mirror 的同步進程

需要在兩個集群上都配置,它會同時連接本地和遠程的集群

shell> yum -y install rbd-mirror
# local 集群(-m 指定本集群的monitor ip,本例為10.20.58.191)
shell> rbd-mirror -m 10.20.58.191 --log-file=/var/log/ceph/ceph.rbd.mirror.log -i admin --setuser ceph --setgroup ceph
# remote 集群(-m 指定本集群的monitor ip,本例為10.20.50.71)
shell> rbd-mirror -m 10.20.50.71 --log-file=/var/log/ceph/ceph.rbd.mirror.log -i admin --setuser ceph --setgroup ceph
  • 2.12 配置 rbd-mirror 開機啟動
# 修改集群名字(如果集群自定義了名字,則需要修改)
# local 集群
shell> vim /usr/lib/systemd/system/[email protected]
```默認集群名```
Environment=CLUSTER=ceph
```自定義的集群名```
Environment=CLUSTER=91donkey_local
shell> systemctl start ceph-rbd-mirror@admin
# remote 集群
shell> vim /usr/lib/systemd/system/[email protected]
```默認集群名```
Environment=CLUSTER=ceph
```自定義的集群名```
Environment=CLUSTER=91donkey_remote
shell> systemctl start ceph-rbd-mirror@admin

主集群

分佈式存儲Ceph RBD-Mirror災備方案(一)原理及存儲模式配置

mirror集群

分佈式存儲Ceph RBD-Mirror災備方案(一)原理及存儲模式配置

未完待續......

作者:龍龍小寶

分佈式存儲Ceph RBD-Mirror災備方案(一)原理及存儲模式配置


分享到:


相關文章: