当前位置: 首页 > news >正文

Ceph异地数据同步之-RBD异地同步复制(上)

#作者:闫乾苓

文章目录

  • 前言
  • 基于快照的模式(Snapshot-based Mode)
    • 工作原理
    • 单向同步配置步骤
    • 单向同步复制测试
    • 双向同步配置步骤
    • 双向同步复制测试

前言

Ceph的RBD(RADOS Block Device)支持在两个Ceph集群之间进行异步镜像复制,提供了两种主要模式:基于日志(Journal-based)和基于快照(Snapshot-based)。这两种模式各有优缺点,适用于不同的场景和需求。
根据所需的复制需求,RBD 镜像可以配置为单向或双向复制:

  • 单向复制:当数据仅从主群集镜像到辅助群集时,rbd-mirror守护进程仅在辅助群集上运行。
  • 双向复制:当数据从一个集群上的主映像镜像到另一个集群上的非主映像(反之亦然)时, rbd-mirror守护进程在两个集群上运行。

基于快照的模式(Snapshot-based Mode)

工作原理

  • 使用定期计划或手动创建的RBD镜像快照来进行集群间的复制。
  • 远程集群会比较两个快照之间的数据或元数据更新,并将差异部分复制到其本地副本。
  • 利用RBD的快速差异(fast-diff)功能,可以快速确定哪些数据块发生了变化,而无需扫描整个RBD镜像。

优点:

  • 低延迟写入:不需要额外的日志记录,写操作不会显著增加延迟。
  • 灵活性:可以根据需要手动创建快照或设置自动快照策略,灵活适应不同的业务需求。

缺点:

  • 较粗粒度:与基于日志的模式相比,快照模式不够精细,需要同步完整的差异部分,而不是逐个写操作。
  • 恢复时间较长:在故障切换时,如果部分差异未完全应用,则需要回滚到上一个完整快照状态,可能会导致更长的恢复时间。

适用场景:
对写性能要求较高且能接受一定延迟的应用,如文件存储、备份等。

单向同步配置步骤

在这里插入图片描述

  1. 在两个ceph集群上登录到cephadm shell
[root@ceph01 ~]# cephadm shell
[root@ceph-a ~]# cephadm shell
  1. 在site-b集群中ceph-b节点部署 rbd-mirror 守护进程
[ceph: root@ceph-a /]# ceph orch apply rbd-mirror ceph-b
Scheduled rbd-mirror update...

查看守护进程是否正常启动

[ceph: root@ceph-a /]# ceph orch ls |grep rbd-mirror
rbd-mirror                      1/1  5m ago     4h   ceph-b
  1. 在源集群site-a新建1个存储池名为data,并启用 RBD 应用程序,在池data中创建1个名为image1的image
[ceph: root@ceph01 /]#  ceph osd pool create data
pool 'data' created
[ceph: root@ceph01 /]# ceph osd pool application enable data rbd
enabled application 'rbd' on pool 'data'
[ceph: root@ceph01 /]# rbd create --size 1024 data/image1
  1. 在目标集群site-b新建1个同名存储池data,并启用 RBD 应用程序,不用创建image
[ceph: root@ceph-a /]# ceph osd pool create data
pool 'data' created
[ceph: root@ceph-a /]# ceph osd pool application enable data rbd
enabled application 'rbd' on pool 'data'
  1. 在site-a,site-b两个存储集群中选择 mirroring 模式为image
[ceph: root@ceph01 /]# rbd mirror pool enable data image
[ceph: root@ceph-a /]# rbd mirror pool enable data image
  1. 验证两个集群都已成功启用了镜像模式为pool
[ceph: root@ceph01 /]# rbd mirror pool info data
Mode: image
Site Name: 0978cb18-dc68-11ef-b0d7-000c29460ffd
Peer Sites: none
[ceph: root@ceph-a /]# rbd mirror pool info data
Mode: image
Site Name: baedc6c0-e058-11ef-a23a-000c29cf8329
Peer Sites: none
  1. 在site-a集群创建 Ceph 用户帐户,并将存储集群对等注册到池,将 bootstrap 令牌文件复制到site-b存储集群。
