块存储灾难恢复

RBD Mirror 是 Ceph 块存储(RBD)的一项功能,支持不同 Ceph 集群之间的异步数据复制,实现跨集群的灾难恢复(DR)。其核心功能是以主备模式同步数据,确保主集群故障时备份集群能够快速接管服务。

WARNING
  • RBD Mirror 基于快照进行增量同步,默认快照间隔为每小时一次(可配置)。主备集群之间的差异数据通常对应于一个快照周期内的写入。
  • RBD Mirror 仅提供底层存储数据备份,不负责 Kubernetes 资源备份。请使用平台的 备份与恢复 功能备份 PVC 和 PV 资源。

术语

术语说明
Primary Cluster当前提供存储服务的集群。
Secondary Cluster用于备份的备用集群。

备份配置

前提条件

  • 准备两个能够部署 Alauda Build 版本 Rook-Ceph 的集群:Primary 集群和 Secondary 集群,且两者之间网络连通。
  • 两个集群必须运行相同的平台版本(v3.12 及以上)。
  • 在 Primary 和 Secondary 集群中均创建分布式存储服务
  • 在 Primary 和 Secondary 集群中创建同名的块存储池。
  • 请确保以下两个镜像已上传至平台私有镜像仓库:
    • quay.io/csiaddons/k8s-controller:v0.12.0 -> <registry>/csiaddons/k8s-controller:v0.12.0
    • quay.io/csiaddons/k8s-sidecar:v0.12.0 -> <registry>/csiaddons/k8s-sidecar:v0.12.0

操作步骤

引导 Peer(Primary <-> Secondary

  1. 启用 Primary 集群块存储池的镜像功能

    在 Primary 和 Secondary 集群的 Control 节点上执行以下命令:

    Command
    Output
    kubectl -n rook-ceph patch cephblockpool <block-pool-name> \
      --type merge -p '{"spec":{"mirroring":{"enabled":true,"mode":"image"}}}'

    参数说明

    • <block-pool-name>:块存储池名称。
  2. 获取 Peer Token

    该令牌是建立集群间镜像连接的关键凭证。

    在 Primary 和 Secondary 集群的 Control 节点上执行以下命令:

    Command
    Output
    kubectl get secret -n rook-ceph \
      $(kubectl get cephblockpool.ceph.rook.io <block-pool-name> -n rook-ceph -o jsonpath='{.status.info.rbdMirrorBootstrapPeerSecretName}') \
      -o jsonpath='{.data.token}' | base64 -d
  3. 在对端集群创建 Peer Token Secret

    在 Primary 和 Secondary 集群的 Control 节点上执行以下命令:

    Command
    Output
    kubectl -n rook-ceph create secret generic rbd-peer-site-secret \
      --from-literal=token=<token> \
      --from-literal=pool=<block-pool-name>

    参数说明

    • <token>:从步骤 2获取的令牌。

      在 Primary 集群中,使用从 Secondary 集群获取的令牌配置此字段。

      在 Secondary 集群中,使用从 Primary 集群获取的令牌配置此字段。

    • <block-pool-name>:块存储池名称。

  4. 为块存储池 Patch Peer Secret

    在 Primary 和 Secondary 集群的 Control 节点上执行以下命令:

    Command
    Output
    kubectl -n rook-ceph patch cephblockpool <block-pool-name> --type merge -p \
    '{
      "spec": {
        "mirroring": {
          "peers": {
            "secretNames": [
              "rbd-peer-site-secret"
            ]
          }
        }
      }
    }'

    参数说明

    • <block-pool-name>:块存储池名称。
  5. 部署 Mirror Daemon

    该守护进程负责监控和管理 RBD 镜像同步流程,包括数据同步和错误处理。

    在 Primary 和 Secondary 集群的 Control 节点上执行以下命令:

    Command
    Output
    cat << EOF | kubectl apply -f -
    apiVersion: ceph.rook.io/v1
    kind: CephRBDMirror
    metadata:
      name: rbd-mirror
      namespace: rook-ceph
    spec:
      count: 1
    EOF
  6. 验证镜像状态

    在 Primary 和 Secondary 集群的 Control 节点上执行以下命令:

    Command
    Output
    kubectl get cephblockpools.ceph.rook.io <block-pool-name> -n rook-ceph -o jsonpath='{.status.mirroringStatus.summary}'

    参数说明

    • <block-pool-name>:块存储池名称。

