配置基于pool的单向rbd-mirror集群同步

file

rbd-mirror模式介绍(基于日志+基于快照)

#大前提:由于rbd-mirror采用异步复制,pool或者image必须是主和备的关系,无法实现双活,在双向复制场景:最多只能互为主备,无法实现故障自动切换

1、基于journal日志(版本要Jewel 及以上)(有点像mysql的主从复制)
    #(该模式:性能很可能打对折40%)(很像早期的FileStore存储类型,不过也有区别,fliestore因为依赖于filesystem,所以存在日志双写,这里bluestore只是先写日志再刷盘)
    此模式使用 RBD 日志映像(Image)功能来确保集群之间的时间点、崩溃一致的复制。
    每次对 RBD 映像的写入都首先记录到相关的日志中,然后再修改实际的映像。
    远程集群将从这个关联的日志中读取并将更新重播到其本地映像副本。
    由于每次写入 RBD 映像都会导致两次写入 Ceph 集群,因此在使用 RBD 日志映像功能时,预计写入延迟会增加近一倍。

2、基于snapshot快照(版本要Octopus 及以上)
    此模式使用定期计划或手动创建的 RBD 映像镜像快照在集群之间复制崩溃一致的 RBD 映像。
    远程集群将确定两个镜像快照之间的任何数据或元数据更新,并将增量复制到其本地映像副本。
    借助 RBD fast-diff映像功能,可以快速确定更新的数据块,而无需扫描完整的 RBD 映像。
    由于此模式不像日志那样细粒度,需要在故障转移场景期间使用之前同步两个快照之间的完整增量。
    任何部分应用的增量集都将在故障转移时回滚。(数据不实时同步,会丢失上个快照到故障时的数据)

配置rbd-mirror前需要了解的知识

## rbd-mirror网络上的要求
    1、rbd-mirror 必须能同时连接到本地和远程 Ceph 集群的public network。(public网是集群必须要有的,cluster网是可选配的)
    2、rbd-mirror 必须在两个ceph集群之间有足够的带宽来处理mirror工作负载。

## rbd-mirror工作的模式(基于拉取的方式)
    1、单向镜像:clusterA要向clusterB同步,只需要在clusterB上部署一个rbd-mirror客户端后,进行拉取
    2、双向镜像:clusterA和clusterB要互相同步,需分别在两个集群上部署一个rbd-mirror客户端后,进行拉取

## 实施rbd-mirror需要注意的地方
    1、确定好mirror方向后。主-image 可读可写可挂载,从-image 可读但不可挂载。
    2、两个要mirror的 pool 名称必须相同(若是不同,搞起来就比较复杂,所以要求名称相同)
    3、rbd-mirror默认的模式是journal日志模式,还支持snapshot快照默认。
    4、rbd-mirror可以配置基于pool的mirror,也可以配置基于image的mirror
    5、要使用image 的journal模式 必须开启exclusive-lock独占锁定,journaling日志记录
    6、rbd-mirror 不要求clusterA源集群和clusterB目标集群具有唯一的内部名称;两者都可以也应该称自己为 ceph
    7、rbd-mirror 本地和远程集群的配置文件可以任意命名(即可以是/ect/ceph/clusterA.conf和/ect/ceph/clusterB.conf)

## 特别注意:集群间peer正常,通信正常,不管基于journal还是snapshot模式,当删除主image后,备集群也会删除备image。

image满足什么条件才能使用mirror

journal模式:要想实现mirror,必须检测imgae是否开启了必要的特性,exclusive-lock独占锁定,journaling日志记录(该特性需要独占锁支持)
    #A、对现有的image如何开启:
        rbd feature enable volumes/kvm003-system exclusive-lock
        rbd feature enable volumes/kvm003-system journaling
        #rbd feature disable volumes/kvm003-system journaling       #关闭日志特性

    #B、对新建的image如何开启:
        rbd create volumes/kvm004-system --size 10G --image-feature exclusive-lock,journaling

    #C、对导入的image如何启用:
        rbd import ./kvm004-system volumes/kvm004-system --image-feature exclusive-lock,journaling

    #C、添加到默认配置文件/etc/ceph/ceph.conf中
        rbd_default_features = 125

