rbd-mirror新功能

RBD 的 mirroring 功能将会在下一个稳定版本Jewel中实现,这个Jewel版本已经发布了第一个版本10.1.0,这个功能已经在这个发布的版本中实现了

一、基本原理
我们试图解决的或者至少需要克服的问题是,ceph在内部是强一致性的,这个对于跨区域的情况数据同步是无法接受的,一个请求需要异地返回再确认完成,这个在性能上肯定是无法接受的,这就是为什么基本上无法部署跨区域的ceph集群

因此我们需要有一种机制能够让我们在不同区域的集群之间复制块设备。这个能够帮助我们实现两个功能:

  • 灾难恢复
  • 全球块设备分布(跨地理位置)

二、内部的实现

画图.png-34.8kB

从上图所示是进行的主备模式的备份,其实这个只是看怎么应用了,在里面是自动实现的主主的模式,双向同步的,只是在应用中需要注意不要去同时操作同一个image,这个功能是作为主备去使用的,以备真正有问题的时候去实现故障恢复,这个同步是异步的

二、一个新的进程
一个新的守护程序:rbd-mirror 将会负责将一个镜像从一个集群同步到另一个,rbd-mirror需要在两个集群上都配置,它会同时连接本地和远程的集群。在jewel版本中还是一对一的方式,在以后的版本中会实现一对多的,所以在以后的版本可以配置一对多的备份

作为起点,这个功能讲使用配置文件连接集群,使用用户和密钥。使用admin用户就可以了,使用的验证方式就是默认的cephx的方式

为了相互识别,两个集群都需要相互注册使用 rbd mirror pool peer add 命令, 这个在下面会实践

二、镜像
ceph-rbd-mirror-inside.png-80.8kB
The RBD mirroring 依赖两个新的rbd的属性

  • journaling: 启动后会记录image的事件
  • mirroring: 明确告诉rbd-mirror需要复制这个镜像

也有命令可以禁用单独的某个镜像。journaling可以看做是另一个rbd的image(一些rados对象),一般情况下,先写日志,然后返回客户端,然后被写入底层的rbd的image,出于性能考虑,这个journal可以跟它的镜像不在一个存储池当中,目前是一个image一个journal,最近应该会沿用这个策略,直到ceph引入一致性组。关于一致性组的概念就是一组卷,然后用的是一个RBD image。可以在所有的组中执行快照操作,有了一致性的保证,所有的卷就都在一致的状态。当一致性组实现的时候,我们就可以用一个journal来管理所有的RBD的镜像

可以给一个已经存在image开启journal么,可以的,ceph将会将你的镜像做一个快照,然后对快照做一个复制,然后开启journal,这都是后台执行的一个任务

可以启用和关闭单个镜像或者存储池的mirror功能,如果启用了journal功能,那么每个镜像将会被复制

可以使用 rbd mirror pool enable启用它

三、灾难恢复
交叉同步复制是可以的,默认的就是这个方式,这意味着两个地方的存储池名称需要相同的这个会带来两个问题

  • 使用相同的存储做备份做使用会影响性能的
  • 相同的池名称在进行恢复的时候也更容易。openstack里面只需要记录卷ID即可

每个image都有 mirroring_directory 记录当前active的地方。在本地镜像提示为 primary的时候,是可写的并且远程的站点上就会有锁,这个image就是不可写的。只有在primary镜像降级,备份的点升级就可以了,demoted 和 promoted来控制这里,这就是为什么引入了等级制度,一旦备份的地方升级了,那么主的就自动降级了,这就意味着同步的方向就会发生变化了

如果出现脑裂的情况,那么rbd-mirror将会停止同步,你自己需要判断哪个是最新的image,然后手动强制去同步 rbd mirror image resync

上面基本参照的是sebastien翻译的,原文只是做了简短的说明,下面是我的实践部分

下面在我的环境下进行实践

下面的环境是在两个集群上进行的,集群分别为:

  • 机器lab8106
  • 机器lab8107

先启动进程,因为这个是个新功能,所以采取的是进程运行在前台的方式方便找到问题,这个里面因为很容易混淆,所以运行的时候都会说明命令执行的地方

启动rbd-mirror的进程

在lab8106执行命令

1
rbd-mirror -m 192.168.8.106:6789 -d

在lab8107执行命令

1
rbd-mirror -m 192.168.8.107:6789 -d

qidongrbdmirror.png-40.5kB

开启pool的mirror功能

这里因为操作命令需要相互做peer的操作,所以需要提前做个配置文件的操作,将lab8106认为local集群,lab8107位remote集群,这个地方需要做个配置文件调整
注意需要在ceph.conf配置文件中添加

rbd_default_features = 125

在lab8106上执行

