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

实践详细文档

感谢一直在支持我的朋友,技术是无价的,也是免费的,天下没有免费的午餐,关键是你自己觉得划算不,鉴于本篇文章在收取费用后未达到用户的预期功能效果,可能引起读者的不快,现决定免费开发本篇实践文档,今后也不再进行收费文档的提供,会全部免费,至于协助,也一律不接受先付费后服务的方式,以先服务,后根据意愿打赏的方式


打赏