Skip to main content
本产品推出了新版本。
简体中文版经机器翻译而成,仅供参考。如与英语版出现任何冲突,应以英语版为准。

使用 SnapMirror 复制卷

Trident 支持一个集群上的源卷与对等集群上的目标卷之间的镜像关系,用于复制数据以进行灾难恢复。  您可以使用命名空间的自定义资源定义 (CRD),称为 Trident Mirror Relationship (TMR) 来执行以下操作:

  • 创建卷 (PVC) 之间的镜像关系

  • 删除卷之间的镜像关系

  • 中断镜像关系

  • 在灾难情况(故障转移)期间提升辅助卷

  • 执行应用程序从集群到集群的无损转换(在计划的故障转移或迁移期间)

复制先决条件

在开始之前,请确保满足以下先决条件:

ONTAP 集群
  • Trident:Trident 版本 22.10 或更高版本必须存在于使用 ONTAP 作为后端的源和目标 Kubernetes 集群上。

  • 许可证:必须在源和目标 ONTAP 集群上启用使用数据保护捆绑包的 ONTAP SnapMirror 异步许可证。有关详细信息,请参见 "ONTAP 中的 SnapMirror 许可概述"

    从 ONTAP 9.10.1 开始,所有许可证都以 NetApp 许可证文件 (NLF) 的形式交付,该文件是启用多个功能的单个文件。有关详细信息,请参见 "ONTAP One 附带的许可证"

    备注 仅支持 SnapMirror 异步保护。
对等
  • 集群和 SVM:必须对等 ONTAP 存储后端。有关详细信息,请参见 "集群和 SVM 对等概述"

    重要说明 确保在两个 ONTAP 集群之间的复制关系中使用的 SVM 名称是唯一的。
  • Trident 和 SVM:对等远程 SVM 必须可用于目标集群上的 Trident。

支持的驱动程序

NetApp Trident 支持使用由以下驱动程序支持的存储类的 NetApp SnapMirror 技术进行卷复制: ontap-nas: NFS ontap-san: iSCSI ontap-san: FC ontap-san: NVMe/TCP(需要最低 ONTAP 版本 9.15.1)

备注 ASA r2 系统不支持使用 SnapMirror 进行卷复制。有关 ASA r2 系统的信息,请参见 "了解 ASA r2 存储系统"

创建镜像 PVC

按照以下步骤并使用 CRD 示例在主卷和二级卷之间创建镜像关系。

步骤
  1. 在主 Kubernetes 集群上执行以下步骤:

    1. 使用 trident.netapp.io/replication: true 参数创建 StorageClass 对象。

      示例
      apiVersion: storage.k8s.io/v1
      kind: StorageClass
      metadata:
        name: csi-nas
      provisioner: csi.trident.netapp.io
      parameters:
        backendType: "ontap-nas"
        fsType: "nfs"
        trident.netapp.io/replication: "true"
    2. 使用先前创建的 StorageClass 创建 PVC。

      示例
      kind: PersistentVolumeClaim
      apiVersion: v1
      metadata:
        name: csi-nas
      spec:
        accessModes:
        - ReadWriteMany
        resources:
          requests:
            storage: 1Gi
        storageClassName: csi-nas
    3. 使用本地信息创建 MirrorRelationship CR。

      示例
      kind: TridentMirrorRelationship
      apiVersion: trident.netapp.io/v1
      metadata:
        name: csi-nas
      spec:
        state: promoted
        volumeMappings:
        - localPVCName: csi-nas

      Trident 获取卷的内部信息和卷的当前数据保护 (DP) 状态,然后填充 MirrorRelationship 的 status 字段。

    4. 获取 TridentMirrorRelationship CR 以获取 PVC 的内部名称和 SVM。

      kubectl get tmr csi-nas
      kind: TridentMirrorRelationship
      apiVersion: trident.netapp.io/v1
      metadata:
        name: csi-nas
        generation: 1
      spec:
        state: promoted
        volumeMappings:
        - localPVCName: csi-nas
      status:
        conditions:
        - state: promoted
          localVolumeHandle: "datavserver:trident_pvc_3bedd23c_46a8_4384_b12b_3c38b313c1e1"
          localPVCName: csi-nas
          observedGeneration: 1
  2. 请在辅助 Kubernetes 集群上执行以下步骤:

    1. 使用 trident.netapp.io/replication: true 参数创建 StorageClass。

      示例
      apiVersion: storage.k8s.io/v1
      kind: StorageClass
      metadata:
        name: csi-nas
      provisioner: csi.trident.netapp.io
      parameters:
        trident.netapp.io/replication: true
    2. 创建包含目标和源信息的 MirrorRelationship CR。

      示例
      kind: TridentMirrorRelationship
      apiVersion: trident.netapp.io/v1
      metadata:
        name: csi-nas
      spec:
        state: established
        volumeMappings:
        - localPVCName: csi-nas
          remoteVolumeHandle: "datavserver:trident_pvc_3bedd23c_46a8_4384_b12b_3c38b313c1e1"

      Trident 将创建一个具有已配置关系策略名称(或 ONTAP 默认值)的 SnapMirror 关系并对其进行初始化。

    3. 使用先前创建的 StorageClass 创建 PVC 以充当辅助(SnapMirror 目标)。

      示例
      kind: PersistentVolumeClaim
      apiVersion: v1
      metadata:
        name: csi-nas
        annotations:
          trident.netapp.io/mirrorRelationship: csi-nas
      spec:
        accessModes:
        - ReadWriteMany
      resources:
        requests:
          storage: 1Gi
      storageClassName: csi-nas

      Trident 将检查 TridentMirrorRelationship CRD,如果关系不存在,则无法创建卷。如果存在此关系,Trident 将确保将新 FlexVol 卷放置到与 MirrorRelationship 中定义的远程 SVM 对等的 SVM 上。

