RBD Mirror

红帽  Ceph 存储支持两个存储集群之间的RBD mirror功能。这样,您可以将 RBD 从一个红帽  Ceph 存储集群自动复制到另一个远程集群。这种机制会利用异步方式,通过网络来镜像来源(主要)RBD 镜像和目标(次要)RBD 镜像。如果包含主要 RBD 镜像的集群变得不可用,您可以故障转移到远程集群的次要 RBD 镜像,并且重新启动使用它的应用。

从来源 RBD 镜像故障转移到镜像的 RBD 镜像时,您必须降级来源 RBD 镜像并升级目标 RBD 镜像。当镜像被降级后,它变为锁定且不可用的状态。当镜像被升级后,它变为可用状态,可以在读写模式中访问。

RBD 镜像功能要求 rbd-mirror 软件包。该软件包需要安装到能够通过网络访问从属于镜像关系的两个集群的服务器上,而且每个红帽  Ceph 存储集群必须至少配置一个镜像代理。

您可以使用 ceph-ansible 软件包中的 Ansible Playbook 部署 RBD 镜像功能。您需要将应该运行 RBD 镜像代理的主机的名称添加到清单文件中的 rbd-mirrors 主机组,并且配置 group_vars/rbd-mirrors.yml 组变量文件。

RBD 镜像功能需要参与复制流程的所有 RBD 镜像启用 journalling 功能。这需要 RBD 镜像格式 2,红帽  Ceph 存储 2.0 及更高版本支持这种格式。


访问被镜像的 RBD 镜像的客户端也需要支持这一功能。因此,使用 krbd 客户端访问的 RBD 镜像不能使用 RBD mirror功能。


受支持的镜像配置

RBD 镜像功能支持两种配置:

  • 单向镜像或主动-被动

  • 双向镜像或主动-主动

在单向模式中,一个集群的 RBD 镜像可以读写模式访问,远程集群中仅包含镜像。镜像代理仅在远程集群上运行。这种模式可以支持配置多个次要集群。

在双向模式中,来源与目标对(主要与次要)进行了同步。每种类型都可以在镜像关系的任一集群中运行。此模式仅允许在两个集群之间进行复制,而且必须在每个集群上配置镜像代理。

受支持的镜像模式

RBD 镜像功能可以配置为:

  • 池模式

  • 镜像模式

在池模式中,自动为被镜像池中创建的每一个 RBD 镜像启用镜像功能。当来源集群上的池中创建了镜像时,远程集群中会自动创建次要镜像。

在镜像模式中,必须逐一为各个 RBD 镜像启用镜像功能。在这种模式中,您必须显式选择要在两个集群之间复制的 RBD 镜像。





配置 RBD 镜像功能

在配置 RBD 镜像功能时,您需要在各个集群上配置节点,使其含有两个集群的配置文件。通常,集群节点仅配置关于其自己集群的信息,默认称为 ceph,而这个集群的配置文件则称为 /etc/ceph/ceph.conf

例如,您可以将生产集群命名为 prod,远程备用集群命名为 backup。您需要将 prod 集群的 /etc/ceph/ceph.conf 文件重命名为 /etc/ceph/prod.conf,并将它复制到两个集群的所有节点。类似地,您需要将 backup 集群的 /etc/ceph/ceph.conf 文件重命名为 /etc/ceph/backup.conf,并将它复制到两个集群的所有节点。如果您的集群配置了非默认名称,请记得其配置文件将不再是 /etc/ceph/ceph.conf



逐步配置 RBD mirror

下表概述了在 prod 和 backup 这两个集群之间配置镜像功能所需的步骤:

1.在 prod 集群上的 /etc/sysconfig/ceph 文件中修改 CLUSTER 参数,使其匹配 CLUSTER=prod

在 backup 集群上的 /etc/sysconfig/ceph 文件中修改 CLUSTER 参数,使其匹配 CLUSTER=backup

2.将 /etc/ceph/ceph.conf 文件从 prod 集群复制到 backup 集群,存为 /etc/ceph/prod.conf

将 /etc/ceph/ceph.conf 文件从 backup 集群复制到 prod 集群,存为 /etc/ceph/backup.conf

3.在 prod 集群上,创建专用于 RBD 镜像功能的 cephx 用户,并为其配置对需要镜像的池的访问权限。

仅双向模式:在 backup 集群上,创建专用于 RBD 镜像功能的 cephx 用户,并为其配置对需要镜像的池的访问权限。

4.复制 prod 集群的用户的 keyring(/etc/ceph/ceph.client.mirror.keyring 复制到 backup 集群,存为 /etc/ceph/prod.client.mirror.keyring)。

仅双向模式:复制 backup 集群的用户的 keyring(/etc/ceph/ceph.client.mirror.keyring 复制到 prod 集群,存为 /etc/ceph/backup.client.mirror.keyring)。

5.在 backup 集群上安装 rbd-mirror 软件包。

仅双向模式:在 prod 集群上安装 rbd-mirror 软件包。

6.在 backup 集群上,配置、启用并启动 rbd-mirror 服务。

仅双向模式:在 prod 集群上,配置、启用并启动 rbd-mirror 服务。

7.在两个集群上,为所需的池启用 pool 或 image 模式的 RBD 镜像功能。

8.在 backup 集群上,将 prod 集群添加为对等集群。

仅双向模式:在 prod 集群上,将 backup 集群添加为对等集群。


