注意
本文档适用于 Ceph 的开发版本。
RBD 镜像
RBD 镜像可以在两个 Ceph 集群之间异步镜像。此功能有两种模式可用:
基于日志:此模式使用 RBD 日志镜像功能来确保集群之间基于时间点、崩溃一致性的复制。对 RBD 镜像的每次写入都会首先记录到相关联的日志中,然后再修改实际镜像。远程集群将读取此相关联的日志并将更新重放到其本地镜像副本中。由于对 RBD 镜像的每次写入都会导致两次写入 Ceph 集群,因此在使用 RBD 日志镜像功能时,写入延迟预计会增加近一倍。
基于快照:此模式使用定期调度或手动创建的 RBD 镜像镜像快照在集群之间复制崩溃一致性的 RBD 镜像。远程集群将确定两个镜像快照之间的任何数据或元数据更新,并将增量复制到其本地镜像副本中。借助 RBD
fast-diff镜像功能,可以快速确定更新的数据块,而无需扫描整个 RBD 镜像。由于此模式不如日志记录那样精细,因此在故障转移场景中使用之前,需要同步两个快照之间的完整增量。任何部分应用的增量集将在故障转移发生时回滚。
注意
基于日志的镜像需要 Ceph Jewel 或更高版本;基于快照的镜像需要 Ceph Octopus 或更高版本。
注意
本文档中所有“命名空间”的实例均指 RBD 命名空间。
镜像在对等集群中按池配置,并且可以配置在命名空间或池或命名空间内的特定镜像子集上。在使用基于日志的镜像时,您也可以镜像给定池或命名空间内的所有镜像。镜像使用 rbd 命令进行配置。rbd-mirror 守护进程负责从远程对等集群拉取镜像更新并将其应用于本地集群中的镜像。
根据所需的复制需求,RBD 镜像可以配置为单向或双向复制:
单向复制:当数据仅从主集群镜像到辅助集群时,
rbd-mirror守护进程仅在辅助集群上运行。双向复制:当数据从一个集群上的主镜像镜像到另一个集群上的非主镜像(反之亦然)时,
rbd-mirror守护进程在两个集群上都运行。
重要
rbd-mirror 守护进程的每个实例都必须能够同时连接到本地和远程 Ceph 集群(即所有 monitor 和 OSD 主机)。此外,两个数据中心之间的网络必须有足够的带宽来处理镜像工作负载。
池配置
以下过程演示如何使用 rbd 命令执行配置镜像的基本管理任务。镜像按池配置。
这些池配置步骤应在两个对等集群上执行。这些过程假设两个名为“site-a”和“site-b”的集群都可以从单个主机访问以保持清晰。
池在两个对等集群上必须具有相同的名称。有关重命名池的说明,请参阅重命名池。
有关如何连接到不同 Ceph 集群的更多详细信息,请参阅 rbd 手册页。
注意
以下示例中的集群名称对应于具有相同名称的 Ceph 配置文件(例如 /etc/ceph/site-b.conf)。有关如何配置多个集群的说明,请参阅 ceph-conf 文档。请注意,rbd-mirror **不需要**源集群和目标集群具有唯一的内部名称;两者都可以并且应该称自己为 ceph。 rbd-mirror 需要的本地和远程集群配置文件可以任意命名,将守护进程容器化是一种将它们维护在 /etc/ceph 之外以避免混淆的策略。
启用镜像
要使用 rbd 在池上启用镜像,请发出 mirror pool enable 子命令,并指定池名称、镜像模式以及用于描述本地集群的可选友好站点名称:
rbd mirror pool enable [--site-name {local-site-name}] {pool-name} {mode}
镜像模式可以是 image、pool 或 init-only:
image:当配置为
image模式时,必须为池的默认命名空间中的每个目标镜像显式启用镜像。其他命名空间不受影响,必须单独配置。pool:当配置为
pool模式时,池的默认命名空间中所有启用了日志功能的镜像都会被镜像。其他命名空间不受影响,必须单独配置。init-only:当配置为
init-only模式时,池的默认命名空间中没有镜像会被镜像,但其他命名空间仍然可以配置。这是允许某些其他命名空间镜像到远程池的默认命名空间所必需的,但它本身也很有用。
例如
$ rbd --cluster site-a mirror pool enable --site-name site-a image-pool image
$ rbd --cluster site-b mirror pool enable --site-name site-b image-pool image
创建或导入新的引导令牌时也可以指定站点名称。
站点名称可以在以后使用相同的 mirror pool enable 子命令进行更改,但请注意,本地站点名称和远程集群使用的相应站点名称通常必须匹配。
禁用镜像
要使用 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
引导对等体
为了使 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 命令。例如,在 site-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}
例如,在 site-b 上:
$ cat <<EOF > token
eyJmc2lkIjoiOWY1MjgyZGItYjg5OS00NTk2LTgwOTgtMzIwYzFmYzM5NmYzIiwiY2xpZW50X2lkIjoicmJkLW1pcnJvci1wZWVyIiwia2V5IjoiQVFBUnczOWQwdkhvQmhBQVlMM1I4RmR5dHNJQU50bkFTZ0lOTVE9PSIsIm1vbl9ob3N0IjoiW3YyOjE5Mi4xNjguMS4zOjY4MjAsdjE6MTkyLjE2OC4xLjM6NjgyMV0ifQ==
EOF
$ rbd --cluster site-b mirror pool peer bootstrap import --site-name site-b image-pool token
手动添加集群对等体
如果需要,或者如果当前安装的 Ceph 版本不支持上述引导命令,则可以手动指定集群对等体。
远程 rbd-mirror 守护进程将需要访问本地集群来执行镜像。应为远程守护进程创建一个新的本地 Ceph 用户。要创建 Ceph 用户,请使用 ceph 指定 auth get-or-create 命令、用户名、monitor 权限和 OSD 权限:
$ ceph auth get-or-create client.rbd-mirror-peer mon 'profile rbd-mirror-peer' 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 的 Ceph 配置文件,该文件提供对等集群 monitor 的地址,以及位于默认或配置的密钥环搜索路径中的 {client-name} 的密钥环(例如 /etc/ceph/{cluster-name}.{client-name}.keyring)。
或者,对等集群的 monitor 和/或客户端密钥可以安全地存储在本地 Ceph monitor config-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==
删除集群对等体
要使用 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
数据池
在目标集群中创建镜像时,rbd-mirror 按如下方式选择数据池:
如果目标集群配置了默认数据池(使用
rbd_default_data_pool配置选项),则将使用该池。否则,如果源镜像使用单独的数据池,并且目标集群上存在同名池,则将使用该池。
如果以上两种情况均不属实,则不会设置数据池。
命名空间配置
可以独立于默认命名空间,在池的非默认命名空间上启用镜像。池必须事先配置为镜像。给定命名空间可以镜像到远程池中具有相同名称或不同名称的命名空间,包括镜像到默认命名空间(称为 '' 或 "")。
启用镜像
要使用 rbd 在命名空间上启用镜像,请发出 mirror pool enable 子命令,并指定命名空间规范、镜像模式以及可选的远程命名空间名称:
rbd mirror pool enable {pool-name}/{local-namespace-name} {mode} [--remote-namespace {remote-namespace-name}]
镜像模式可以是 image 或 pool:
image:当配置为
image模式时,必须为命名空间中的每个目标镜像显式启用镜像。pool:当配置为
pool模式时,命名空间中所有启用了日志功能的镜像都会被镜像。
例如
$ rbd --cluster site-a mirror pool enable image-pool/namespace-a image --remote-namespace namespace-b
$ rbd --cluster site-b mirror pool enable image-pool/namespace-b image --remote-namespace namespace-a
这将设置集群 site-a 上的 image-pool/namespace-a 和集群 site-b 上的 image-pool/namespace-b 之间的镜像模式镜像。在本地集群上配置的命名空间和远程命名空间对必须与远程集群上的远程命名空间和命名空间分别匹配。如果未提供 --remote-namespace 选项,则命名空间将镜像到远程池中具有相同名称的命名空间。
要在集群 site-a 上的 image-pool(默认命名空间)和集群 site-b 上的 image-pool/namespace-c 之间设置池模式镜像:
$ rbd --cluster site-a mirror pool enable image-pool pool --remote-namespace namespace-c
$ rbd --cluster site-b mirror pool enable image-pool init-only
$ rbd --cluster site-b mirror pool enable image-pool/namespace-c pool --remote-namespace ""
要在集群 site-a 上的 image-pool(默认命名空间)和集群 site-b 上的 image-pool/namespace-d 之间设置池模式镜像,同时设置集群 site-b 上的 image-pool(默认命名空间)和集群 site-a 上的 image-pool/namespace-e 之间的镜像模式镜像:
$ rbd --cluster site-a mirror pool enable image-pool pool --remote-namespace namespace-d
$ rbd --cluster site-a mirror pool enable image-pool/namespace-e image --remote-namespace ""
$ rbd --cluster site-b mirror pool enable image-pool image --remote-namespace namespace-e
$ rbd --cluster site-b mirror pool enable image-pool/namespace-d pool --remote-namespace ""
禁用镜像
要使用 rbd 在命名空间上禁用镜像,请指定 mirror pool disable 命令和命名空间规范:
rbd mirror pool disable {pool-name}/{namespace-name}
当配置为 image 模式时,命名空间中任何启用了镜像的镜像必须在禁用命名空间上的镜像之前显式禁用。
例如
$ rbd --cluster site-a mirror pool disable image-pool/namespace-a
$ rbd --cluster site-b mirror pool disable image-pool/namespace-b
镜像配置
与池配置不同,镜像配置只需针对单个镜像对等 Ceph 集群执行。
镜像 RBD 镜像被指定为主镜像或非主镜像。这是镜像的属性,而不是池的属性。被指定为非主镜像的镜像无法修改。
当在镜像上首次启用镜像时(如果池镜像模式是 pool 并且镜像启用了日志镜像功能,则隐式启用;如果池镜像模式是 image,则由 rbd 命令显式启用),镜像会自动提升为主镜像。
启用镜像镜像
如果镜像池配置为 image 模式,则必须为池中的每个镜像显式启用镜像。要使用 rbd 为特定镜像启用镜像,请指定 mirror image enable 命令以及池、镜像名称和模式:
rbd mirror image enable {pool-name}/{image-name} {mode}
镜像镜像模式可以是 journal 或 snapshot:
journal(默认):当配置为
journal模式时,镜像将利用 RBD 日志镜像功能复制镜像内容。如果尚未在镜像上启用 RBD 日志镜像功能,则会自动启用。snapshot:当配置为
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
启用镜像日志功能
基于 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
注意
日志功能依赖于独占锁功能。如果尚未启用独占锁功能,则应在启用日志功能之前启用它。
提示
您可以通过在 Ceph 配置文件中添加 rbd default features = 125 来默认启用所有新镜像的日志记录。
提示
rbd-mirror 的可调参数默认设置为适合镜像整个池的值。当使用 rbd-mirror 在集群之间迁移单个卷时,您可以通过在本地或集中配置的 [client] 配置部分中设置 rbd_journal_max_payload_bytes=8388608 来获得可观的性能提升。请注意,此设置可能会导致 rbd-mirror 对目标集群造成大量的写入工作负载:在迁移期间密切监视集群性能,并在并行运行多个迁移之前仔细测试。
创建镜像镜像快照
使用基于快照的镜像时,只要需要镜像 RBD 镜像的更改内容,就需要创建镜像快照。要使用 rbd 手动创建镜像快照,请指定 mirror image snapshot 命令以及池和镜像名称:
rbd mirror image snapshot {pool-name}/{image-name}
例如
$ rbd --cluster site-a mirror image snapshot image-pool/image-1
默认情况下,每个镜像最多会创建 5 个镜像快照。如果达到限制,则会自动清除最近的镜像快照。如果需要,可以通过 rbd_mirroring_max_mirroring_snapshots 配置选项覆盖此限制。此外,当删除镜像或禁用镜像时,镜像快照会自动删除。
如果定义了镜像快照调度,也可以定期自动创建镜像快照。镜像快照可以在全局、每个池或每个镜像级别进行调度。可以在任何级别定义多个镜像快照调度,但只有与单个镜像镜像匹配的最具体的快照调度才会运行。
要使用 rbd 创建镜像快照调度,请指定 mirror snapshot schedule add 命令以及可选的池或镜像名称、间隔和可选的开始时间:
rbd mirror snapshot schedule add [--pool {pool-name}] [--image {image-name}] {interval} [{start-time}]
可以使用 d、h、m 后缀分别指定天、小时或分钟的 interval。可选的 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 删除镜像快照调度,请指定 mirror snapshot schedule remove 命令,并使用与相应的 add 调度命令匹配的选项。
要使用 rbd 列出特定级别(全局、池或镜像)的所有快照调度,请指定 mirror snapshot schedule ls 命令以及可选的池或镜像名称。此外,可以指定 --recursive 选项以列出指定级别及以下的所有调度。例如:
$ rbd --cluster site-a mirror snapshot 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
禁用镜像镜像
要使用 rbd 禁用特定镜像的镜像,请指定 mirror image disable 命令以及池和镜像名称:
rbd mirror image disable {pool-name}/{image-name}
例如
$ rbd --cluster site-a mirror image disable image-pool/image-1
镜像升级和降级
在故障转移场景中,如果需要将主指定移动到对等 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 集群故障、通信中断),需要强制升级。这将导致两个对等体之间出现裂脑场景,直到发出强制重新同步命令,镜像才会再次同步。
强制镜像重新同步
如果 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 守护进程负责异步执行重新同步。
镜像状态
对等集群复制状态存储在每个主镜像镜像中。可以使用 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 选项将另外输出池中每个镜像镜像的状态详细信息。
rbd-mirror 守护进程
两个 rbd-mirror 守护进程负责监视远程对等集群上的镜像日志,并将日志事件重放到本地集群中。RBD 镜像日志功能按照发生的顺序记录对镜像的所有修改。这确保了远程镜像的崩溃一致性镜像在本地可用。
rbd-mirror 守护进程可在可选的 rbd-mirror 分发包中获取。
重要
每个 rbd-mirror 守护进程都需要能够同时连接到两个集群。
警告
Luminous 之前的版本:每个 Ceph 集群仅运行单个 rbd-mirror 守护进程。
每个 rbd-mirror 守护进程都应使用唯一的 Ceph 用户 ID。要创建 Ceph 用户,请使用 ceph 指定 auth get-or-create 命令、用户名、monitor 权限和 OSD 权限:
ceph auth get-or-create client.rbd-mirror.{unique id} mon 'profile rbd-mirror' osd 'profile rbd'
rbd-mirror 守护进程可以通过指定用户 ID 作为守护进程实例来由 systemd 管理:
systemctl enable ceph-rbd-mirror@rbd-mirror.{unique id}
rbd-mirror 也可以通过 rbd-mirror 命令在前台运行:
rbd-mirror -f --log-file={log_path}