卷复制状态

Trident 镜像关系(TMR)是表示 PVC 之间复制关系的一端的 CRD。目标 TMR 有一个状态,它告诉 Trident 所需的状态是什么。目标 TMR 具有以下状态:

  • Established:本地 PVC 是镜像关系的目标卷,这是一种新的关系。

  • Promoted:本地 PVC 是 ReadWrite 且可挂载的,目前没有镜像关系生效。

  • 已重新建立:本地 PVC 是镜像关系的目标卷,此前也处于该镜像关系中。

    • 如果目标卷与源卷之间曾经存在关系,则必须使用重新建立的状态,因为它会覆盖目标卷的内容。

    • 如果卷以前未与源建立关系,则重新建立状态将失败。

在计划外故障转移期间提升辅助 PVC

在辅助 Kubernetes 集群上执行以下步骤:

  • 将 TridentMirrorRelationship 的 spec.state 字段更新为 promoted

在计划的故障转移期间推广辅助 PVC

在计划的故障转移(迁移)期间,请执行以下步骤来升级辅助 PVC:

步骤
  1. 在主 Kubernetes 集群上,创建 PVC 的快照,并等待创建快照。

  2. 在主 Kubernetes 集群上,创建 SnapshotInfo CR 以获取内部详细信息。

    示例
    kind: SnapshotInfo
    apiVersion: trident.netapp.io/v1
    metadata:
      name: csi-nas
    spec:
      snapshot-name: csi-nas-snapshot
  3. 在辅助 Kubernetes 集群上,将 TridentMirrorRelationship CR 的 spec.state 字段更新为 promoted,将 spec.promotedSnapshotHandle 更新为快照的 internalName。

  4. 在辅助 Kubernetes 集群上,确认 TridentMirrorRelationship 的状态(status.state 字段)为 promoted。

故障转移后恢复镜像关系

在恢复镜像关系之前,请选择要作为新主要关系的一侧。

步骤
  1. 在辅助 Kubernetes 集群上,请确保更新了 TridentMirrorRelationship 上的 spec.remoteVolumeHandle 字段的值。

  2. 在辅助 Kubernetes 集群上,将 TridentMirrorRelationship 的 spec.mirror 字段更新为 reestablished

其他操作

Trident 支持主卷和二级卷上的以下操作:

将主要 PVC 复制到新的次要 PVC

请确保已有一个主要 PVC 和一个次要 PVC。

步骤
  1. 从已建立的辅助(目标)集群中删除 PersistentVolumeClaim 和 TridentMirrorRelationship CRD。

  2. 从主(源)集群中删除 TridentMirrorRelationship CRD。

  3. 在要建立的新辅助(目标) PVC 的主(源)集群上创建新的 TridentMirrorRelationship CRD。

调整镜像、主 PVC 或辅助 PVC 的大小

PVC 可以正常调整大小,如果数据量超过当前大小,ONTAP 将自动扩展任何目标 flexvols。

从 PVC 中删除复制

要删除复制,请在当前辅助卷上执行以下操作之一:

  • 删除辅助 PVC 上的 MirrorRelationship。这会破坏复制关系。

  • 或者,将 spec.state 字段更新为 promoted

删除 PVC(先前已镜像)

Trident 检查复制的 PVC,并在尝试删除卷之前释放复制关系。

删除 TMR

删除镜像关系一侧的 TMR 会导致剩余的 TMR 在 Trident 完成删除之前过渡到 promoted 状态。如果选择删除的 TMR 已经处于 promoted 状态,则不存在现有的镜像关系,TMR 将被删除,Trident 会将本地 PVC 提升为 ReadWrite。此删除将释放 ONTAP 中本地卷的 SnapMirror 元数据。如果将来在镜像关系中使用此卷,则在创建新的镜像关系时,必须使用具有 established 卷复制状态的新 TMR。

ONTAP 联机时更新镜像关系

镜像关系建立后可以随时更新。您可以使用 `state: promoted`或 `state: reestablished`字段更新关系。将目标卷升级到常规 ReadWrite 卷时,您可以使用 promotedSnapshotHandle 指定要将当前卷还原到的特定快照。

ONTAP 离线时更新镜像关系

您可以使用 CRD 执行 SnapMirror 更新,而无需 Trident 直接连接到 ONTAP 集群。请参阅以下 TridentActionMirrorUpdate 格式示例:

示例
apiVersion: trident.netapp.io/v1
kind: TridentActionMirrorUpdate
metadata:
  name: update-mirror-b
spec:
  snapshotHandle: "pvc-1234/snapshot-1234"
  tridentMirrorRelationshipName: mirror-b

status.state 反映了 TridentActionMirrorUpdate CRD 的状态。它可以取自 SucceededIn ProgressFailed 的值。