[ceph: root@ceph01 /]# rbd mirror pool peer bootstrap create --site-name site-a data > /root/bootstrap_token_site-a
  1. 在site-b集群中导入bootstrap令牌
[ceph: root@ceph-a /]# rbd mirror pool peer bootstrap import --site-name site-b --direction rx-only data /root/bootstrap_token_site-a

注意:对于单向 RBD 镜像功能,必须使用–direction rx-only参数,因为在引导 对等时双向镜像是默认设置。

  1. 在site-a集群 data池中为需要同步的image启用镜像快照同步功能
[ceph: root@ceph01 /]# rbd mirror image enable data/image1 snapshot
Mirroring enabled
  • site-a集群验证镜像同步复制状态
[ceph: root@ceph01 /]# rbd mirror image status data/image1
image1:
  global_id:   6f6c3690-df01-49dd-9508-f7c944fbcd9a
  snapshots:
    3 .mirror.primary.6f6c3690-df01-49dd-9508-f7c944fbcd9a.3da61eb1-7512-44c2-b4e9-8d6a987e1a9c (peer_uuids:[f9128159-df9f-43eb-be57-4f798da002cc])
  • site-b集群验证镜像同步复制状态
[ceph: root@ceph-a /]# rbd mirror image status data/image1
image1:
  global_id:   6f6c3690-df01-49dd-9508-f7c944fbcd9a
  state:       up+replaying
  description: replaying, {"bytes_per_second":0.0,"bytes_per_snapshot":0.0,"last_snapshot_bytes":0,"last_snapshot_sync_seconds":0,"local_snapshot_timestamp":1738897439,"remote_snapshot_timestamp":1738897439,"replay_state":"idle"}
  service:     ceph-b.tglrho on ceph-b
  last_update: 2025-02-07 03:06:22

如果镜像处于up+replaying状态,表示可以正常工作。up表示rbd-mirror守护进程正在运行,replaying表示此镜像是从另一个存储集群复制的目标。

单向同步复制测试

在同一个client端服务器映射及挂载2个集群的rbd image, 在源集群site-a写入测试数据,手动触发快照,查看数据是否同步到目标集群site-b的同名池。

  1. 准备两个集群的conf,keyring文件
    将cephadm shell 所在容器中/etc/ceph/下的conf,keyring文件复制到client服务器/etc/ceph目录并修改文件名字以示区别。
[ceph: root@ceph01 /]# ls -l /etc/ceph/
-rw------- 1 ceph ceph 323 Jan 27 05:48 ceph.conf
-rw------- 1 root root 151 Feb  7 02:35 ceph.keyring

[root@cilent ~]# ll /etc/ceph/
-rw-r--r--. 1 root root  92 10月 18  2023 rbdmap
-rw-r--r--  1 root root 186  2月  5 19:14 site-a.client.admin.keyring
-rw-r--r--  1 root root 304  2月  5 19:13 site-a.conf
-rw-r--r--  1 root root 186  2月  5 19:20 site-a.keyring
-rw-r--r--  1 root root 186  2月  5 19:15 site-b.client.admin.keyring
-rw-r--r--  1 root root 337  2月  5 19:13 site-b.conf
  1. 使用rbd map 映射源集群site-a中data/image到client本地dev设备
[root@cilent ~]#  rbd map image1 --pool data -c /etc/ceph/site-a.conf  -k /etc/ceph/site-a.client.admin.keyring
/dev/rbd0

[root@cilent ~]# lsblk  |grep rbd0
rbd0             252:0    0    1G  0 disk
  1. 将rbd0格式化并mount到目录
[root@cilent mnt]# mkfs.xfs /dev/rbd0
Discarding blocks...Done.
[root@cilent mnt]# mkdir site-a site-b
[root@cilent mnt]# ll
drwxr-xr-x 2 root root 4096  2月  7 11:41 site-a
drwxr-xr-x 2 root root 4096  2月  7 11:41 site-b
[root@cilent mnt]# mount /dev/rbd0 /mnt/site-a
[root@cilent mnt]# df -h |grep site-a
/dev/rbd0                1014M   40M  975M    4% /mnt/site-a
  1. 在挂载点/mnt/site-a 使用dd写入2个100M大小的测试文件
[root@cilent mnt]# dd if=/dev/zero of=/mnt/site-a/100M-$(date +%F_%H%M%S) bs=1M count=100
[root@cilent mnt]# tree
.
├── site-a
│   ├── 100M-2025-02-07_114953
│   └── 100M-2025-02-07_115007
└── site-b

在没同步前查看两个集群data pool的磁盘使用信息
在这里插入图片描述
在这里插入图片描述

  1. 在源集群site-a中手动为data/image1创建快照
[ceph: root@ceph01 /]# rbd mirror image snapshot data/image1
Snapshot ID: 4
  1. 在site-b集群查看同步信息已更新

在这里插入图片描述
在这里插入图片描述

  1. 在client服务器将site-a集群rbd image取消挂载,删除map映射,
[root@cilent mnt]# umount /mnt/site-a
[root@cilent mnt]#  rbd unmap image1 --pool data -c /etc/ceph/site-a.conf  

-k /etc/ceph/site-a.client.admin.keyring

[root@cilent mnt]# tree 
.
├── site-a
└── site-b

  1. 在site-a集群将data/image1降级为非主image
[ceph: root@ceph01 /]# rbd mirror image demote data/image1
Image demoted to non-primary
在site-b集群将data/image1提升为主image
[ceph: root@ceph-a /]# rbd mirror image promote data/image1
Image promoted to primary
  1. site-b集群map映射及挂载rbd image并查看数据是否同步
[root@cilent mnt]#  rbd map image1 --pool data -c /etc/ceph/site-b.conf  -k /etc/ceph/site-b.client.admin.keyring/dev/rbd0

[root@cilent mnt]# lsblk |grep rbd
rbd0             252:0    0    1G  0 disk
数据已同步
[root@cilent mnt]# mount /dev/rbd0 /mnt/site-b/
[root@cilent mnt]# tree 
.
├── site-a
└── site-b
    ├── 100M-2025-02-07_114953
    └── 100M-2025-02-07_115007
  1. 此时rab map不能映射site-a集群的data/image,因为已降级为非主,因只有主镜像有写权限,以避免数据冲突。

在这里插入图片描述
11. 在client服务器上取消挂载及site-b集群的data/image的映射。

[root@cilent mnt]# umount /mnt/site-b/
[root@cilent mnt]#  rbd unmap image1 --pool data -c /etc/ceph/site-b.conf  -k /etc/ceph/site-b.client.admin.keyring
  1. 在site-b集群将data/image降级为非主image
[ceph: root@ceph-a /]# rbd mirror image demote data/image1
Image demoted to non-primary

13.在site-a集群将data/image提升为主image

[ceph: root@ceph01 /]# rbd mirror image promote data/image1
Image promoted to primary

14.在site-b集群查看镜像同步状态,此时为split-brain(脑裂)状态
在这里插入图片描述

  1. 在site-b集群请求到site-a源镜像的重新同步
    [ceph: root@ceph-a /]# rbd mirror image resync data/image1
    Flagged image for resync from primary
    Site-b同步状态过程如下:
[ceph: root@ceph-a /]# rbd mirror image status data/image1
rbd: error opening image image1: (2) No such file or directory

[ceph: root@ceph-a /]# rbd mirror image status data/image1
image1:
  global_id:   6f6c3690-df01-49dd-9508-f7c944fbcd9a
  state:       down+unknown
  description: status not found
  last_update:

此时恢复正常同步状态

[ceph: root@ceph-a /]# rbd mirror image status data/image1
image1:
  global_id:   6f6c3690-df01-49dd-9508-f7c944fbcd9a
  state:       up+replaying
  description: replaying, {"bytes_per_second":10615398.4,"bytes_per_snapshot":106153984.0,"last_snapshot_bytes":0,"last_snapshot_sync_seconds":0,"local_snapshot_timestamp":1738909767,"remote_snapshot_timestamp":1738909767,"replay_state":"idle"}
  service:     ceph-b.tglrho on ceph-b
  last_update: 2025-02-07 06:38:22
  1. 设置镜像快照定时策略
    使用基于快照的镜像时,每当需要镜像 RBD 映像的更改内容时,都需要创建镜像快照。
    默认情况下,每个image映像最多可创建5个快照。如果达到限制,则会自动删除最新的镜像快照。如果需要,可以通过配置选项覆盖该限制rbd_mirroring_max_mirroring_snapshots 。此外,当删除映像或禁用镜像时,会自动删除镜像快照。
    可自定义了镜像快照计划,用于定期自动创建镜像快照。

镜像快照可以全局、按池或按映像级别进行安排。可以在任何级别定义多个镜像快照计划,但只有与单个镜像匹配的最具体的快照计划才会运行。
可以分别使用d、h、m、start-time后缀以天、小时或分钟为单位指定。

rbd mirror snapshot schedule add [--pool {pool-name}] [--image {image-name}] {interval} [{start-time}]

比如:在site-a集群中对data池下的image1制定每分钟创建1个快照的策略。

[ceph: root@ceph01 /]# rbd mirror snapshot schedule add --pool data --image image1 1m
[ceph: root@ceph01 /]# rbd mirror snapshot schedule ls --pool data --recursive
POOL  NAMESPACE  IMAGE   SCHEDULE
data             image1  every 1m

双向同步配置步骤

双向同步并非双向实时同步,只是在单向同步的基础上通过在源集群也部署rbd-mirror守护进程,在出现故障时,通过手动切换集群镜像的主辅角色,实现快速可以反向同步。
在这里插入图片描述

  1. 在两个ceph集群上登录到cephadm shell
[root@ceph01 ~]# cephadm shell
[root@ceph-a ~]# cephadm shell
  1. 在site-a集群中ceph02节点部署 rbd-mirror 守护进程
[ceph: root@ceph01 /]# ceph orch apply rbd-mirror ceph02
Scheduled rbd-mirror update...
在site-b集群中ceph-b节点部署 rbd-mirror 守护进程
[ceph: root@ceph-a /]# ceph orch apply rbd-mirror ceph-b
Scheduled rbd-mirror update...
查看守护进程是否正常启动
[ceph: root@ceph01 /]# ceph orch ls|grep rbd
rbd-mirror                      1/1  8s ago     20s  ceph02

[ceph: root@ceph-a /]# ceph orch ls |grep rbd       
rbd-mirror                      1/1  14s ago    24s  ceph-b  
  1. 在源集群site-a新建1个存储池名为data,并启用 RBD 应用程序,在池data中创建1个名为image1的image
[ceph: root@ceph01 /]#  ceph osd pool create data
pool 'data' created
[ceph: root@ceph01 /]# ceph osd pool application enable data rbd
enabled application 'rbd' on pool 'data'
[ceph: root@ceph01 /]# rbd create --size 1024 data/image1

查看创建的image的信息
在这里插入图片描述

  1. 在目标集群site-b新建1个同名存储池data,并启用 RBD 应用程序,不用创建image
[ceph: root@ceph-a /]# ceph osd pool create data
pool 'data' created
[ceph: root@ceph-a /]# ceph osd pool application enable data rbd
enabled application 'rbd' on pool 'data'
  1. 在site-a,site-b两个存储集群中选择 mirroring 模式为image
[ceph: root@ceph01 /]# rbd mirror pool enable data image
[ceph: root@ceph-a /]# rbd mirror pool enable data image
  1. 验证两个集群都已成功启用了镜像模式为pool
[ceph: root@ceph01 /]# rbd mirror pool info data
Mode: image
Site Name: 0978cb18-dc68-11ef-b0d7-000c29460ffd
Peer Sites: none 

[ceph: root@ceph-a /]# rbd mirror pool info data
Mode: image
Site Name: baedc6c0-e058-11ef-a23a-000c29cf8329
Peer Sites: none
  1. 在site-a集群创建 Ceph 用户帐户,并将存储集群对等注册到池,将 bootstrap 令牌文件复制到site-b存储集群。
[ceph: root@ceph01 /]# rbd mirror pool peer bootstrap create --site-name site-a data > /root/bootstrap_token_site-a
  1. 在site-b集群中导入bootstrap令牌
[ceph: root@ceph-a /]# rbd mirror pool peer bootstrap import --site-name site-b data /root/bootstrap_token_site-a
  1. 在site-a集群 data池中为需要同步的image启用镜像快照同步功能
[ceph: root@ceph01 /]# rbd mirror image enable data/image1 snapshot
Mirroring enabled
  1. site-a集群验证镜像同步复制状态
[ceph: root@ceph01 /]# rbd mirror image status data/image1

在这里插入图片描述
up 表示 rbd-mirror 守护进程正在运行,stopped 意味着此镜像不是从另一个存储集群复制的目标。这是因为镜像是这个存储集群的主要部分
peer_sites 显示了对等节点(site-b)的状态为up+replaying
说明此时的同步方向为site-a site-b

  1. site-b集群验证镜像同步复制状态
[ceph: root@ceph-a /]# rbd mirror image status data/image1

在这里插入图片描述
如果镜像处于up+replaying状态,表示可以正常工作。up表示rbd-mirror守护进程正在运行,replaying表示此镜像是从另一个存储集群复制的目标。
peer_sites 显示了对等节点的状态为up+stopped

双向同步复制测试

  1. 在client服务器端映射site-a集群的data池的image1,格式化并mount到挂载点目录。
[root@cilent mnt]#  rbd map image1 --pool data -c /etc/ceph/site-a.conf  -k /etc/ceph/site-a.client.admin.keyring
/dev/rbd0
[root@cilent mnt]# mkfs.xfs /dev/rbd0
[root@cilent mnt]# mount /dev/rbd0 /mnt/site-a
  1. dd写入1个100M的文件进行测试
[root@cilent site-a]# dd if=/dev/zero of=100M-$(date +%F_%H%M%S) bs=1M count=100
[root@cilent site-a]# tree /mnt/
/mnt/
├── site-a
│   └── 100M-2025-02-07_174949
└── site-b
  1. site-a集群为data/image1手动创建快照,查看是否同步到site-b集群
[ceph: root@ceph01 /]# rbd mirror image snapshot data/image1
Snapshot ID: 4

在这里插入图片描述在这里插入图片描述

[ceph: root@ceph01 /]# rbd mirror image status data/image1

在这里插入图片描述
(4)查看两个集群data/image1的信息

[ceph: root@ceph01 /]# rbd --image data/image1 info

在这里插入图片描述
在这里插入图片描述

  1. 模拟site-a集群故障,手动将site-a data/image1降级为非主image
[ceph: root@ceph01 /]# rbd mirror image demote data/image1
Image demoted to non-primary

此时site-a集群的date/image1高级特性自动被设置为non-primary

在这里插入图片描述

  1. 手动将site-b data/image1提升为主image,如果因为site-a集群已经宕机,降级无法传播到site-a存储集群,可以使用 --force 选项
[ceph: root@ceph-a /]# rbd mirror image promote data/image1
Image promoted to primary

此时site-b集群的date/image1高级特性non-primary被取消,允许客户端进行挂载写入数据。

在这里插入图片描述

  1. client服务器端取消site-a集群data/image1的挂载和映射,改为site-b集群data/image1的挂载和映射.
[root@cilent ~]# umount  /mnt/site-a
[root@cilent ~]# rbd unmap image1 --pool data -c /etc/ceph/site-a.conf  -k /etc/ceph/site-a.client.admin.keyring

[root@cilent ~]# rbd map image1 --pool data -c /etc/ceph/site-b.conf  -k /etc/ceph/site-b.client.admin.keyring
/dev/rbd0
[root@cilent ~]# mount /dev/rbd0 /mnt/site-b
查看之前的数据同步
[root@cilent ~]# tree /mnt/
/mnt/
├── site-a
└── site-b
    └── 100M-2025-02-07_174949
  1. 再查看2个集群的同步状态
    site-a集群的因为也部署了rbd-mirror守护程序,data/image1在被降级为非主镜像后,自动与设置过对等关系的site-b集群进行同步(up+replaying)。
    在这里插入图片描述
    site-b集群的data/image1因为被提升为主镜像,所以其状态为up+stopped
    在这里插入图片描述
  2. 在site-b集群的data/image1的挂载目录写入测试数据并手动创建快照,观察同步情况。
[root@cilent ~]# cd /mnt/site-b/
[root@cilent site-b]# dd if=/dev/zero of=100M-$(date +%F_%H%M%S) bs=1M count=100
[root@cilent site-b]# tree /mnt/
/mnt/
├── site-a
└── site-b
    ├── 100M-2025-02-07_174949
    └── 100M-2025-02-07_183332

[ceph: root@ceph-a /]# rbd mirror image snapshot data/image1
Snapshot ID: 7

在这里插入图片描述
在这里插入图片描述

  1. 如果site-b恢复正常,可以再将主镜像切换回来。
先降级site-b集群的data/image1
[ceph: root@ceph-a /]# rbd mirror image demote data/image1
Image demoted to non-primary
再提升site-a集群的data/image1
[ceph: root@ceph01 /]# rbd mirror image promote data/image1
Image promoted to primary

等待片刻,查看两集群同步状态已恢复原始状态。

在这里插入图片描述
在这里插入图片描述

(11) client服务器上重新挂载site-a集群的data/image1,并查看数据是否正常。
[root@cilent ~]# umount /mnt/site-b/
[root@cilent ~]# rbd unmap image1 --pool data -c /etc/ceph/site-b.conf  -k /etc/ceph/site-b.client.admin.keyring

[root@cilent ~]# rbd map image1 --pool data -c /etc/ceph/site-a.conf  -k /etc/ceph/site-a.client.admin.keyring
/dev/rbd0

[root@cilent ~]# rbd showmapped -c /etc/ceph/site-b.conf  -k /etc/ceph/site-b.client.admin.keyring
id  pool  namespace  image   snap  device   
0   data             image1  -     /dev/rbd0

[root@cilent ~]# mount /dev/rbd0 /mnt/site-b
[root@cilent ~]# tree /mnt/
/mnt/
├── site-a
└── site-b
    ├── 100M-2025-02-07_174949
    └── 100M-2025-02-07_183332
http://www.dtcms.com/a/109943.html

相关文章:

  • 每日一题(小白)ASCLL娱乐篇5
  • ARM架构+CODESYS:解锁嵌入式边缘计算的实时控制新范式
  • MIT6.828 Lab3-2 Print a page table (easy)
  • 大数据学习(98)-数据治理
  • 预测分析(二):基于机器学习的数值预测
  • 【大模型基础_毛玉仁】6.3 知识检索
  • API接口调用
  • 通信算法之256: 无人机Remote ID(远程识别)
  • adc推荐,单通道,双极性采集
  • 最近常用 python 记录
  • 环境数据综合分析系统
  • 贤小二c#版Yolov5 yolov8 yolov10 yolov11自动标注工具 + 免python环境 GPU一键训练包
  • 贴片加工SMT厂核心工艺解析
  • 码界奇缘 Java 觉醒 第二章 变量迷城
  • 计算机网络-TCP的重传机制
  • 清晰易懂的 Flutter 开发环境搭建教程
  • java短连接,长连接
  • Linux命令-uniq
  • RAGFlow部署与使用介绍-深度文档理解和检索增强生成
  • 本地部署 Firecrawl 爬虫让 AI 知识库更丰满
  • Java创建对象和spring创建对象的过程和区别
  • AI赋能数据库管理“最后一公里”,融合架构重塑数据库承载成本效能——zCloud 6.7与zData X 3.3正式发布
  • MonkeyDev 如何创建一个root级级别的app,并执行root命令获取iphone设备序列号serialNumber(ios15.8)
  • 航电系统之承重与避障技术
  • “二分查找 + (必要时)前缀和” -- 处理 ’有序数组‘ 的区间问题汇总
  • 信息学奥赛一本通 1524:旅游航道
  • 胶铁一体化产品介绍
  • 什么是 SAML身份验证
  • 【DY】信息化集成化信号采集与处理系统;生物信号采集处理系统一体机
  • Qt实现登录界面(输入密码后过几秒,密码变为小黑点,眼睛改变密码明文,密文)