@zphj1987
2016-05-06T15:36:59.000000Z
字数 4779
阅读 5883
ceph
RBD 的 mirroring 功能将会在下一个稳定版本Jewel中实现,这个Jewel版本已经发布了第一个版本10.1.0,这个功能已经在这个发布的版本中实现了
一、基本原理
我们试图解决的或者至少需要克服的问题是,ceph在内部是强一致性的,这个对于跨区域的情况数据同步是无法接受的,一个请求需要异地返回再确认完成,这个在性能上肯定是无法接受的,这就是为什么基本上无法部署跨区域的ceph集群
因此我们需要有一种机制能够让我们在不同区域的集群之间复制块设备。这个能够帮助我们实现两个功能:
二、内部的实现
从上图所示是进行的主备模式的备份,其实这个只是看怎么应用了,在里面是自动实现的主主的模式,双向同步的,只是在应用中需要注意不要去同时操作同一个image,这个功能是作为主备去使用的,以备真正有问题的时候去实现故障恢复,这个同步是异步的
二、一个新的进程
一个新的守护程序:rbd-mirror 将会负责将一个镜像从一个集群同步到另一个,rbd-mirror需要在两个集群上都配置,它会同时连接本地和远程的集群。在jewel版本中还是一对一的方式,在以后的版本中会实现一对多的,所以在以后的版本可以配置一对多的备份
作为起点,这个功能讲使用配置文件连接集群,使用用户和密钥。使用admin用户就可以了,使用的验证方式就是默认的cephx的方式
为了相互识别,两个集群都需要相互注册使用 rbd mirror pool peer add
命令, 这个在下面会实践
二、镜像
The RBD mirroring 依赖两个新的rbd的属性
也有命令可以禁用单独的某个镜像。journaling可以看做是另一个rbd的image(一些rados对象),一般情况下,先写日志,然后返回客户端,然后被写入底层的rbd的image,出于性能考虑,这个journal可以跟它的镜像不在一个存储池当中,目前是一个image一个journal,最近应该会沿用这个策略,直到ceph引入一致性组。关于一致性组的概念就是一组卷,然后用的是一个RBD image。可以在所有的组中执行快照操作,有了一致性的保证,所有的卷就都在一致的状态。当一致性组实现的时候,我们就可以用一个journal来管理所有的RBD的镜像
可以给一个已经存在image开启journal么,可以的,ceph将会将你的镜像做一个快照,然后对快照做一个复制,然后开启journal,这都是后台执行的一个任务
可以启用和关闭单个镜像或者存储池的mirror功能,如果启用了journal功能,那么每个镜像将会被复制
可以使用 rbd mirror pool enable启用它
三、灾难恢复
交叉同步复制是可以的,默认的就是这个方式,这意味着两个地方的存储池名称需要相同的这个会带来两个问题
每个image都有 mirroring_directory 记录当前active的地方。在本地镜像提示为 primary的时候,是可写的并且远程的站点上就会有锁,这个image就是不可写的。只有在primary镜像降级,备份的点升级就可以了,demoted 和 promoted来控制这里,这就是为什么引入了等级制度,一旦备份的地方升级了,那么主的就自动降级了,这就意味着同步的方向就会发生变化了
如果出现脑裂的情况,那么rbd-mirror将会停止同步,你自己需要判断哪个是最新的image,然后手动强制去同步rbd mirror image resync
下面的环境是在两个集群上进行的,集群分别为:
先启动进程,因为这个是个新功能,所以采取的是进程运行在前台的方式方便找到问题,这个里面因为很容易混淆,所以运行的时候都会说明命令执行的地方
在lab8106执行命令
rbd-mirror -m 192.168.8.106:6789 -d
在lab8107执行命令
rbd-mirror -m 192.168.8.107:6789 -d
这里因为操作命令需要相互做peer的操作,所以需要提前做个配置文件的操作,将lab8106认为local集群,lab8107位remote集群,这个地方需要做个配置文件调整
注意需要在ceph.conf配置文件中添加
rbd_default_features = 125
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
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执行
[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执行
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上执行
rbd --cluster local mirror pool enable rbd pool
rbd --cluster remote mirror pool enable rbd pool
如果需要关闭那么执行
rbd --cluster local mirror pool disable rbd
rbd --cluster remote mirror pool disable rbd
格式
rbd mirror pool peer add {pool-name} {client-name}@{cluster-name}
使用admin这个账户就可以了
[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
[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}
执行
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上执行
[root@lab8106 ceph]# rbd create testrbd --size 40000
[root@lab8106 ceph]# rbd ls
testrbd
在lab8107上执行
root@lab8107:~/ceph# rbd ls
testrbd
可以看到镜像已经同步过去了
在lab8107上执行
root@lab8107:~/ceph# rbd create testrbd1 --size 40000
root@lab8107:~/ceph# rbd ls
testrbd
testrbd1
在lab8106上执行
[root@lab8106 ceph]# rbd ls
testrbd
testrbd1
双向同步已经可以了
这里提一下,因为内核态的rbd还没有实现一些属性,所以在map的时候会提示没有这个设备,librbd是可以使用的
[root@lab8106 ceph]# rbd map testrbd
rbd: sysfs write failed
rbd: map failed: (6) No such device or address
[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做了降级处理和升级处理,那么本地的这个就是只读的,远程的就是可写的
基本的实现就到这里,更多的实践再根据环境需求做就可以了