查看pool中是否有journal(验证journal是否开启成功)
    root@pve-ceph01:~# rados -p volumes ls | grep journal
    journal.254a42f7d85c62
    journal_data.12.254a42f7d85c62.3
    journal_data.12.125070b9ac4346.3
    journal.25658947dae76e

snapshot模式:image必须支持 fast-diff 特性

如何对pool和image启用mirror功能

对pool启用或关闭mirror能力(两种模式:pool、image)
    #rbd mirror pool enable volumes <pool|image>
    rbd mirror pool enable volumes pool         #pool模式
    rbd mirror pool enable volumes image        #image模式
    rbd mirror pool disable volumes     #关闭的前提是:先删除集群的peer,并且保证该pool下所有image都已经关闭mirror(只有状态为primary的才能关闭mirror)(关闭image的mirro前若不是primary的还要先promote)

对特定image启用或关闭mirror能力(两种模式,不指定就是默认journal,还支持snapshot)
    #rbd mirror image enable volumes/kvm004-system <journal|snapshot>
    rbd mirror image enable volumes/kvm004-system
    rbd --cluster clusterA mirror image enable volumes/kvm003-system journal    #journal模式是默认的,不指定(隐式就是这个模式)
    rbd mirror image enable volumes/kvm005-system snapshot                  #使用基于快照的模式来mirror image
    rbd mirror image disable volumes/kvm004-system

基于snapshot的mirror,如何创建image快照

大前提:启用image的mirror只能是在image模式下,pool模式不支持创建 image的快照
    rbd mirror pool enable volumes image

#ceph17默认情况下,每个image最多创建 5 个mirror snapshot。若超出限制,会自动删除最老的mirror snapshot,
可以通过 rbd_mirroring_max_mirroring_snapshots 配置选项覆盖该限制。此外,当 删除image或disable mirror时,镜像快照会自动删除。

#手动创建快照(注意mirror snapshot 只能是 image 或者grop为单位,不能给pool创建snapshot)
    rbd --cluster clusterA mirror image snapshot volumes/kvm004-system

#创建快照计划(d, h, m后缀以天、小时或分钟为单位指定),一个image可以有多个快照计划
    rbd --cluster clusterA mirror snapshot schedule add --pool volumes 24h 14:00:00-05:00
    rbd --cluster clusterA mirror snapshot schedule add --pool volumes --image kvm004-system 6h
    rbd --cluster clusterA mirror snapshot schedule add --image volumes/kvm004-system 6h        #这两条指令等同

#查看下一个快照将在何时创建
    rbd --cluster clusterA mirror snapshot schedule status --pool volumes
    rbd --cluster clusterA mirror snapshot schedule status --pool volumes --image kvm004-system
    rbd --cluster clusterA mirror snapshot schedule status --image volumes/kvm004-system

#列出特定级别(全局、池或映像)的所有快照计划,还可以加 --recursive 列出指定级别及其以下的所有计划
    rbd --cluster clusterA mirror snapshot schedule ls --pool volumes
    rbd --cluster clusterA mirror snapshot schedule ls --pool volumes --recursive
    rbd --cluster clusterA mirror snapshot schedule ls --image volumes/kvm004-system --recursive

#删除快照计划(和创建是一样的格式,只是把add变成remove)
    rbd --cluster clusterA mirror snapshot schedule remove --pool volumes 24h 14:00:00-05:00
    rbd --cluster clusterA mirror snapshot schedule remove --pool volumes 1d 14:00:00-05:00
    rbd --cluster clusterA mirror snapshot schedule remove --image volumes/kvm004-system 6h