如果配置单向 RBD 镜像功能,您不需要将配置和 keyring 文件从生产集群复制到远程集群。不过,它可以更轻松地管理被镜像的配置,因为在这之后,您可以从两个集群运行以任一集群为目标的命令。


单向池模式示例分步说明

本例中有两个集群 prod 和 bup,已更新了其中的 /etc/sysconfig/ceph 文件,也交叉复制了 Ceph 配置和 keyring 文件。由于这是测试,本例中将 client.admin 用于各个集群,而要镜像的是默认池 rbd。在开始这个过程之前,每个集群中必须存在用于存储 RBD 镜像的池的名称并且名称完全相同。

[ceph@server ~]$ yum -y install rbd-mirror
[ceph@server ~]$ systemctl enable ceph-rbd-mirror.target
[ceph@server ~]$ systemctl enable ceph-rbd-mirror@admin.service
[ceph@server ~]$ systemctl start ceph-rbd-mirror@admin.service
[ceph@server ~]$ rbd mirror pool enable rbd pool --cluster bup
[ceph@server ~]$ rbd mirror pool enable rbd pool --cluster prod
[ceph@server ~]$ rbd mirror pool status rbd --cluster bup
health: OK
images:  0 total
[ceph@server ~]$ rbd mirror pool status rbd --cluster prod
health: OK
images:  0 total
[ceph@server ~]$ rbd mirror pool info rbd --cluster bup
Mode: pool
Peers:  none
[ceph@server ~]$ rbd mirror pool info rbd --cluster prod
Mode: pool
Peers:  none
[ceph@server ~]$ rbd mirror pool peer add rbd client.admin@prod --cluster bup
2ece79b9-34b7-42fe-add1-ea9d6a10deb7
[ceph@server ~]$ rbd mirror pool status rbd --cluster bup
Mode: pool
Peers:
 UUID:                                NAME CLIENT
 2ece79b9-34b7-42fe-add1-ea9d6a10deb7 prod client.admin
[ceph@server ~]$ rbd mirror pool status rbd --cluster prod
Mode: pool
Peers:  none
[ceph@server ~]$ rbd  create rbd/prod1 --size=128M \
> --image-feature=exclusive-lock,journaling --cluster prod
[ceph@server ~]$ rbd -p rbd ls --cluster prod
prod1
[ceph@server ~]$ rbd -p rbd ls --cluster bup
prod1
[ceph@server ~]$ rbd image status rbd/prod1 --cluster prod
prod1:
 global_id:   b15a1331-d935-4fc1-b6b3-c5e8e4518a5e
 state:       down+unknown
 description: status not found
 last_update: 1969-12-31 16:00:00
[ceph@server ~]$ rbd image status rbd/prod1 --cluster bup
prod1:
 global_id:   b15a1331-d935-4fc1-b6b3-c5e8e4518a5e
 state:       up+replaying
 description: replaying, master_position=[object_number=3, tag_tid=1, entry_tid=3], mirror_position=[object_number=3, tag_tid=1, entry_tid=3], entries_behind_master=0
 last_update: 2017-06-22 15:08:21
   

在单向模式中,来源集群不知道复制的状态。只有 RBD 镜像代理(在目标集群中)才会更新状态信息。

如果使用单向镜像功能,那么在故障转移到次要镜像后,没有办法自动故障恢复到原始的主要 RBD 镜像。这是因为,生产集群上没有运行 RBD 镜像代理。简化这一过程的唯一办法是使用双向镜像模式。

故障转移过程

如果主要 RBD 镜像变得不可用,您可以使用下列步骤来启用对次要 RBD 镜像的访问:

  • 停止访问主要 RBD 镜像。也就是说,停止使用该镜像的所有应用和虚拟机。

  • 使用 rbd mirror image demote pool-name/image-name 命令来降级主要 RBD 镜像。

  • 使用 rbd mirror image promote pool-name/image-name 命令来升级次要 RBD 镜像。

  • 恢复访问 RBD 镜像。重新启动应用和虚拟机。

RBD 镜像功能命令参考

红帽  Ceph 存储支持使用 rbd 命令进行 RBD 镜像:

RBD 镜像功能命令

启用 RBD 镜像功能

rbd mirror pool enable pool-name mirror-mode

禁用 RBD 镜像功能

rbd mirror pool disable pool-name

添加对等集群

rbd mirror pool peer add pool-name client-name@cluster-name

显示镜像信息

rbd mirror pool info pool-name

删除对等集群

rbd mirror pool peer remove pool-name peer-uuid

启用某项功能

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

禁用某项功能

rbd feature disable pool-name/image-name feature-name

启用 RBD 镜像的镜像功能(镜像模式)

rbd mirror image enable pool-name/image-name

禁用 RBD 镜像的镜像功能(镜像模式)

rbd mirror image disable pool-name/image-name

降级主要副本

rbd mirror image demote pool-name/image-name

降级池中的所有主要副本

rbd mirror pool demote pool-name

升级次要副本

rbd mirror image promote pool-name/image-name

升级池中的所有次要副本

rbd mirror pool promote pool-name

强制重新同步

rbd mirror image resync pool-name/image-name

RBD 镜像的镜像状态

rbd mirror image status pool-name/image-name

池的镜像状态

rbd mirror pool status pool-name

RBD 镜像日志命令

rbd journal info pool-name/image-name

rbd journal status pool-name/image-name

RBD 镜像日志检查

rbd journal inspect pool-name/image-name

在损坏时重置和清理日志

rbd journal reset pool-name/image-name