SUSE Ceph RBD Mirror - Storage 6
Ceph采用的是强一致性同步模型,所有副本都必须完成写操作才算一次写入成功,这就导致不能很好地支持跨域部署,因为如果副本在异地,网络延迟就会很大,拖垮整个集群的写性能。因此,Ceph集群很少有跨域部署的,也就缺乏异地容灾。Ceph RBD mirror是Ceph Jewel版本引入的新功能,支持两个Ceph集群数据同步,其原理非常类似mysql的主从同步机制,前者基于journaling,后者基于binlog,二者都是基于日志回放完成主从同步的。
1.1. RBD mirror的原理
ceph在内部是强一致性的,这个对于跨区域的情况数据同步是无法接受的,一个请求需要异地返回再确认完成,这个在性能上肯定是无法接受的,这就是为什么基本上无法部署跨区域的ceph集群, 因此我们需要有一种机制能够让我们在不同区域的集群之间复制块设备。这个能够帮助我们实现两个功能:
- 灾难恢复
- 全球块设备分布(跨地理位置)
简单来说,就是利用日志(Journal)进行回放(replay),来完成主从同步。有点类似于Mysql中的binlog。当我们使用RBD Mirror功能时,需要打开RBDJournal功能(注:不是OSD Journal),此时,所有数据写操作会先写入RBDJournal,然后后台线程再把数据从Journal区域写入对应的image。同时,还需要启动rbd-mirror服务,该服务负责监控远程Ceph集群的Journal,若有更新,则replay该Journal到本地RBD image。
当RBD Journal功能打开后,所有的数据更新请求会先写入RBD Journal,然后后台线程再把数据从Journal区域刷新到对应的image区域。RBD journal提供了比较完整的日志记录、读取、变更通知以及日志回收和空间释放等功能,可以认为是一个分布式的日志系统。
从上图所示是进行的主备模式的备份,其实这个只是看怎么应用了,在里面是自动实现的主主的模式,双向同步的,只是在应用中需要注意不要去同时操作同一个image,这个功能是作为主备去使用的,以备真正有问题的时候去实现故障恢复,这个同步是异步的
1.2. 工作流程
1) 当接收到一个写入请求后,I/O会先写入主集群的Image Journal
2) Journal写入成功后,通知客户端
3) 客户端得到响应后,开始写入image
4) 备份集群的mirror进程发现主集群的Journal有更新后,从主集群的Journal读取数据,写入备份集群(和上面序号一样,是因为这两个过程同时发生)
5) 备份集群写入成功后,会更新主集群Journal中的元数据,表示该I/O的Journal已经同步完成
6) 主集群会定期检查,删除已经写入备份集群的Journal数据。
7) 以上就是一个rbd-mirror工作周期内的流程,在现有的版本中30s为一次工作周期,暂时不能改变这个周期时间。
1.3. rbd-mirror 进程
rbd-mirror进程负责将镜像从一个Ceph集群同步到另一个集群
根据复制的类型,rbd-mirror可以在单个集群上或者是镜像的两个集群上都运行
1) 单向备份
当数据从主集群备份到备用的集群的时候,rbd-mirror仅在备份群集上运行。
2) 双向备份
如果两个集群互为备份的时候,rbd-mirror需要在两个集群上都运行。
1.4. RBD Mirror模式
1) RBD Image模式:RBD image模式下,会把指定的image进行镜像;
2) Pool模式:而Pool模式则把该Pool中所有的image进行镜像。
1.5. Image 状态
做了mirroring的Image的状态有:
- primary (可以修改)
- non-primary (不能修改).
当第一次对image进行开启mirroring的时候 .Images 自动 promoted 为 primary
1.6. 强制独占锁作用
如果安装了多个挂载,则强制独占锁的特性是将RBD锁定到单个客户机。这有助于解决多个挂载的客户机试图对同一对象进行写操作时的写冲突情况。因此,在编写时,如果一个客户端首先在对象上建立一个独占锁,那么另一个挂载的客户端将在编写之前首先检查是否有对等端在对象上放置了锁。
启用此功能后,一次只能有一个客户机修改RBD设备,特别是在快照创建/删除等操作期间更改内部RBD结构时。它还为失败的客户端提供了一些保护。例如,如果虚拟机似乎没有响应,而您在其他地方用相同的磁盘启动了它的副本,那么第一个副本将在Ceph中被列入黑名单,并且无法损坏新磁盘。
2. 配置指南-单向备份
2.1. Ceph网络架构
- 集群1,网络环境配置
主机名 |
Public网络 |
管理网络 |
集群网络 |
说明 |
node001 |
192.168.2.40 |
172.200.50.40 |
192.168.3.40 |
MON,OSD,管理节点 |
node002 |
192.168.2.41 |
172.200.50.41 |
192.168.3.41 |
MON,OSD |
node003 |
192.168.2.42 |
172.200.50.42 |
192.168.3.42 |
MON,OSD |
- 集群2,网络环境配置
主机名 |
Public网络 |
管理网络 |
集群网络 |
说明 |
node004 |
192.168.2.43 |
172.200.50.43 |
192.168.3.43 |
MON,OSD,管理节点 |
node005 |
192.168.2.44 |
172.200.50.44 |
192.168.3.44 |
MON,OSD |
node006 |
192.168.2.45 |
172.200.50.45 |
192.168.3.45 |
MON,OSD |
2.2. 开始配置
首先配置两个集群,配置的集群都没有更改名称,默认都是ceph,我们通过配置文件来控制集群的识别,我的环境是两套主机集群,两台机器lab8106为local集群,lab8107为remote集群,准备把lab8106的image备份到lab8107的集群上
1) 在ceph.conf当中添加
# vim /etc/ceph/ceph.conf
rbd default features = 125
2) 具体数字表示意思
2.3. 开启存储池的mirror的模式
- 准备开启集群镜像备份模式
Node001 主机:
1) 创建池
# ceph osd pool create rbd 128 128 replicated
# ceph osd pool application enable rbd rbd
# rados lspools
2) 创建RBD,开启特殊属性日志和排他锁
# rbd create image-1 --size 1024 --pool rbd --image-feature exclusive-lock,journaling
3) 查看RBD信息
# rbd info rbd/image-1
rbd image 'image-1':
size 1GiB in 256 objects
order 22 (4MiB objects)
block_name_prefix: rbd_data.85596b8b4567
format: 2
features: exclusive-lock, journaling
flags:
create_timestamp: Fri Apr 12 14:32:49 2019
journal: 85596b8b4567
mirroring state: disabled
- 如关闭特殊属性(可选)
# rbd feature disable rbd/image-1 exclusive-lock journaling
4) 开启存储池的mirror的模式
模式采用image,需要针对每个映像明确启用镜像
语法:rbd mirror pool enable <pool-name> <mode>
# rbd mirror pool enable rbd image
Node004主机
1) 创建pool
# ceph osd pool create rbd 128 128 replicated # ceph osd pool application enable rbd rbd # rados lspools
2) 开启存储池的mirror的模式
# rbd mirror pool enable rbd image
2.4. 处理配置文件和kerring
1) 处理配置文件和kerring
- 在node001主机上
# scp /etc/ceph/ceph.conf node004:/etc/ceph/local.conf # scp /etc/ceph/ceph.client.admin.keyring \ node004:/etc/ceph/local.client.admin.keyring
# cp /etc/ceph/ceph.conf /etc/ceph/local.conf # cp /etc/ceph/ceph.client.admin.keyring /etc/ceph/local.client.admin.keyring
- 在node004上执行:
# scp /etc/ceph/ceph.conf node001:/etc/ceph/remote.conf # scp /etc/ceph/ceph.client.admin.keyring \ node001:/etc/ceph/remote.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
2) 执行完了后在两台机器上给予权限 (两台主机都要)
# chown ceph:ceph -R /etc/ceph # chown ceph:ceph -R /etc/ceph # ll /etc/ceph/
3) 检验上面设置是否完成
- 在node001执行
# ceph --cluster local mon stat e1: 3 mons at {node001=[v2:192.168.2.40:3300/0,v1:192.168.2.40:6789/0],
# ceph --cluster remote mon stat e1: 3 mons at {node004=[v2:192.168.2.43:3300/0,v1:192.168.2.43:6789/0]
- 在node004执行
# ceph --cluster local mon stat e1: 3 mons at {node001=[v2:192.168.2.40:3300/0,v1:192.168.2.40:6789/0],
# ceph --cluster remote mon stat e1: 3 mons at {node004=[v2:192.168.2.43:3300/0,v1:192.168.2.43:6789/0]
到这里就是两个集群可以通过local和remote进行通信了
2.5. 增加peer
1) 语法
rbd mirror pool peer add <pool-name> <client-name>@<cluster-name>
- 在node001上执行
# rbd --cluster local mirror pool peer add rbd client.admin@remote
# rbd --cluster remote mirror pool peer add rbd client.admin@local
2) 查询peer状态(node001)
# rbd mirror pool info rbd --cluster local Mode: image Peers: UUID NAME CLIENT a050a0f5-9448-43f2-872f-87c394083871 remote client.admin
# rbd mirror pool info rbd --cluster remote Mode: image Peers: UUID NAME CLIENT 8d7b3fa4-be44-4e25-b0b7-cf4bdb62bf10 local client.admin
3) 查询存储池状态
# rbd mirror pool status rbd --cluster local health: OK images: 0 total
# rbd mirror pool status rbd --cluster remote health: OK images: 0 total
2.6. 开启image的mirror
- 在node001执行
# rbd mirror image enable rbd/image-1
# rbd info rbd/image-1 rbd image 'image-1': size 1GiB in 256 objects order 22 (4MiB objects) block_name_prefix: rbd_data.85756b8b4567 format: 2 features: exclusive-lock, journaling flags: create_timestamp: Sat Apr 13 10:50:37 2019 journal: 85756b8b4567 mirroring state: enabled mirroring global id: 72931f47-e1de-439a-b774-538d84dc8a06 mirroring primary: true ===> 角色 primary
2.7. 开启rbd-mirror的同步进程
1) 先用调试模式启动进程看看情况
l 在node004的机器上执行
# 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
node004:~ # rbd list
image-1 <=== 确认 image-1 镜像 mirror 过来
2) 如果确认没问题就用服务来控制启动 (node001, node004)
# zypper in rbd-mirror
3) 修改systemd
Node004
# vim /usr/lib/systemd/system/ceph-rbd-mirror@.service
Environment=CLUSTER=remote
# systemctl daemon-reload
Node001
# vim /usr/lib/systemd/system/ceph-rbd-mirror@.service
Environment=CLUSTER=remote
# systemctl daemon-reload
4) 启动服务 (node001,node004)
# systemctl start ceph-rbd-mirror@admin.service
# systemctl enable ceph-rbd-mirror@admin.service
5) 查询镜像的同步的状态
# rbd mirror image status rbd/image-1 --cluster remote
image-1:
global_id: dabdbbed-7c06-4e1d-b860-8dd104509565
state: up+replaying
2.8. 登陆 dashboard页面
可以看到,健康状态OK
http://172.200.50.40:9443/#/block/mirroring
http://172.200.50.43:9443/#/block/mirroring
2.9. 关于map操作
当RBD image开启了某些高级特性后,内核可能不支持,因此不能执行rbd map操作,否则出现RBD image feature set mismatch错误
# rbd map image-1
rbd: sysfs write failed
RBD image feature set mismatch. Try disabling features unsupported by the kernel with "rbd feature disable".
In some cases useful info is found in syslog - try "dmesg | tail".
rbd: map failed: (6) No such device or address
从J版本后,RBD支持将RBD image map为本地nbd设备,通过rbd nbd map命令即可映射为本地nbd设备。
1) 安装rbd-nbd模块:
# zypper in rbd-nbd
2) map image到本地nbd设备:
# rbd nbd map rbd/image-1
/dev/nbd0
3) 显示映射
# rbd nbd list
pid pool image snap device
12339 rbd image-1 - /dev/nbd0
4) 格式化挂载,并且创建文件
# mkfs.ext4 /dev/nbd0
# mount /dev/nbd0 /mnt
# touch /mnt/{1,2,3}
2.10. 容灾切换
1) 卸载文件
# umount /mnt
# rbd nbd unmap /dev/nbd0
2) 将指定的镜像降级为非主要镜像
l 在node001执行
# rbd mirror image demote rbd/image-1 --cluster=local
3) 查看转变后,在执行下面一条命令
# rbd info rbd/image-1
rbd image 'image-1':
size 1GiB in 256 objects
order 22 (4MiB objects)
block_name_prefix: rbd_data.2f6f06b8b4567
format: 2
features: layering, exclusive-lock, object-map, fast-diff, deep-flatten, journaling
flags:
create_timestamp: Sat Apr 13 14:56:17 2019
journal: 2f6f06b8b4567
mirroring state: enabled
mirroring global id: f522d2c1-0b8b-446a-b203-eb7ed1774848
mirroring primary: false
4) 将指定的镜像升级为主要镜像
- 在node001执行
# rbd mirror image promote rbd/image-1 --cluster=remote
- 在node004执行
# rbd info image-1 rbd image 'image-1': size 1GiB in 256 objects order 22 (4MiB objects) block_name_prefix: rbd_data.5ef56b8b4567 format: 2 features: layering, exclusive-lock, object-map, fast-diff, deep-flatten, journaling flags: create_timestamp: Sat Apr 13 15:19:55 2019 journal: 5ef56b8b4567 mirroring state: enabled mirroring global id: f522d2c1-0b8b-446a-b203-eb7ed1774848 mirroring primary: true
5) 安装rbd-nbd模块:
# zypper in rbd-nbd
6) map image到本地nbd设备:
# rbd nbd map rbd/image-1
/dev/nbd0
7) 显示映射
# rbd nbd list pid pool image snap device 12339 rbd image-1 - /dev/nbd0
8) 格式化挂载,并且创建文件
# mount /dev/nbd0 /mnt # ll /mnt