A、案例一、云服务器硬盘异地备份方案、基于单向image的snapshot镜像实现(A->B)

A1、对pool启用image类型的mirror

这种场景最好使用,image的snapshot mirror方式,可以单向或者双向(对已经使用了很久的image,只能采用snapshot)
    #ceph创建了用于mirror的快照,mirror完成后,会自动删除该快照(取决于默认保留mirror snapshot的数量)
    image模式:按需对image进行mirror
    snapshot方式:避免了性能问题,也避免了linux kernel module无法map journaling的image问题

1、分别在clusterA和clusterB为volumes池启用image的mirror功能
    rbd mirror pool enable volumes image        #clusterA和clusterB上都要执行
    #rbd mirror pool disable volumes        #这是关闭volumes池mirror功能

2、验证mirror功能是否开启成功
root@pve-ceph01:~# rbd mirror pool info volumes
Mode: image
Site Name: 21f31929-2fc5-4bc9-a0d5-060b5eb0a695
Peer Sites: none        #有这些个就是开启了mirror功能

A2、配置认证账户和key(使用各自的admin账户)

#在rbd-mirror的客户端上将两方的mon和admin账号的key写成文件(若是做双向复制,两个rbd-mirror客户端都要写上各自的mon和key文件)
    #注意文件名称格式和路径不要搞错了
    #/etc/ceph/clusterA.conf  、/etc/ceph/clusterA.client.admin.keyring
    #/etc/ceph/clusterB.conf  、/etc/ceph/clusterB.client.admin.keyring

#这是在clusterB的rbd-mirror角色上执行的
cat > /etc/ceph/clusterA.conf << EOF
[global]
    mon_host = 10.15.11.109 10.15.11.78 10.15.11.137
EOF
cat > /etc/ceph/clusterA.client.admin.keyring << EOF
[client.admin]
    key = AQD1raNjko3JOhAASpu1zXq22idmdPZa3AjE+g==
EOF

cat > /etc/ceph/clusterB.conf << EOF
[global]
    mon_host = 10.15.11.147 10.15.11.171 10.15.11.201
EOF
cat > /etc/ceph/clusterB.client.admin.keyring << EOF
[client.admin]
    key = AQAJsiJkPtkRDhAAtBCRlfz64YIulE9Uh24vRg==
EOF

验证配置是否生效
    ceph -s --cluster clusterA
    ceph -s --cluster clusterB

A3、安装并设置rbd-mirror

1、在clusterB上安装rbd-mirror进程
    apt install rbd-mirror

2、配置守护进程,并启动
    #将运行用户由ceph改成root,若是不改启动不了,日志在/var/log/ceph/
    sed -i -e 's/setuser ceph.*/setuser root --setgroup root/'  /lib/systemd/system/ceph-rbd-mirror@.service
    systemctl daemon-reload
    systemctl enable ceph-rbd-mirror.target
    systemctl enable ceph-rbd-mirror@admin
    systemctl start ceph-rbd-mirror@admin

#3、手动调试rbd-mirror命令:
    #rbd-mirror -f --cluster clusterB --setuser ceph --setgroup ceph            #用root用户执行,所以这里user指定ceph也是能运行的
    #/usr/bin/rbd-mirror -f --cluster clusterB --id admin --setuser ceph --setgroup ceph

A4、配置集群peer(不采用bootstrap)

1、在clusterB的rbd-mirror客户端上执行(意思是使用clusterA的admin账户。配置mirror peer为clusterA的volumes池->clusterB的volumes池,B这边是状态是只读)
    rbd --cluster clusterB mirror pool peer add volumes --direction rx-only client.admin@clusterA   #默认双向rx-tx,单向mirror需指定 --direction rx-only

2、可以查看两边volumes的状态
    rbd mirror pool info volumes --all --cluster clusterA
    rbd mirror pool info volumes --all --cluster clusterB

