分布式存储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灾备方案(一)原理及存储模式配置


分享到:


相關文章: