RBD Mirror(镜像)(pacific版本)
RBD 镜像(Mirror)可以在两个 Ceph 集群之间异步镜像(Image)。此功能在两种模式下可用:
-
基于日志:此模式使用 RBD 日志映像(Image)功能来确保集群之间的时间点、崩溃一致的复制。每次对 RBD 映像的写入都首先记录到相关的日志中,然后再修改实际的映像。远程集群将从这个关联的日志中读取并将更新重播到其本地映像副本。由于每次写入 RBD 映像都会导致两次写入 Ceph 集群,因此在使用 RBD 日志映像功能时,预计写入延迟会增加近一倍。
-
基于快照:此模式使用定期计划或手动创建的 RBD 映像镜像快照在集群之间复制崩溃一致的 RBD 映像。远程集群将确定两个镜像快照之间的任何数据或元数据更新,并将增量复制到其本地映像副本。借助 RBD
fast-diff
映像功能,可以快速确定更新的数据块,而无需扫描完整的 RBD 映像。由于此模式不像日志那样细粒度,因此需要在故障转移场景期间使用之前同步两个快照之间的完整增量。任何部分应用的增量集都将在故障转移时回滚。
笔记:基于日志的镜像需要 Ceph Jewel 版本或更高版本;基于快照的镜像需要 Ceph Octopus 版本或更高版本。
镜像在对等集群中基于每个池进行配置,并且可以在池中的特定映像子集上进行配置。使用基于日志的镜像时,您还可以镜像给定池中的所有映像。使用该rbd
命令配置镜像。守护 rbd-mirror
进程负责从远程对等集群中提取镜像更新并将它们应用到本地集群中的镜像。
根据所需的复制需求,可以将 RBD 镜像配置为单向或双向复制:
-
单向复制:当数据仅从主集群镜像到辅助集群时,
rbd-mirror
守护程序仅在辅助集群上运行。 -
双向复制:当数据从一个集群上的主映像镜像到另一个集群上的非主映像(反之亦然)时,
rbd-mirror
守护程序在两个集群上运行。
重要:守护进程的每个
rbd-mirror
实例都必须能够同时连接到本地和远程 Ceph 集群(即所有MON和 OSD 主机)。此外,网络必须在两个数据中心之间有足够的带宽来处理镜像工作负载。
1. 池(pool)配置
以下过程演示如何执行基本管理任务以使用该rbd
命令配置镜像。镜像是基于每个池配置的。
这些池配置步骤应在两个对等集群上执行。为清楚起见,这些过程假设名为“site-a”和“site-b”的两个集群都可以从单个主机访问。
有关如何连接到不同 Ceph 集群的更多详细信息,请参见rbd 手册页。
笔记:以下示例中的集群名称对应于同名的 Ceph 配置文件(例如 /etc/ceph/site-b.conf)。有关如何配置多个集群的信息,请参阅 ceph-conf文档。请注意,不需要
rbd-mirror
源集群和目标集群具有唯一的内部名称;两者都可以而且应该称自己ceph
。rbd-mirror
本地和远程集群所需的配置文件可以任意命名,将守护进程容器化是在外部/etc/ceph
维护它们以避免混淆的一种策略。
1.1 启用镜像
要使用rbd
对池启用镜像,请发出带有池名称和镜像模式的子命令mirror pool enable
:
rbd mirror pool enable {pool-name} {mode}
镜像模式可以是image
或pool
:
-
image:在
image
模式下配置时,必须在每个镜像上显式启用镜像。 -
池(默认):在
pool
模式下配置时,池中启用了日志功能的所有镜像都会被镜像。
例如:
$ rbd --cluster site-a mirror pool enable image-pool image
$ rbd --cluster site-b mirror pool enable image-pool image
1.2 禁用镜像
要使用rbd
禁用池上的镜像,请指定mirror pool disable
命令和池名称:
rbd mirror pool disable {pool-name}
当以这种方式在池上禁用镜像时,镜像也将在显式启用镜像的任何映像(池内)上禁用。
例如:
$ rbd --cluster site-a mirror pool disable image-pool
$ rbd --cluster site-b mirror pool disable image-pool
1.3 Bootstrap Peers
为了让rbd-mirror
守护进程发现其对等集群,必须注册对等并且必须创建用户帐户。这个过程可以使用rbd、
mirror pool peer bootstrap create
和 mirror pool peer bootstrap import
命令自动化。
要使用 rbd
手动创建新的引导令牌,请发出 mirror pool peer bootstrap create
子命令、池名称和可选的友好站点名称来描述本地集群:
rbd mirror pool peer bootstrap create [--site-name {local-site-name}] {pool-name}
mirror pool peer bootstrap create
的输出将是应提供给mirror pool peer bootstrap import
命令的令牌。例如,在站点 a 上:
$ rbd --cluster site-a mirror pool peer bootstrap create --site-name site-a image-pool
eyJmc2lkIjoiOWY1MjgyZGItYjg5OS00NTk2LTgwOTgtMzIwYzFmYzM5NmYzIiwiY2xpZW50X2lkIjoicmJkLW1pcnJvci1wZWVyIiwia2V5IjoiQVFBUnczOWQwdkhvQmhBQVlMM1I4RmR5dHNJQU50bkFTZ0lOTVE9PSIsIm1vbl9ob3N0IjoiW3YyOjE5Mi4xNjguMS4zOjY4MjAsdjE6MTkyLjE2OC4xLjM6NjgyMV0ifQ==
要使用 rbd
手动导入另一个集群创建的引导令牌,请指定mirror pool peer bootstrap import
命令、池名称、创建的令牌的文件路径(或从标准输入读取的“-”),以及用于描述本地的可选友好站点名称集群和镜像方向(默认为 rx-tx 用于双向镜像,但也可以设置为 rx-only 用于单向镜像):
rbd mirror pool peer bootstrap import [--site-name {local-site-name}] [--direction {rx-only or rx-tx}] {pool-name} {token-path}
例如,在站点 b 上:
$ cat <<EOF > token
eyJmc2lkIjoiOWY1MjgyZGItYjg5OS00NTk2LTgwOTgtMzIwYzFmYzM5NmYzIiwiY2xpZW50X2lkIjoicmJkLW1pcnJvci1wZWVyIiwia2V5IjoiQVFBUnczOWQwdkhvQmhBQVlMM1I4RmR5dHNJQU50bkFTZ0lOTVE9PSIsIm1vbl9ob3N0IjoiW3YyOjE5Mi4xNjguMS4zOjY4MjAsdjE6MTkyLjE2OC4xLjM6NjgyMV0ifQ==
EOF
$ rbd --cluster site-b mirror pool peer bootstrap import --site-name site-b image-pool token
1.4 手动添加集群对等点(可选)
如果需要,或者如果上述引导命令在当前安装的 Ceph 版本中不可用,可以手动指定集群对等点。
远程rbd-mirror
守护进程需要访问本地集群才能执行镜像。应该创建一个新的本地 Ceph 用户供远程守护程序使用。要创建 Ceph 用户,ceph
请指定 auth get-or-create
命令、用户名、MON caps 和 OSD caps:
ceph auth get-or-create client.rbd-mirror-peer mon 'profile rbd' osd 'profile rbd'
如果不使用下面描述的 Ceph Monitor config-key
存储,则应将生成的密钥环复制到其他集群的rbd-mirror
守护程序主机。
要使用 rbd
手动添加镜像对等 Ceph 集群,请指定 mirror pool peer add
命令、池名称和集群规范:
rbd mirror pool peer add {pool-name} {client-name}@{cluster-name}
例如:
$ rbd --cluster site-a mirror pool peer add image-pool client.rbd-mirror-peer@site-b
$ rbd --cluster site-b mirror pool peer add image-pool client.rbd-mirror-peer@site-a
默认情况下,rbd-mirror
守护进程需要访问位于/etc/ceph/{cluster-name}.conf
提供对等集群MON地址的 Ceph 配置文件,以及 {client-name}
位于默认或配置的密钥环搜索路径(例如/etc/ceph/{cluster-name}.{client-name}.keyring
)中的密钥环。
或者,对等集群的MON和(或)客户端密钥可以安全地存储在本地 Ceph MONconfig-key
存储中。要在添加镜像对等点时指定对等点集群连接属性,请使用 --remote-mon-host
和--remote-key-file
选项。例如:
$ cat <<EOF > remote-key-file
AQAeuZdbMMoBChAAcj++/XUxNOLFaWdtTREEsw==
EOF
$ rbd --cluster site-a mirror pool peer add image-pool client.rbd-mirror-peer@site-b --remote-mon-host 192.168.1.1,192.168.1.2 --remote-key-file remote-key-file
$ rbd --cluster site-a mirror pool info image-pool --all
Mode: pool
Peers:
UUID NAME CLIENT MON_HOST KEY
587b08db-3d33-4f32-8af8-421e77abb081 site-b client.rbd-mirror-peer 192.168.1.1,192.168.1.2 AQAeuZdbMMoBChAAcj++/XUxNOLFaWdtTREEsw==
1.5 删除集群对等
要使用 rbd
删除镜像对等 Ceph 集群,请指定 mirror pool peer remove
命令、池名称和对等 UUID(可从命令rbd mirror pool info
中获得):
rbd mirror pool peer remove {pool-name} {peer-uuid}
例如:
$ rbd --cluster site-a mirror pool peer remove image-pool 55672766-c02b-4729-8567-f13a66893445
$ rbd --cluster site-b mirror pool peer remove image-pool 60c0e299-b38f-4234-91f6-eed0a367be08
1.6 数据池
在目标集群中创建镜像时,rbd-mirror
选择数据池如下:
-
如果目标集群配置了默认数据池(使用
rbd_default_data_pool
配置选项),则将使用它。 -
否则,如果源镜像使用单独的数据池,并且目标集群上存在同名池,则将使用该池。
-
如果以上都不是,则不会设置数据池。
2. 镜像(Image)配置
与池配置不同,镜像配置只需要针对单个镜像对等 Ceph 集群执行。
镜像的 RBD 映像被指定为主或非主。这是镜像的属性,而不是池的属性。不能修改指定为非主要的镜像。
首次在映像上启用镜像时,映像会自动提升为主映像(如果池镜像模式是pool
并且映像启用了日志映像功能,则隐式地提升,或者如果池镜像模式是image
,则由 rbd
命令显式启用)。
2.1 启用镜像
如果在镜像image
池的模式下配置了镜像,则需要为池中的每个镜像显式启用镜像。要使用 rbd
为特定映像启用镜像,请指定 mirror image enable
命令以及池、映像名称和模式:
rbd mirror image enable {pool-name}/{image-name} {mode}
镜像模式可以是journal
或snapshot
:
-
日志(默认):在
journal
模式下配置时,镜像将利用 RBD 日志映像功能来复制映像内容。如果镜像上尚未启用 RBD 日志镜像功能,它将自动启用。 -
快照:在
snapshot
模式下配置时,镜像将利用 RBD 镜像镜像快照来复制镜像内容。启用后,将自动创建初始镜像快照。该rbd
命令可以创建其他 RBD 映像 镜像快照。
例如:
$ rbd --cluster site-a mirror image enable image-pool/image-1 snapshot
$ rbd --cluster site-a mirror image enable image-pool/image-2 journal
2.2 启用镜像日志功能
基于 RBD 日志的镜像使用 RBD 映像日志功能来确保复制的映像始终保持崩溃一致。使用image
镜像模式时,在镜像启用镜像时会自动启用日志功能。使用pool
镜像模式时,在镜像可以镜像到对等集群之前,必须启用 RBD 镜像日志功能。通过向rbd
命令提供--image-feature exclusive-lock,journaling
选项, 可以在创建映像时启用该功能。
或者,可以在预先存在的 RBD 映像上动态启用日志功能。要使用 rbd
启用日志功能,请指定feature enable
命令、池和映像名称以及功能名称:
rbd feature enable {pool-name}/{image-name} {feature-name}
例如:
$ rbd --cluster site-a feature enable image-pool/image-1 journaling
笔记:日志功能依赖于独占锁功能。如果尚未启用独占锁定功能,则应在启用日志功能之前启用它。
提示:默认情况下,您可以通过添加
rbd default features = 125
到您的 Ceph 配置文件中启用所有新镜像的日志功能 。
提示:
rbd-mirror
可调参数默认设置为适合镜像整个池的值。当用于将单个卷迁移为集群时,您可以通过设置rbd_mirror_journal_max_fetch_bytes=33554432
和rbd_journal_max_payload_bytes=8388608
在本地或集中配置的[client]
配置部分中rbd-mirror
获得显着的性能提升。请注意,这些设置可能允许rbd-mirror
向目标集群呈现大量写入工作负载:在迁移期间密切监控集群性能,并在并行运行多个迁移之前仔细测试。
2.3 创建镜像-快照
使用基于快照的镜像时,只要需要镜像 RBD 映像的更改内容,就需要创建镜像快照。要使用 rbd
手动创建镜像快照,请指定 mirror image snapshot
命令以及池和映像名称:
rbd mirror image snapshot {pool-name}/{image-name}
例如:
$ rbd --cluster site-a mirror image snapshot image-pool/image-1
默认情况下,每个镜像只会创建3
个镜像快照。如果达到限制,则会自动修剪最近的镜像快照。如果需要,可以通过rbd_mirroring_max_mirroring_snapshots
配置选项覆盖限制。此外,删除镜像或禁用镜像时,镜像快照会自动删除。
如果定义了镜像快照计划,还可以定期自动创建镜像快照。镜像快照可以在全局、每个池或每个映像级别进行调度。可以在任何级别定义多个镜像快照计划,但只有与单个镜像映像匹配的最具体的快照计划才会运行。
要使用 rbd
来创建镜像快照计划,请指定 mirror snapshot schedule add
命令以及可选的池或映像名称;间隔; 和可选的开始时间:
rbd mirror snapshot schedule add [--pool {pool-name}] [--image {image-name}] {interval} [{start-time}]
interval
可以分别使用d
, h
, m
后缀以天、小时或分钟为单位指定。start-time
可以使用 ISO 8601 时间格式指定可选参数。例如:
$ rbd --cluster site-a mirror snapshot schedule add --pool image-pool 24h 14:00:00-05:00
$ rbd --cluster site-a mirror snapshot schedule add --pool image-pool --image image1 6h
要使用 rbd
删除镜像快照计划,请使用与add
相应计划命令匹配的选项指定 mirror snapshot schedule remove
命令。
要使用 rbd
列出特定级别(全局、池或映像)的所有快照计划,请指定mirror snapshot schedule ls
命令以及可选的池或映像名称。此外,可以指定--recursive
选项以列出指定级别及其以下的所有计划。例如:
$ rbd --cluster site-a mirror schedule ls --pool image-pool --recursive
POOL NAMESPACE IMAGE SCHEDULE
image-pool - - every 1d starting at 14:00:00-05:00
image-pool image1 every 6h
要使用rbd
查看何时为基于快照的镜像 RBD 映像创建下一个快照的状态,请指定 mirror snapshot schedule status
命令以及可选的池或映像名称:
rbd mirror snapshot schedule status [--pool {pool-name}] [--image {image-name}]
例如:
$ rbd --cluster site-a mirror snapshot schedule status
SCHEDULE TIME IMAGE
2020-02-26 18:00:00 image-pool/image1
2.4 禁用镜像
要使用 rbd
禁用特定映像的镜像,请指定 mirror image disable
命令以及池和映像名称:
rbd mirror image disable {pool-name}/{image-name}
例如:
$ rbd --cluster site-a mirror image disable image-pool/image-1
2.5 镜像提升与降级
在需要将主指定移动到对等 Ceph 集群中的映像的故障转移场景中,应停止对主映像的访问(例如关闭 VM 或从 VM 中移除关联的驱动器),将当前主映像降级,提升新的主映像,并恢复对备用集群上的映像的访问。
笔记:RBD 仅提供必要的工具来促进映像的有序故障转移。需要一个外部机制来协调整个故障转移过程(例如,在降级之前关闭映像)。
要使用rbd
将特定镜像降级为非主镜像,请指定 mirror image demote
命令以及池和镜像名称:
rbd mirror image demote {pool-name}/{image-name}
例如:
$ rbd --cluster site-a mirror image demote image-pool/image-1
要使用rbd
将池中的所有主映像降级为非主映像,请指定mirror pool demote
命令和池名称:
rbd mirror pool demote {pool-name}
例如:
$ rbd --cluster site-a mirror pool demote image-pool
要使用rbd
将特定映像提升为主映像,请指定 mirror image promote
命令以及池和映像名称:
rbd mirror image promote [--force] {pool-name}/{image-name}
例如:
$ rbd --cluster site-b mirror image promote image-pool/image-1
要使用 rbd
将池中的所有非主映像提升为主映像,请指定mirror pool promote
命令和池名称:
rbd mirror pool promote [--force] {pool-name}
例如:
$ rbd --cluster site-a mirror pool promote image-pool
提示:由于主要/非主要状态是针对每个映像,因此可以让两个集群拆分 IO 负载和阶段故障转移/故障恢复。
笔记:可以使用
--force
选项强制升级。当降级无法传播到对等 Ceph 集群(例如 Ceph 集群故障、通信中断)时,需要强制提升。这将导致两个对等方之间出现裂脑情况,并且在发出强制重新同步命令之前,镜像将不再同步。
2.6 强制镜像重新同步
如果rbd-mirror
守护程序检测到脑裂事件,它不会尝试镜像受影响的镜像,直到得到纠正。要恢复镜像的镜像,首先将确定为过期的镜像降级,然后请求重新同步到主镜像。要请求与 rbd
重新同步的镜像,请指定命令mirror image resync
以及池和镜像名称:
rbd mirror image resync {pool-name}/{image-name}
例如:
$ rbd mirror image resync image-pool/image-1
笔记:该
rbd
命令仅将映像标记为需要重新同步。本地集群的rbd-mirror
守护进程负责异步执行重新同步。
3. 镜像状态
为每个主镜像存储对等集群复制状态。可以使用mirror image status 和 mirror pool status
命令检索此状态。
要使用 rbd
请求镜像状态,请指定 mirror image status
命令以及池和镜像名称:
rbd mirror image status {pool-name}/{image-name}
例如:
$ rbd mirror image status image-pool/image-1
要使用 rbd
请求镜像池摘要状态,请指定 mirror pool status
命令和池名称:
rbd mirror pool status {pool-name}
例如:
$ rbd mirror pool status image-pool
笔记:向命令
mirror pool status
添加--verbose
选项将额外输出池中每个镜像映像的状态详细信息。
4. RBD-MIRROR 守护进程
这两个rbd-mirror
守护进程负责查看远程对等集群上的镜像日志,并针对本地集群重放日志事件。RBD 映像日志功能按发生的顺序记录对映像的所有修改。这确保了远程映像的崩溃一致镜像在本地可用。
该rbd-mirror
守护程序在可选的rbd-mirror
分发包中可用。
重要:每个
rbd-mirror
守护进程都需要能够同时连接到两个集群。
警告:
rbd-mirror
Pre-Luminous 版本:每个 Ceph 集群只运行一个守护进程。
每个rbd-mirror
守护进程都应该使用唯一的 Ceph 用户 ID。要使用ceph
创建 Ceph 用户,请指定 auth get-or-create
命令、用户名、MON caps 和 OSD caps:
ceph auth get-or-create client.rbd-mirror.{unique id} mon 'profile rbd-mirror' osd 'profile rbd'
可以通过systemd
将用户 ID 指定为rbd-mirror
守护程序实例来管理守护程序:
systemctl enable ceph-rbd-mirror@rbd-mirror.{unique id}
rbd-mirror
也可以通过rbd-mirror
命令在前台运行:
rbd-mirror -f --log-file={log_path}