rbd-mirror配置指南-单向备份

前言

RBD 的 mirroring 功能将在Jewel中实现的,这个Jewel版本已经发布了很久了,这个功能已经在这个发布的版本中实现了,本来之前写过一篇文章,但是有几个朋友根据文档配置后,发现还是有问题,自己在进行再次配置的时候也发现有些地方没讲清楚,容易造成误解,这里对文档进行再一次的梳理

基本原理

我们试图解决的或者至少需要克服的问题是,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翻译的,原文只是做了简短的说明,下面是我的实践部分

配置实践部分

先介绍下一些简单的概念

rbd-mirror 进程

rbd-mirror进程负责将镜像从一个Ceph集群同步到另一个集群

根据复制的类型,rbd-mirror可以在单个集群上或者是镜像的两个集群上都运行

  • 单向备份
    • 当数据从主集群备份到备用的集群的时候,rbd-mirror仅在备份群集上运行。
  • 双向备份
    • 如果两个集群互为备份的时候,rbd-mirror需要在两个集群上都运行

为了更清晰的理解这个配置,我们本次实践只进行单向备份的配置,也就是只备份一个集群的镜像到另外一个集群

rbd-mirror的每个实例必须能够同时连接到两个Ceph集群,因为需要同两个集群都进行数据通信
每个Ceph集群只运行一个rbd-mirror进程

Mirroring 模式

mirroring是基于存储池进行的peer,ceph支持两种模式的镜像,根据镜像来划分有:

  • 存储池模式

  • 一个存储池内的所有镜像都会进行备份

  • 镜像模式

  • 只有指定的镜像才会进行备份

本次配置选择的模式是镜像的模式,也就是指定的镜像才会进行备份

Image 状态

做了mirroring的Image的状态有:
primary (可以修改)
non-primary (不能修改).
当第一次对image进行开启mirroring的时候 .Images 自动 promoted 为 primary

开始配置

首先配置两个集群,配置的集群都没有更改名称,都是ceph,我们通过配置文件来控制集群的识别,我的环境是单主机集群,lab8106和lab8107两台机器
lab8106为local集群,lab8107为remote集群,准备把lab8106的image备份到lab8107的集群上
在ceph.conf当中添加:

rbd default features = 125

需要exclusive-lock和journaling属性
开启这两个个属性可以在创建的时候指定
语法:

1
rbd create <image-name> --size <megabytes> --pool <pool-name> --imagefeature <feature> 

例子:

1
rbd create image-1 --size 1024 --pool rbd --image-feature exclusive-lock,journaling

这个是在lab8106上执行,因为我们需要对lab8106进行备份
也可以在创建以后开启属性:
语法:

1
rbd feature enable <pool-name>/<image-name> <feature-name>

例子:

1
2
rbd feature enable rbd/image-1 exclusive-lock
rbd feature enable rbd/image-1 journaling

上面有三种方法开启属性,选择习惯或者需要的一种就可以

开启存储池的mirror的模式

我们准备开启集群镜像备份模式
语法:

1
rbd mirror pool enable <pool-name> <mode>

在lab8106主机上执行:

1
rbd mirror pool enable rbd image

在lab8107主机上执行:

1
rbd mirror pool enable rbd image

上面的操作是对rbd存储池启动image模式的mirror配置
如果需要关闭:
语法:

1
rbd mirror pool disable <pool-name> <mode>

执行:

1
rbd mirror pool disable rbd image

处理配置文件和kerring

在lab8106上执行

1
2
3
4
[root@lab8106 ceph]# scp /etc/ceph/ceph.conf lab8107:/etc/ceph/local.conf
[root@lab8106 ceph]# scp /etc/ceph/ceph.client.admin.keyring lab8107:/etc/ceph/local.client.admin.keyring
[root@lab8106 ceph]#cp /etc/ceph/ceph.conf /etc/ceph/local.conf
[root@lab8106 ceph]#cp /etc/ceph/ceph.client.admin.keyring /etc/ceph/local.client.admin.keyring

在lab8107上执行:

1
2
3
4
[root@lab8107 ceph]# scp /etc/ceph/ceph.conf lab8106:/etc/ceph/remote.conf
[root@lab8107 ceph]# scp /etc/ceph/ceph.client.admin.keyring lab8106:/etc/ceph/remote.client.admin.keyring
[root@lab8107 ceph]#cp /etc/ceph/ceph.conf /etc/ceph/remote.conf
[root@lab8107 ceph]#cp /etc/ceph/ceph.client.admin.keyring /etc/ceph/remote.client.admin.keyring

执行完了后在两台机器上给予权限

1
2
[root@lab8106 ceph]# chown ceph:ceph -R /etc/ceph
[root@lab8107 ceph]# chown ceph:ceph -R /etc/ceph

