由於rbd mirror的篇幅較長,將分為兩部分介紹說明。
一、介紹
- 1.1 基本原理
a) rbd mirror 的原理與MySQL的主從複製replication非常類似,前者基於journaling,後者基於binlog,簡單地說就是利用日誌進行回放(replay):通過在存儲系統中增加Mirror組件,採用異步複製的方式,實現異地備份。(此處的journal是指Ceph RBD的journal,而不是OSD的journal)
b) 由於ceph在內部是強一致性的,對於跨區域的數據同步是無法接受的,一個請求需要異地返回再確認完成,這個對性能有很大影響,這也是為什麼基本上無法部署跨區域的ceph集群。
- 1.2 工作流程
上圖英文翻譯:
- 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
- 修改默認值(全局配置,默認新創建的 rbd 都開啟 journal 屬性)
# 在每個mon節點的 /etc/ceph/ceph.conf 里加入字段,如果不想所有的rbd都開啟備份模式,還可以創建後再開啟,然後重啟mon服務。 [global] rbd_default_features = 125
- 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 集群
- remote 集群
- 2.9 查看 mirror pool 狀態
shell> rbd mirror pool status 91donkey_pool --verbose
- 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
主集群
mirror集群
未完待續......
作者:龍龍小寶