注意

本文档适用于 Ceph 开发版本。

RBD 镜像

RBD 图像可以在两个 Ceph 集群之间异步镜像。此功能以两种模式提供:

  • 基于日志: 此模式使用 RBD 日志记录图像功能,以确保集群之间的点时间、崩溃一致性复制。对 RBD 图像的每次写入都首先记录到相关的日志中,然后再修改实际图像。远程集群将从此相关日志中读取并重播更新到其本地图像副本。由于对 RBD 图像的每次写入都会导致对 Ceph 集群写入两次,因此在使用 RBD 日志记录图像功能时,写入延迟预计会接近翻倍。

  • 基于快照: 此模式使用定期计划或手动创建的 RBD 图像镜像快照,在集群之间复制崩溃一致的 RBD 图像。远程集群将确定两个镜像快照之间的任何数据或元数据更新,并将增量复制到其本地图像副本。在 RBD 图像功能的帮助下,可以快速确定更新的数据块,而无需扫描整个 RBD 图像。由于此模式不如日志记录细粒度,因此在故障转移场景中,在两个快照之间的完整增量需要在使用之前同步。任何部分应用的增量集将在故障转移时回滚。fast-diff image feature, updated data blocks can be quickly determined without the need to scan the full RBD image. Since this mode is not as fine-grained as journaling, the complete delta between two snapshots will need to be synced prior to use during a failover scenario. Any partially applied set of deltas will be rolled back at the moment of failover.

Note

基于日志的镜像需要 Ceph Jewel 发布或更高版本;基于快照的镜像需要 Ceph Octopus 发布或更高版本。

Note

本文档中“命名空间”一词的所有实例均指 RBD 命名空间。

镜像在同伴集群中按池配置,并且可以在池或命名空间内的命名空间或特定图像子集上配置。在使用基于日志的镜像时,您还可以镜像给定池或命名空间内的所有图像。镜像使用以下命令配置:rbd命令。Therbd-mirror守护进程负责从远程同伴集群拉取图像更新并将其应用于本地集群内的图像。

根据所需的复制需求,RBD 镜像可以配置为单向或双向复制:

  • 单向复制: 当数据仅从主集群镜像到次级集群时,守护进程仅在次级集群上运行。rbd-mirror daemon runs only on the secondary cluster.

  • 双向复制: 当数据从集群的一个主图像镜像到另一个集群的非主图像(反之亦然)时,守护进程在两个集群上运行。rbd-mirror daemon runs on both clusters.

重要

每个守护进程实例必须能够同时连接到本地和远程 Ceph 集群(即所有监控器和 OSD 主机)。此外,网络必须在两个数据中心之间具有足够的带宽来处理镜像工作负载。rbd-mirror daemon must be able to connect to both the local and remote Ceph clusters simultaneously (i.e. all monitor and OSD hosts). Additionally, the network must have sufficient bandwidth between the two data centers to handle mirroring workload.

池配置

以下步骤演示了如何使用rbd命令执行基本的行政管理任务来配置镜像。镜像按池配置。

这些池配置步骤应在两个同伴集群上执行。这些步骤假设两个集群,分别命名为“site-a”和“site-b”,可以通过单个主机访问,以便于理解。

请参阅rbdmanpage 以获取有关如何连接到不同 Ceph 集群的更多详细信息。

Note

以下示例中的集群名称对应于同名的 Ceph 配置文件(例如 /etc/ceph/site-b.conf)。请参阅ceph-conf文档,了解如何配置多个集群。请注意rbd-mirror并不firefly 发布。Firefly 将延迟至少另一个冲刺,以便我们可以对新代码进行一些操作经验,并进行一些额外的测试,然后再承诺长期支持。需要源集群和目标集群具有唯一的内部名称;两者都可以并且应该称呼自己ceph存储在该目录层次结构中的数量。需要本地和远程集群的配置可以任意命名,并将守护进程容器化是维护它们的一种策略rbd-mirror needs for local and remote clusters can be named arbitrarily, and containerizing the daemon is one strategy for maintaining them outside of /etc/ceph以避免混淆。

启用镜像

要在具有rbd的命名空间上启用镜像,请使用命名空间规范和镜像模式,以及可选的远程命名空间名称的mirror pool enable子命令:

rbd mirror pool enable [--site-name {local-site-name}] {pool-name} {mode}

镜像模式可以是image, poolinit-only:

  • image: 当配置为image模式时,必须显式启用镜像通过对于池的默认命名空间中的每个预期图像。其他命名空间不受影响,并且必须单独配置configured separately.

  • pool: 当配置为pool模式时,池的默认命名空间中具有日志记录功能的图像都将被镜像。其他命名空间不受影响,并且必须单独配置configured separately.

  • 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守护进程能够发现其同伴集群,同伴必须注册,并且必须创建用户帐户。rbdmirror pool peer bootstrap createmirror pool peer bootstrap import commands.

要手动创建新的引导令牌,使用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命令,用户名、监控器权限和 OSD 权限:

$ ceph auth get-or-create client.rbd-mirror-peer mon 'profile rbd-mirror-peer' osd 'profile rbd'

生成的密钥环应复制到其他集群的rbd-mirror守护进程主机,如果不使用以下描述的 Ceph 监控器存储。config-key store described below.

要手动添加具有rbd使缓存文件失效(丢弃),请指定mirror pool peer add命令的镜像同伴 Ceph 集群,请指定池名称和集群规范:

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 配置文件,该文件提供了同伴集群监控器的地址,此外还有一个位于默认或配置的密钥环搜索路径中的密钥环{client-name} located in the default or configured keyring search paths (e.g. /etc/ceph/{cluster-name}.{client-name}.keyring).

或者,同伴集群的监控器和/或客户端密钥可以安全地存储在本地 Ceph 监控器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使缓存文件失效(丢弃),请指定mirror pool peer remove命令移除镜像同伴 Ceph 集群,请指定池名称和同伴 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选择数据池如下:

  1. 如果目标集群配置了默认数据池(使用rbd_default_data_pool配置选项),则将使用它。

  2. 否则,如果源图像使用单独的数据池,并且目标集群上存在同名池,则将使用该池。

  3. 如果以上都不成立,则不会设置数据池。

命名空间配置

镜像可以在池的非默认命名空间中启用,而与默认命名空间无关。必须在事先配置池镜像之前配置命名空间。''"").

启用镜像

要在具有rbd的命名空间上启用镜像,请使用命名空间规范和镜像模式,以及可选的远程命名空间名称的mirror pool enable子命令:

rbd mirror pool enable {pool-name}/{local-namespace-name} {mode} [--remote-namespace {remote-namespace-name}]

镜像模式可以是imagepool:

  • 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

这将在image-pool/namespace-a集群site-aimage-pool/namespace-b集群site-b之间设置图像模式镜像。--remote-namespace选项,则命名空间将镜像到远程池中具有相同名称的命名空间。

之间设置池模式镜像image-pool(默认命名空间) 和site-aimage-pool/namespace-c集群site-b:

$ 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 ""

之间设置池模式镜像image-pool(默认命名空间) 和site-aimage-pool/namespace-d集群site-b之间,并同时设置image-pool(默认命名空间)site-bimage-pool/namespace-e集群site-a:

$ 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并且图像具有日志记录图像功能,则隐式启用,或者通过 by the rbd命令显式启用镜像,如果池镜像模式为image).

启用图像镜像

如果图像的池配置为image模式,则必须显式为池中的每个图像启用镜像。要使用rbd使缓存文件失效(丢弃),请指定mirror image enable命令以及池、图像名称和模式启用镜像:

rbd mirror image enable {pool-name}/{image-name} {mode}

镜像图像模式可以是journalsnapshot:

  • 日志(默认):当配置为journal模式时,镜像将利用 RBD 日志记录图像功能来复制图像内容。如果图像尚未启用 RBD 日志记录图像功能,它将自动启用。

  • 快照: 当配置为snapshot模式时,镜像将利用 RBD 图像镜像快照来复制图像内容。启用后,将自动创建初始镜像快照。可以创建额外的 RBD 图像镜像快照通过rbd command.

例如:

$ 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 图像日志记录功能。该功能可以在图像创建时通过提供--image-feature exclusive-lock,journaling。此参数必须是 CIDR 表示法的子网(例如rbd command.

启用。或者,日志记录功能可以动态地启用于现有的 RBD 图像。要使用rbd请求图像重新同步,请指定feature enable命令、池和图像名称以及功能名称:

rbd feature enable {pool-name}/{image-name} {feature-name}

例如:

$ rbd --cluster site-a feature enable image-pool/image-1 journaling

Note

日志记录功能依赖于排他锁功能。如果尚未启用排他锁功能,则应在启用日志记录功能之前启用它。

提示

您可以通过在您的 Ceph 配置文件中添加rbd default features = 125来默认启用所有新图像的日志记录。

提示

rbd-mirror调整器默认设置为适合镜像整个池的值。当使用rbd-mirror在集群之间迁移单个卷时,通过在本地或集中配置的rbd_journal_max_payload_bytes=8388608可以通过设置[client]配置部分中设置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}]

The 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使缓存文件失效(丢弃),请指定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使缓存文件失效(丢弃),请指定mirror snapshot schedule status命令查看基于快照的镜像 RBD 图像下次创建快照的状态,请指定可选的池或图像名称:

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

要使用

To disable mirroring for a specific image with 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 中移除相关驱动器),降级当前主图像,提升新主图像,并在备用集群上恢复对图像的访问。

Note

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 负载并准备故障转移 / 故障恢复。

Note

提升可以使用--force选项强制执行。当降级无法传播到同伴 Ceph 集群时(例如,Ceph 集群故障、通信中断)需要强制提升。这将导致两个同伴之间的分叉脑情况,并且图像直到发出强制重新同步命令才会同步。

强制图像重新同步

如果rbd-mirror守护进程检测到分叉脑事件,它将不会尝试镜像受影响的图像,直到问题解决。要恢复镜像,首先降级确定已过时的图像,然后请求与主图像重新同步。要使用 determined to be out-of-date and then request a resync to the primary image. To request an image resync with rbd请求图像重新同步,请指定mirror image resync命令和池和图像名称:

rbd mirror image resync {pool-name}/{image-name}

例如:

$ rbd mirror image resync image-pool/image-1

Note

The rbd命令仅将图像标记为需要重新同步。本地集群的rbd-mirror守护进程进程负责异步执行重新同步。

镜像状态

每个主镜像的同伴集群复制状态都存储。此状态可以使用mirror image statusmirror pool status commands.

请求镜像图像状态,请使用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

Note

添加--verbose。此参数必须是 CIDR 表示法的子网(例如mirror pool status命令将此外输出池中每个镜像的状态详细信息。

rbd-mirror 守护进程

两个rbd-mirror守护进程负责监视远程、同伴集群上的图像日志并重播日志事件。RBD 图像日志记录功能按发生顺序记录图像的所有修改。这确保了远程图像的崩溃一致性镜像可以在本地获得。

The rbd-mirror守护进程可在可选的rbd-mirror发行包中提供。

重要

每个rbd-mirror守护进程需要能够同时连接到两个集群。

警告

预 Luminous 发布:每个 Ceph 集群只运行一个rbd-mirror守护进程。

每个rbd-mirror守护进程应使用唯一的 Ceph 用户 ID。要创建 Ceph 用户,其中包含ceph在使用部署工具(如auth get-or-create命令,用户名、监控器权限和 OSD 权限:

ceph auth get-or-create client.rbd-mirror.{unique id} mon 'profile rbd-mirror' osd 'profile rbd'

The rbd-mirror守护进程可以通过systemd管理,通过指定用户 ID 作为守护进程实例:

systemctl enable ceph-rbd-mirror@rbd-mirror.{unique id}

The rbd-mirror也可以在前景中运行rbd-mirror command:

rbd-mirror -f --log-file={log_path}

由 Ceph 基金会带给您

Ceph 文档是一个社区资源,由非盈利的 Ceph 基金会资助和托管Ceph Foundation. 如果您想支持这一点和我们的其他工作,请考虑加入现在加入.