检验上面设置是否完成
在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

到这里就是两个集群可以通过local和remote进行通信了

增加peer

我们这里是做单个集群的备份,为了方便我们这里都用admin的keyring
语法

1
rbd mirror pool peer add <pool-name> <client-name>@<cluster-name>

这个是为了让rbd-mirror进程找到它peer的集群的存储池
在lab8106上执行

1
2
[root@lab8106 ceph]# rbd --cluster local mirror pool peer add rbd client.admin@remote
[root@lab8106 ceph]# rbd --cluster remote mirror pool peer add rbd client.admin@local

查询peer状态

1
2
3
4
5
6
7
8
9
10
[root@lab8106 ceph]# rbd mirror pool info rbd --cluster local
Mode: image
Peers:
UUID NAME CLIENT
a050a0f5-9448-43f2-872f-87c394083871 remote client.admin
[root@lab8106 ceph]# rbd mirror pool info rbd --cluster remote
Mode: image
Peers:
UUID NAME CLIENT
8d7b3fa4-be44-4e25-b0b7-cf4bdb62bf10 local client.admin

如果需要删除peer
语法:

1
rbd mirror pool peer remove <pool-name> <peer-uuid>

查询存储池状态

1
2
3
[root@lab8106 ceph]# rbd mirror pool status rbd
health: OK
images: 0 total

开启image的mirror

在lab8106执行

1
rbd mirror image enable rbd/image-1

查询镜像的状态

1
2
3
4
5
6
7
8
9
10
11
12
[root@lab8106 ceph]# rbd info rbd/image-1
rbd image 'image-1':
size 1024 MB in 256 objects
order 22 (4096 kB objects)
block_name_prefix: rbd_data.102c2ae8944a
format: 2
features: exclusive-lock, journaling
flags:
journal: 102c2ae8944a
mirroring state: enabled
mirroring global id: dabdbbed-7c06-4e1d-b860-8dd104509565
mirroring primary: true

开启rbd-mirror的同步进程

先用调试模式启动进程看看情况
在lab8107的机器上执行

1
2
3
[root@lab8107 ceph]# rbd-mirror -d --setuser ceph --setgroup ceph --cluster remote -i admin
2017-01-22 17:43:53.688820 7fc926dc6c40 0 set uid:gid to 167:167 (ceph:ceph)
2017-01-22 17:43:53.688840 7fc926dc6c40 0 ceph version 10.2.5 (c461ee19ecbc0c5c330aca20f7392c9a00730367), process rbd-mirror, pid 32080

如果确认没问题就用服务来控制启动

1
vim /usr/lib/systemd/system/[email protected]

修改

Environment=CLUSTER=remote

然后启动
语法为:

1
[root@lab8107 ceph]#systemctl start ceph-rbd-mirror@<client-id>

在lab8107上启动进程

1
2
3
[root@lab8107 ceph]# systemctl start  ceph-rbd-mirror@admin
[root@lab8107 ceph]# ps -ef|grep rbd
ceph 4325 1 1 17:59 ? 00:00:00 /usr/bin/rbd-mirror -f --cluster remote --id admin --setuser ceph --setgroup ceph

查询镜像的同步的状态

1
2
3
4
5
6
[root@lab8106 ~]# rbd mirror image status rbd/image-1 --cluster remote
image-1:
global_id: dabdbbed-7c06-4e1d-b860-8dd104509565
state: up+replaying
description: replaying, master_position=[object_number=2, tag_tid=2, entry_tid=3974], mirror_position=[object_number=3, tag_tid=2, entry_tid=2583], entries_behind_master=1391
last_update: 2017-01-22 17:54:22

检查数据是否同步
在lab8107执行

1
2
3
4
5
6
7
8
9
10
11
12
[root@lab8107 ceph]# rbd info rbd/image-1
rbd image 'image-1':
size 1024 MB in 256 objects
order 22 (4096 kB objects)
block_name_prefix: rbd_data.127b515f007c
format: 2
features: exclusive-lock, journaling
flags:
journal: 127b515f007c
mirroring state: enabled
mirroring global id: fb976ffb-a71e-4714-8464-06381643f984
mirroring primary: false

可以看到数据已经同步过来了

总结

通过配置文件控制,可以实现集群名称不修改
rbd-mirror进程是在备份的集群上面启动的,并且是要能跟主集群和备份集群都能通信的,也就是peer都需要做,并且用户权限要控制好

根据上面的操作流程操作下来,应该是能够配置好rbd-mirror的

相关链接

Ceph Jewel Preview: Ceph RBD mirroring

变更记录

Why Who When
创建 武汉-运维-磨渣 2017-01-22