1
2
3
4
cp /etc/ceph/ceph.conf /etc/ceph/local.conf
cp /etc/ceph/ceph.client.admin.keyring /etc/ceph/local.client.admin.keyring
scp /etc/ceph/ceph.conf lab8107:/etc/ceph/local.conf
scp /etc/ceph/ceph.client.admin.keyring lab8107:/etc/ceph/local.client.admin.keyring

在lab8107上执行

1
2
3
4
cp /etc/ceph/ceph.conf /etc/ceph/remote.conf
cp /etc/ceph/ceph.client.admin.keyring /etc/ceph/remote.client.admin.keyring
scp /etc/ceph/ceph.conf lab8106:/etc/ceph/remote.conf
scp /etc/ceph/ceph.client.admin.keyring lab8106:/etc/ceph/remote.client.admin.keyring

检验上面设置是否完成
在lab8106执行

1
2
3
4
[root@lab8106 ceph]# ceph --cluster local mon stat
e1: 1 mons at {lab8106=192.168.8.106:6789/0}, election epoch 3, quorum 0 lab8106
[root@lab8106 ceph]# ceph --cluster remote mon stat
e1: 1 mons at {lab8107=192.168.8.107:6789/0}, election epoch 3, quorum 0 lab8107

在lab8107执行

1
2
3
4
root@lab8107:~/ceph# ceph --cluster local mon stat
e1: 1 mons at {lab8106=192.168.8.106:6789/0}, election epoch 3, quorum 0 lab8106
root@lab8107:~/ceph# ceph --cluster remote mon stat
e1: 1 mons at {lab8107=192.168.8.107:6789/0}, election epoch 3, quorum 0 lab8107

准备工作完成了,开始做相关配置
在lab8106上执行

1
2
rbd --cluster local mirror pool enable rbd pool
rbd --cluster remote mirror pool enable rbd pool

如果需要关闭那么执行

1
2
rbd --cluster local mirror pool disable rbd
rbd --cluster remote mirror pool disable rbd

增加 CLUSTER PEER

格式

rbd mirror pool peer add {pool-name} {client-name}@{cluster-name}
使用admin这个账户就可以了

1
2
3
4
[root@lab8106 ceph]# rbd --cluster local mirror pool peer add rbd client.admin@remote
eb08d27f-9e09-484a-a55a-589249cf6c10
[root@lab8106 ceph]# rbd --cluster remote mirror pool peer add rbd client.admin@local
d22bb245-fb20-4273-b847-c8c5e06b2450

查询是否连接好

1
2
3
4
5
6
7
8
9
10
[root@lab8106 ceph]# rbd --cluster local mirror pool info
Mode: pool
Peers:
UUID NAME CLIENT
eb08d27f-9e09-484a-a55a-589249cf6c10 remote client.admin
[root@lab8106 ceph]# rbd --cluster remote mirror pool info
Mode: pool
Peers:
UUID NAME CLIENT
d22bb245-fb20-4273-b847-c8c5e06b2450 local client.admin

如果需要删除

rbd mirror pool peer remove {pool-name} {peer-uuid}

执行

1
2
rbd --cluster local mirror pool peer remove image-pool 55672766-c02b-4729-8567-f13a66893445
rbd --cluster remote mirror pool peer remove image-pool 60c0e299-b38f-4234-91f6-eed0a367be08

验证是否成功

在lab8106上执行

1
2
3
[root@lab8106 ceph]# rbd create testrbd --size 40000
[root@lab8106 ceph]# rbd ls
testrbd

在lab8107上执行

1
2
root@lab8107:~/ceph# rbd ls
testrbd

可以看到镜像已经同步过去了

在lab8107上执行

1
2
3
4
root@lab8107:~/ceph# rbd create testrbd1 --size 40000
root@lab8107:~/ceph# rbd ls
testrbd
testrbd1

在lab8106上执行

1
2
3
[root@lab8106 ceph]# rbd ls
testrbd
testrbd1

双向同步已经可以了

这里提一下,因为内核态的rbd还没有实现一些属性,所以在map的时候会提示没有这个设备,librbd是可以使用的

1
2
3
[root@lab8106 ceph]# rbd map testrbd
rbd: sysfs write failed
rbd: map failed: (6) No such device or address

镜像的升级与降级

1
2
3
4
5
6
7
[root@lab8106 ceph]# rbd --cluster local mirror image demote rbd/testrbd
Image demoted to secondary
[root@lab8106 ceph]# rbd --cluster local mirror image promote rbd/testrbd

[root@lab8106 ceph]# rbd --cluster local mirror image promote rbd/testrbd
rbd: error promoting image to primary
2016-03-30 23:35:13.477096 7ffa50a3dc00 -1 librbd: image is already primary

这里对testrbd做了降级处理和升级处理,那么本地的这个就是只读的,远程的就是可写的

基本的实现就到这里,更多的实践再根据环境需求做就可以了