3、如何删除peer
    #注意要先停止rbd-mirror进程,再进行删除
    #删除语法:
        #rbd --cluster clusterB mirror pool peer remove volumes <clusterB volumes'uuid>
        #rbd --cluster clusterA mirror pool peer remove volumes <clusterA volumes'uuid>
    rbd --cluster clusterB mirror pool peer remove volumes aa3093c5-ee16-4809-9b6f-dd8b6b209dcb
    rbd --cluster clusterA mirror pool peer remove volumes 0bb349da-2ae9-4d09-8873-ab69f990121e

A5、对虚拟机磁盘启用mirror功能

1、查看pool的mirror状态
   #由于是A->B的单向mirror(所以A端是看不到状态的)
    rbd --cluster clusterA mirror pool status volumes --verbose         #这个是看不到状态的
    rbd --cluster clusterB mirror pool status volumes --verbose         #只有B端才能看到状态

2、对虚拟机系统盘的镜像盘创建mirror snapshot,
    #题外话:要用基础镜像克隆系统盘,必须事先对基础镜像加以保护(这是硬性的),因为基础镜像被删除后,克隆出来的系统盘也不能使用(是不是也被删除了?)
    #虚拟机的系统盘都是基于基础镜像,做的克隆卷。所以必须先对基础镜像启用mirror snapshot能力
    rbd --cluster clusterA mirror image enable volumes/CentOS-7.9.2111-x64.raw snapshot

    #对虚拟机系统盘启用snapshot mirror能力
    rbd --cluster clusterA mirror image enable volumes/kvm7876-system snapshot

    #手动对虚拟机系统盘创建mirror snapshot(几乎创建好的同时就开始进行集群间的mirror了)
    rbd --cluster clusterA mirror image snapshot volumes/kvm7876-system

3、查看image的mirror状态
    rbd --cluster clusterB mirror image status volumes/kvm7876-system

4、注意:虚拟机数据盘是独立的,只需要对其启用mirror snapshot能力,并创建mirror snapshot即可
    #若是kvm7876-data1680768324879存在快照卷,不必单独对快照也创建mirror snapshot(有点懵是不是,不要搞混了,image的snapshot 和image的mirror snapshot不是一个东西)
    rbd --cluster clusterA mirror image enable volumes/kvm7876-data1680768324879 snapshot
    rbd --cluster clusterA mirror image snapshot volumes/kvm7876-data1680768324879

A6、以只读方式验证备份集群中image的数据是否完整

1、验证备用集群中是否有对应的image
root@2ceph01:~# rbd --cluster clusterB ls volumes
CentOS-7.9.2111-x64.raw
kvm7876-data1680768324879
kvm7876-system

2、查看有快照卷的数据盘的相关信息
root@2ceph01:~# rbd --cluster clusterB du volumes/kvm7876-data1680768324879 #注意若是rbd-mirror工作正常,源集群中删除image,备集群中也会立即自动删除
NAME                                                 PROVISIONED  USED   
kvm7876-data1680768324879@kvm7876-snap1680769047424       20 GiB  160 MiB   #并未对快照卷创建mirror snapshot,但是他的snapshot也过来了
kvm7876-data1680768324879                                 20 GiB  160 MiB
<TOTAL>                                                   20 GiB  320 MiB

3、只读方式挂载备集群上的image,验证数据是否正确
    #其实linux kernel moudle是不能mount 非primary的image的(但是有的可以map),这里采用了rbd-fuse的方式
    方式一:kernel方式
        #map数据盘
        rbd map volumes/kvm7876-data1680768324879
        mount -o ro,norecovery /dev/rbd0 /tmp
        #map数据盘的快照卷
        rbd map volumes/kvm7876-data1680768324879@kvm7876-snap1680769047424
        mount -o ro,norecovery /dev/rbd0 /tmp

    方式二:rbd-fuse方式
        #挂载数据盘
        rbd-fuse -p volumes -r kvm7876-data1680768324879 /opt/
        mount -o ro,norecovery /opt/kvm7876-data1680768324879 /tmp

        #rbd-fuse有个bug,不能挂载快照卷(下面这个是不能成功的)
        rbd-fuse -p volumes -r kvm7876-data1680768324879@kvm7876-snap1680769047424 /opt/

