分布式存储Ceph RBD-Mirror灾备方案(一)原理及存储模式配置

由于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 Journal2、 Journal写入成功后,通知客户端3、 客户端得到响应后,开始写入image3、 备份集群的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/ceph-rbd-mirror@.service ```默认集群名``` Environment=CLUSTER=ceph ```自定义的集群名``` Environment=CLUSTER=91donkey_local shell> systemctl start ceph-rbd-mirror@admin # remote 集群 shell> vim /usr/lib/systemd/system/ceph-rbd-mirror@.service ```默认集群名``` Environment=CLUSTER=ceph ```自定义的集群名``` Environment=CLUSTER=91donkey_remote shell> systemctl start ceph-rbd-mirror@admin

主集群

mirror集群

未完待续......

作者:龍龍小宝