Ceph采用的是强一致性同步模型,全部副本都必须完成写操做才算一次写入成功,这就致使不能很好地支持跨域部署,由于若是副本在异地,网络延迟就会很大,拖垮整个集群的写性能。所以,Ceph集群不多有跨域部署的,也就缺少异地容灾。Ceph RBD mirror是Ceph Jewel版本引入的新功能,支持两个Ceph集群数据同步,其原理很是相似mysql的主从同步机制,前者基于journaling,后者基于binlog,两者都是基于日志回放完成主从同步的。node
ceph在内部是强一致性的,这个对于跨区域的状况数据同步是没法接受的,一个请求须要异地返回再确认完成,这个在性能上确定是没法接受的,这就是为何基本上没法部署跨区域的ceph集群, 所以咱们须要有一种机制可以让咱们在不一样区域的集群之间复制块设备。这个可以帮助咱们实现两个功能:mysql
简单来讲,就是利用日志(Journal)进行回放(replay),来完成主从同步。有点相似于Mysql中的binlog。当咱们使用RBD Mirror功能时,须要打开RBDJournal功能(注:不是OSD Journal),此时,全部数据写操做会先写入RBDJournal,而后后台线程再把数据从Journal区域写入对应的image。同时,还须要启动rbd-mirror服务,该服务负责监控远程Ceph集群的Journal,如有更新,则replay该Journal到本地RBD image。sql
当RBD Journal功能打开后,全部的数据更新请求会先写入RBD Journal,而后后台线程再把数据从Journal区域刷新到对应的image区域。RBD journal提供了比较完整的日志记录、读取、变动通知以及日志回收和空间释放等功能,能够认为是一个分布式的日志系统。vim
从上图所示是进行的主备模式的备份,其实这个只是看怎么应用了,在里面是自动实现的主主的模式,双向同步的,只是在应用中须要注意不要去同时操做同一个image,这个功能是做为主备去使用的,以备真正有问题的时候去实现故障恢复,这个同步是异步的跨域
1) 当接收到一个写入请求后,I/O会先写入主集群的Image Journal网络
2) Journal写入成功后,通知客户端架构
3) 客户端获得响应后,开始写入imageapp
4) 备份集群的mirror进程发现主集群的Journal有更新后,从主集群的Journal读取数据,写入备份集群(和上面序号同样,是由于这两个过程同时发生)异步
5) 备份集群写入成功后,会更新主集群Journal中的元数据,表示该I/O的Journal已经同步完成分布式
6) 主集群会按期检查,删除已经写入备份集群的Journal数据。
7) 以上就是一个rbd-mirror工做周期内的流程,在现有的版本中30s为一次工做周期,暂时不能改变这个周期时间。
rbd-mirror进程负责将镜像从一个Ceph集群同步到另外一个集群
根据复制的类型,rbd-mirror能够在单个集群上或者是镜像的两个集群上都运行
1) 单向备份
当数据从主集群备份到备用的集群的时候,rbd-mirror仅在备份群集上运行。
2) 双向备份
若是两个集群互为备份的时候,rbd-mirror须要在两个集群上都运行。
1) RBD Image模式:RBD image模式下,会把指定的image进行镜像;
2) Pool模式:而Pool模式则把该Pool中全部的image进行镜像。
作了mirroring的Image的状态有:
当第一次对image进行开启mirroring的时候 .Images 自动 promoted 为 primary
若是安装了多个挂载,则强制独占锁的特性是将RBD锁定到单个客户机。这有助于解决多个挂载的客户机试图对同一对象进行写操做时的写冲突状况。所以,在编写时,若是一个客户端首先在对象上创建一个独占锁,那么另外一个挂载的客户端将在编写以前首先检查是否有对等端在对象上放置了锁。
启用此功能后,一次只能有一个客户机修改RBD设备,特别是在快照建立/删除等操做期间更改内部RBD结构时。它还为失败的客户端提供了一些保护。例如,若是虚拟机彷佛没有响应,而您在其余地方用相同的磁盘启动了它的副本,那么第一个副本将在Ceph中被列入黑名单,而且没法损坏新磁盘。
主机名 |
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 |
主机名 |
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 |
首先配置两个集群,配置的集群都没有更更名称,默认都是ceph,咱们经过配置文件来控制集群的识别,个人环境是两套主机集群,两台机器lab8106为local集群,lab8107为remote集群,准备把lab8106的image备份到lab8107的集群上
1) 在ceph.conf当中添加
# vim /etc/ceph/ceph.conf rbd default features = 125
2) 具体数字表示意思
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
1) 处理配置文件和kerring
# 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
# 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) 检验上面设置是否完成
# 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]
# 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进行通讯了
1) 语法
rbd mirror pool peer add <pool-name> <client-name>@<cluster-name>
# 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
# 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
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
能够看到,健康状态OK
http://172.200.50.40:9443/#/block/mirroring
http://172.200.50.43:9443/#/block/mirroring
当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}
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) 将指定的镜像升级为主要镜像
# rbd mirror image promote rbd/image-1 --cluster=remote
# 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