B、基于pool的双向mirror(A<->B)

#基本都跟单向mirror配置相同,下面是几个要注意的点
1、两边的pool都要开启mirror

2、AB集群都要部署一个rbd-mirror客户端

3、两边rbd-mirror客户端,配置认证账户和key

4、在rbd-mirror客户端节点,创建集群peer对等体时使用默认的tx-rx
    #因为双方都已经配置了各自的admin账户和key,所以下面两条命令只需要在其中一个上面执行就可以了
    rbd --cluster clusterB mirror pool peer add volumes client.admin@clusterA
    rbd --cluster clusterA mirror pool peer add volumes client.admin@clusterB

C、基于快照类型的双向mirror

    第一、对pool启用image模式的mirror功能
    rbd --cluster clusterA mirror pool enable volumes image
    rbd --cluster clusterB mirror pool enable volumes image

    第二、为指定的image启用snapshot的mirror能力(默认是隐式的journal,这里显示指定snapshot)
    rbd --cluster clusterA mirror image enable volumes/kvm004-system snapshot       #经测试开启snapshot后,备集群立马就有数据了

    第二、为image创建快照
    rbd  --cluster clusterA mirror image snapshot volumes/kvm004-system

故障切换逻辑

基于单向复制的,主集群故障,手动切备集群
    1、停止使用主image的所有客户端
    2、将备集群中的备image提升为primary(当集群中有两个primary的image时会停止同步)
    3、然后可以挂载使用

基于单向复制的,主集群修复后,手动切回主集群
    1、先停止所有使用备image的所有客户端。并将备image进行demote降级操作
    2、将主集群的image进行promote升级操作
    3、触发强制同步(小心方向,可能造成数据永久性丢失)
        rbd mirror image resync volumes/kvm004-system  

如何进行升级、降级、强制同步

查看image状态,(primary | non-primary)
    rbd mirror image status volumes/kvm003-system       #若是单向mirror(主image是看不到状态的,只有从image能看到)

对image进行升|降级(primary | non-primary)
    rbd mirror image promote volumes/kvm003-system          #升级为primary
    rbd mirror image promote volumes/kvm003-system --force  #强制升级(当集群已经故障或通信中断,改变指令无法传递到对方集群时,使用强制更改)
    rbd mirror image demote volumes/kvm003-system       #降级为non-primary

对pool进行升|降级(primary | non-primary)
    rbd mirror pool promote volumes     #升级
    rbd mirror pool demote volumes      #降级

    rbd mirror image resync volumes/kvm004-system       #强制同步(需要在no-primary上执行,也就是需要在备集群上执行,也就是让执行这方的rbd-mirror去拉取对方集群的数据)

问题1、:rbd kernel module 无法map 启用 journaling的image

若是image开启了journaling特性,rbd map 就会失败,(而journaling是mirror的必要选项),若是不想关闭journal,可以尝试使用rbd-fuse来map image
1、安装rbd-fuse
    apt install rbd-fuse

2、第一步先mount image
    #rbd-fuse -p volumes /opt/                  #将volumes池中的所有image mount到/opt目录下(有点类似文件浏览)
    rbd-fuse -p volumes -r kvm004-system /opt/  #将volumes池中kvm004-system 这个特定的image mount到/opt目录(-r 参数用来指定image名字)

3、第二步再将image mount到真实要挂载的点(之后就可以使用了,对了mount前不要忘记先格式化文件系统)
    mount /opt/kvm004-system /tmp

4、如何umount
    umount /tmp     #先取消image的mount
    umount /opt     #再取消一次

问题2、现脑裂问题如何处理