配置卷复制环境

该功能支持高效的数据复制与同步,且不会中断主应用的正常运行,提升系统的可靠性和可用性。

  1. 部署 CsiAddons Controller

    在 Primary 和 Secondary 集群的 Control 节点上执行以下命令:

    kubectl create -f https://raw.githubusercontent.com/csi-addons/kubernetes-csi-addons/v0.12.0/deploy/controller/crds.yaml
    kubectl create -f https://raw.githubusercontent.com/csi-addons/kubernetes-csi-addons/v0.12.0/deploy/controller/setup-controller.yaml
    kubectl create -f https://raw.githubusercontent.com/csi-addons/kubernetes-csi-addons/v0.12.0/deploy/controller/rbac.yaml
    kubectl create -f https://raw.githubusercontent.com/csi-addons/kubernetes-csi-addons/v0.12.0/deploy/controller/csi-addons-config.yaml
    
    kubectl -n csi-addons-system set image deployment/csi-addons-controller-manager manager=<registry>/csiaddons/k8s-controller:v0.12.0

    参数说明

    • <registry>:平台的镜像仓库地址。
  2. 启用 CsiAddons sidecar

    在 Primary 和 Secondary 集群的 Control 节点上执行以下命令:

    kubectl patch cm rook-ceph-operator-config -n rook-ceph --type json --patch \
    '[
      {
        "op": "add",
        "path": "/data/CSI_ENABLE_OMAP_GENERATOR",
        "value": "true"
      },
      {
        "op": "add",
        "path": "/data/CSI_ENABLE_CSIADDONS",
        "value": "true"
      },
      {
        "op": "add",
        "path": "/data/ROOK_CSIADDONS_IMAGE",
        "value": "<registry>/csiaddons/k8s-sidecar:v0.12.0"
      }
    ]'

    等待所有 csi pod 成功重启

    kubectl get po -n rook-ceph -w | grep csi
  3. 创建 VolumeReplicationClass

    在 Primary 和 Secondary 集群的 Control 节点上执行以下命令:

    Command
    Output
    cat << EOF | kubectl apply -f -
    apiVersion: replication.storage.openshift.io/v1alpha1
    kind: VolumeReplicationClass
    metadata:
      name: rbd-volumereplicationclass
    spec:
      provisioner: rook-ceph.rbd.csi.ceph.com
      parameters:
        mirroringMode: snapshot
        schedulingInterval: "<scheduling-interval>"
        replication.storage.openshift.io/replication-secret-name: rook-csi-rbd-provisioner
        replication.storage.openshift.io/replication-secret-namespace: rook-ceph
    EOF
    1. <scheduling-interval>:调度间隔,例如 schedulingInterval: "1h" 表示每小时执行一次。

为 PVC 启用镜像功能

在 Primary 集群的 Control 节点上执行以下命令:

Command
Output
cat << EOF | kubectl apply -f -
apiVersion: replication.storage.openshift.io/v1alpha1
kind: VolumeReplication
metadata:
  name: <vr-name>
  namespace: <namespace>
spec:
  autoResync: false
  volumeReplicationClass: rbd-volumereplicationclass
  replicationState: primary
  dataSource:
    apiGroup: ""
    kind: PersistentVolumeClaim
    name: <pvc-name>
EOF
  1. <vr-name>:VolumeReplication 对象名称,建议与 PVC 名称相同。
  2. <namespace>:VolumeReplication 所属命名空间,必须与 PVC 命名空间一致。
  3. <pvc-name>:需要启用镜像的 PVC 名称。

注意 启用后,Secondary 集群中的 RBD 镜像将变为只读状态。

计划迁移

使用场景:数据中心维护、技术更新、灾难规避等。

迁移切换

迁移切换是指将生产环境切换到备份设施(通常是恢复站点)或反向切换的过程。

