rbd-mirror 跨集群备份

原理

Todo…

问题

  • 增加了RBD Journal的写入操作,是否会产生写放大现象。
  • Ceph-RBD-Mirror回放日志的的时间间隔
  • RBD Journal的容量大小如何配置
  • RBD Journal存储介质是否可以优化

使用

环境

要求

  • Ceph版本必须为Jewel及之后版本
    RBD-Mirror功能从Jewel版本引入,之前版本不支持该feature。本文以jewel版本为例进行演示。
  • RBD feature必须包含journaling
    RBD-Mirror依赖journal完成工作,类似Mysql的主从同步机制。使用日志回放方法备份数据。

准备

  • 准备两个集群分别为cls17和cls26
    cls17为primary集群,cls26为non-primary集群,将cls17内的RBD数据备份到cls26集群内

  • 在这两个集群中创建同名pool——rmp(RBD Mirror Pool)

ceph-rbd-mirror服务

根据RBD-Mirror的原理,需要在non-primery集群上启动ceph-rbd-mirror服务

安装

1
$ yum install -y rbd-mirror

启动

1
2
$ systemctl enable ceph-rbd-mirror@admin.service
$ systemctl start ceph-rbd-mirror@admin.service

@admin是ceph中的client.admin用户,只是这里省略了client.。关于Ceph用户管理相关操作可以使用ceph auth命令。

Copy Config & keyring

将cls17集群中的ceph.confceph.client.admin.keyringcopy到cls26集群的/etc/ceph目录中,并重命名成cls17.confcls17.client.admin.keyring。然后在cls26集群中可通过指定--cluster cls17来指定访问集群。

备份Pool中所有RBD

配置

Pool Mirror Mode

需要将两个集群的的rmppool的mirror mode设置成pool

集群cls26

1
$ rbd mirror pool enable rmp pool

集群cls17

1
$ rbd mirror pool enable rmp pool --cluster cls17

Add Peer

将Primary集群信息加入到rmppool中。

集群cls26

1
$ rbd mirror pool peer add rmp client.admin@cls17

查看两个集群的peer信息

1
2
3
4
5
6
7
8
9
$ rbd mirror pool info rmp
Mode: pool
Peers:
UUID NAME CLIENT
2c2c1293-0e97-4c57-9bf1-e5f934274758 cls17 client.admin
$
$ rbd mirror pool info rmp --cluster cls17
Mode: pool
Peers: none

至此备份Pool中所有RBD的配置操作已经完成,接下来进行验证操作。

测试

在集群cls17中rmppool创建RBD,并查看集群cls26中rmppool是否有回放操作(RBD是否备份到cls26集群)。由于整个RBD-Mirror依赖于journalingfeature,所以创建RBD时需要指定该feature。若对当前rmppool中存在RBD进行备份,需要先增加jouranlingfeature,使用rbd feature enable rmp/rd1 journaling命令。

集群cls17

1
$ rbd create -p rmp --image-format 2 --image-feature layering,exclusive-lock,object-map,fast-diff,deep-flatten,journaling -s 1G rd1

集群cls26

1
2
$ rbd -p rmp ls
rd1

备份单个RBD

配置

Pool Mirror Mode

将两个集群的rbdpool的mirror mode设置成image

1
$ rbd mirror pool enable rbd image

Add Peer

将Primary集群信息加入到rbdpool中。具体操作方法,同上。

Enable Image Mirror

集群cls17

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
$ rbd info rd1
rbd image 'rd1':
size 1024 MB in 256 objects
order 22 (4096 kB objects)
block_name_prefix: rbd_data.ad616b8b4567
format: 2
features: exclusive-lock, journaling
flags:
journal: ad616b8b4567
mirroring state: disabled
$ rbd mirror image enable rbd/rd1
Mirroring enabled
$ rbd info rd1
rbd image 'rd1':
size 1024 MB in 256 objects
order 22 (4096 kB objects)
block_name_prefix: rbd_data.ad616b8b4567
format: 2
features: exclusive-lock, journaling
flags:
journal: ad616b8b4567
mirroring state: enabled
mirroring global id: f0c9972d-7585-4bda-a486-baa9a6f96eb5
mirroring primary: true

集群cls26

1
2
3
4
5
6
7
8
9
10
11
12
$ rbd info rd1
rbd image 'rd1':
size 1024 MB in 256 objects
order 22 (4096 kB objects)
block_name_prefix: rbd_data.8587327b23c6
format: 2
features: exclusive-lock, journaling
flags:
journal: 8587327b23c6
mirroring state: enabled
mirroring global id: f0c9972d-7585-4bda-a486-baa9a6f96eb5
mirroring primary: false

测试

(同上)

无论是全Pool备份,还是单个RBD备份,只要建立mirror关系,只有primary rbd才能处理读写操作