脑裂是如何产生的
    1、集群中image正常的状态是一个primary 和 一个no-primary 两种,都是建立在网络通信、服务程序正常的情况
    2、当网络通信、服务程序都正常时,相同的image出现了两个primary。此时就发生脑裂了。为了数据安全,此时rbd-mirror回stop该image的mirror

解决脑裂的办法(目前只能是手动)
    1、手动将一方降级为no-primary,或者手动指定一方为primary。
        image模式参考这里
        rbd mirror image promote volumes/kvm003-system
        rbd mirror image demote volumes/kvm003-system

        pool模式参考这里
        rbd mirror pool promote volumes     #升级
        rbd mirror pool demote volumes      #降级

    2、手动在no-primary这边执行强制同步
        rbd mirror image resync volumes/kvm004-system

官方文档关于rbd-mirror的介绍

pve社区文档关于rbd-mirror的介绍
ceph官方关于rbd-mirror的介绍
redhat官方ceph_storage5关于rbd-mirror的介绍
一大佬整理的rbd-mirror的介绍
另一篇大佬些的rbd-mirror文章-推荐

附1、mirror状态示例

root@2ceph01:~# rbd --cluster clusterB mirror pool status volumes --verbose
health: OK
daemon health: OK
image health: OK
images: 4 total
    4 replaying

DAEMONS
service 977738:
  instance_id: 977742
  client_id: admin
  hostname: 2ceph01
  version: 17.2.5
  leader: true
  health: OK

IMAGES
kvm004-system:
  global_id:   6b48d06c-326f-451a-8615-53cabe9c8a0f
  state:       up+replaying
  description: replaying, {"bytes_per_second":0.0,"entries_behind_primary":0,"entries_per_second":0.0,"non_primary_position":{"entry_tid":3,"object_number":3,"tag_tid":1},"primary_position":{"entry_tid":3,"object_number":3,"tag_tid":1}}
  service:     admin on 2ceph01
  last_update: 2023-04-01 12:16:12

kvm005-system:
  global_id:   8152e59c-ef12-4ad1-92eb-f032f08c8897
  state:       up+replaying
  description: replaying, {"bytes_per_second":0.0,"entries_behind_primary":0,"entries_per_second":0.0,"non_primary_position":{"entry_tid":3,"object_number":3,"tag_tid":1},"primary_position":{"entry_tid":3,"object_number":3,"tag_tid":1}}
  service:     admin on 2ceph01
  last_update: 2023-04-01 12:16:12

附2、查看volumes状态(单向mirror中,主是tx-only、备是rx-only)

root@2ceph01:~# rbd mirror pool info volumes --all --cluster clusterA
Mode: image
Site Name: clusterA
Peer Sites: 
UUID: 0bb349da-2ae9-4d09-8873-ab69f990121e
Name: clusterB
Mirror UUID: 468ab744-2784-4c33-ba51-5b0e0a00e42c
Direction: tx-only      #A集群这边是tx-only
Mon Host: 
Key: 
root@2ceph01:~# rbd mirror pool info volumes --all --cluster clusterB
Mode: image
Site Name: clusterB
Peer Sites: 
UUID: aa3093c5-ee16-4809-9b6f-dd8b6b209dcb
Name: clusterA
Direction: rx-only      #B集群这边是rx-only
Client: client.admin
Mon Host: 
Key: 
声明:本文为原创,作者为 辣条①号,转载时请保留本声明及附带文章链接:https://boke.wsfnk.com/archives/1115.html
谢谢你请我吃辣条谢谢你请我吃辣条

如果文章对你有帮助,欢迎点击上方按钮打赏作者

最后编辑于:2023/4/19作者: 辣条①号

现在在做什么? 接下来打算做什么? 你的目标什么? 期限还有多少? 进度如何? 不负遇见,不谈亏欠!

暂无评论

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

arrow grin ! ? cool roll eek evil razz mrgreen smile oops lol mad twisted wink idea cry shock neutral sad ???

文章目录