迁移时,应停止对主站点镜像的访问,并将镜像在 Secondary 集群上设为主,以便恢复访问。

前提条件

  • Primary 集群的 Kubernetes 资源已备份并恢复到 Secondary 集群,包括 PVC、PV、应用工作负载等。

操作步骤

按以下步骤将工作负载从 Primary 集群计划迁移至 Secondary 集群:

  1. 缩减所有在 Primary 集群使用镜像 PVC 的应用 Pod。

  2. 更新 Primary 集群中所有启用镜像的 PVC 的 VolumeReplication。

    spec.replicationState 设置为 secondary

  3. 在 Secondary 集群为所有启用镜像的 PVC 创建 VolumeReplication。

    示例
    cat << EOF | kubectl apply -f -
    apiVersion: replication.storage.openshift.io/v1alpha1
    kind: VolumeReplication
    metadata:
      name: <vr-name>
      namespace: <namespace>
    spec:
      autoResync: false
      volumeReplicationClass: rbd-volumereplicationclass
      replicationState: primary
      dataSource:
        apiGroup: ""
        kind: PersistentVolumeClaim
        name: <pvc-name>
    EOF
    1. <vr-name>:VolumeReplication 对象名称,建议与 PVC 名称相同。
    2. <namespace>:VolumeReplication 所属命名空间,必须与 PVC 命名空间一致。
    3. <pvc-name>:需要启用镜像的 PVC 名称。
  4. 检查 VolumeReplication CR 状态,确认镜像在 Secondary 站点被标记为 primary

  5. 镜像标记为 primary 后,PVC 即可使用。此时可以扩展应用以使用该 PVC。

灾难恢复

使用场景:自然灾害、断电、系统故障和崩溃等。

故障切换(突发停机)

发生灾难恢复时,在 Secondary 站点创建 VolumeReplication CR。

由于与 Primary 站点的连接丢失,operator 会自动向驱动发送 GRPC 请求,强制将数据源标记为 Secondary 站点的 primary

前提条件

  • Primary 集群的 Kubernetes 资源已备份并恢复到 Secondary 集群,包括 PVC、PV、应用工作负载等。

操作步骤

  1. 在 Secondary 集群为所有启用镜像的 PVC 创建 VolumeReplication。

    示例
    cat << EOF | kubectl apply -f -
    apiVersion: replication.storage.openshift.io/v1alpha1
    kind: VolumeReplication
    metadata:
      name: <vr-name>
      namespace: <namespace>
    spec:
      autoResync: false
      volumeReplicationClass: rbd-volumereplicationclass
      replicationState: primary
      dataSource:
        apiGroup: ""
        kind: PersistentVolumeClaim
        name: <pvc-name>
    EOF
    1. <vr-name>:VolumeReplication 对象名称,建议与 PVC 名称相同。
    2. <namespace>:VolumeReplication 所属命名空间,必须与 PVC 命名空间一致。
    3. <pvc-name>:需要启用镜像的 PVC 名称。
  2. 检查 VolumeReplication CR 状态,确认镜像在 Secondary 站点被标记为 primary

  3. 镜像标记为 primary 后,PVC 即可使用。此时可以扩展应用以使用该 PVC。

故障恢复后切换回主站点

当 Primary 站点的故障集群恢复后,若需从 Secondary 站点切换回主站点,请按以下步骤操作:

前提条件

  • Primary 集群的 Kubernetes 资源已备份并恢复到 Secondary 集群,包括 PVC、PV、应用工作负载等。

操作步骤

  1. 缩减主站点正在运行的应用(如有),确保所有工作负载使用的持久卷不再被主集群使用。

  2. 在主站点更新 VolumeReplication CR,将 replicationState 从 primary 修改为 secondary。

  3. 缩减 Secondary 站点的应用。

  4. 在 Secondary 站点更新 VolumeReplication CR,将 replicationState 从 primary 修改为 secondary

  5. 在主站点确认 VolumeReplication 状态标记为卷已准备好使用。

  6. 卷标记为准备好使用后,在主站点将 replicationState 从 secondary 修改为 primary。

  7. 在主站点重新扩展应用。