管理同步复制磁盘的故障


区域级 Persistent Disk 和平衡 Hyperdisk 高可用性是可在同一区域中的两个可用区之间同步复制数据的存储选项。当您在 Compute Engine 中实现高可用性 (HA) 服务时,可以使用区域级 Persistent Disk 或平衡 Hyperdisk 高可用性作为基础组件。

本文档介绍了可能中断同步复制磁盘工作的各种场景,以及如何管理这些场景。

准备工作

  • 查看有关同步复制磁盘和故障切换的基础知识。如需了解详情,请参阅同步磁盘复制简介
  • 如果您尚未设置身份验证,请进行设置。身份验证是通过其进行身份验证以访问 Google Cloud 服务和 API 的过程。如需从本地开发环境运行代码或示例,您可以按如下方式向 Compute Engine 进行身份验证。

    Select the tab for how you plan to use the samples on this page:

    gcloud

    1. Install the Google Cloud CLI, then initialize it by running the following command:

      gcloud init
    2. Set a default region and zone.
    3. REST

      如需在本地开发环境中使用本页面上的 REST API 示例,请使用您提供给 gcloud CLI 的凭据。

        Install the Google Cloud CLI, then initialize it by running the following command:

        gcloud init

      如需了解详情,请参阅 Google Cloud 身份验证文档中的使用 REST 时进行身份验证

所需的角色

如需获得使用副本恢复检查点迁移同步复制磁盘数据所需的权限,请让管理员向您授予以下 IAM 角色:

如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限

这些预定义角色包含使用副本恢复检查点迁移同步复制磁盘数据所需的权限。如需查看所需的确切权限,请展开所需权限部分:

所需权限

使用副本恢复检查点迁移同步复制磁盘数据需要以下权限:

  • 如需从副本恢复检查点创建标准快照,请执行以下操作:
    • 针对项目的 compute.snapshots.create 权限
    • 针对磁盘的 compute.disks.createSnapshot 权限
  • 通过标准快照创建新的同步复制磁盘:针对要创建新磁盘的项目的 compute.disks.create 权限
  • 如需将虚拟机迁移到新磁盘,请执行以下操作:
    • 针对虚拟机实例的 compute.instances.attachDisk
    • 针对新创建的磁盘的 compute.disks.use permission 权限

您也可以使用自定义角色或其他预定义角色来获取这些权限。

故障场景

使用同步复制磁盘时,如果设备完全复制,数据会自动复制到一个区域中的两个可用区。当某次写入的数据持久保留在两个副本中时,系统会确认此次写入操作,并将结果返回到计算实例。

如果复制到一个可用区操作失败或在一段时间内非常慢,则磁盘复制状态会切换为降级。在此模式下,写入的数据持久保留在一个副本中后,系统会确认写入操作。

如果 Compute Engine 检测到可以继续复制,则在另一个副本进入降级状态后写入一个副本的数据会同步到这两个可用区,并且磁盘将恢复为完全复制状态。此转换完全自动化。

当设备处于降级状态时,未定义 RPO 和 RTO。如需最大限度地减少在降级状态下运行的磁盘发生故障时的数据和可用性损失,我们建议您定期使用标准快照备份同步复制磁盘。您可以通过恢复快照来恢复磁盘。

区域故障

复制磁盘(即区域级磁盘)会同步复制到主可用区和次要可用区中的磁盘副本。当可用区级副本不可用时,就会发生可用区级故障。由于以下某种原因,主可用区或次要可用区可能会发生可用区级故障:

  • 发生可用区服务中断。
  • 副本在写入操作中遇到速度缓慢的问题。

下表提供了同步复制磁盘可能会遇到的各种可用区级故障场景,以及针对每种场景的推荐操作。在上述每种场景中,系统都会假设主可用区级副本在初始状态期间健康状况良好并同步。

磁盘的初始状态 失败 磁盘的新状态 失败后果 要执行的操作

主实例:已同步

辅助副本:已同步

磁盘状态:已完全复制

挂接的磁盘:主要可用区

主可用区

主副本:不同步或不可用

辅助副本:已同步

磁盘状态:已降级

挂接的磁盘:主要可用区

  • 次要可用区中的副本运行状况良好,并且具有最新的磁盘数据。
  • 主要可用区中的副本健康状况不佳,无法保证具有所有磁盘数据。
通过强制挂接磁盘来对运行状况良好的次要可用区中的虚拟机进行故障切换。

主实例:已同步

辅助副本:已同步

磁盘状态:已完全复制

挂接的磁盘:主要可用区

次要可用区

主实例:已同步

辅助副本:不同步或不可用

磁盘状态:已降级

挂接的磁盘:主要可用区

  • 主要可用区中的副本保持运行状况良好,并具有最新的磁盘数据。
  • 次要可用区中的副本运行状况不佳,无法保证具有所有磁盘数据。
您无需执行任何操作。Compute Engine 会在辅助可用区中的运行状况不佳的副本再次可用后使其恢复同步。

主实例:已同步

辅助副本:不同步且不可用

磁盘状态:已降级

挂接的磁盘:主要可用区

主可用区

主副本:已同步,但不可用

辅助副本:不同步

磁盘状态:不可用

挂接的磁盘:主要可用区

  • 两个可用区副本均不可用,因此无法处理流量。 磁盘将变得不可用。
  • 如果可用区服务中断或复制故障是临时的,则不会丢失任何数据。
  • 如果可用区服务中断或复制故障是永久性的,则在磁盘降级期间写入运行状况良好的副本的所有数据都将永久丢失。
Google 建议您使用现有标准快照并创建新的磁盘来恢复数据。最佳实践是定期使用标准快照备份复制磁盘。

主实例:已同步

辅助副本:同步但可用

磁盘状态:同步

挂接的磁盘:主要可用区

主可用区

主副本:不可用

辅助副本:同步但可用

磁盘状态:不可用

挂接的磁盘:主要可用区

  • 两个可用区副本无法处理流量。磁盘将变得不可用。
  • 如果可用区服务中断或复制故障是临时的,则磁盘会在主副本再次可用后恢复操作。
  • 如果可用区服务中断或复制故障是永久性的,则您的磁盘将变得不可用。

主实例:已同步

辅助副本:不同步,但可用

磁盘状态:已降级

挂接的磁盘:主要可用区

主可用区

主副本:不可用

辅助副本:不同步,但可用

磁盘状态:不可用

挂接的磁盘:主要可用区

  • 两个可用区副本无法处理流量。磁盘将变得不可用。
  • 如果可用区服务中断或复制故障是临时的,则磁盘会在主副本再次可用后恢复操作。
  • 如果可用区服务中断或复制故障是永久性的,则您的磁盘将变得不可用。

应用和虚拟机故障

如果由虚拟机配置错误、操作系统升级失败或其他应用故障导致服务中断,您可以对复制磁盘执行 force-attach 操作,以挂接到健康状况良好的副本所在可用区中的计算实例。

故障类别和(概率) 故障类型 操作
应用故障(高)
  • 无响应的应用
  • 由于应用管理操作(例如升级)而失败
  • 人为错误(例如 SSL 证书或 ACL 等参数配置错误)
应用控制层面可以根据健康检查阈值触发故障切换
虚拟机故障(中)
  • 基础架构或硬件故障
  • 虚拟机因 CPU 争用、中间网络中断而无响应
虚拟机通常会自动修复。应用控制平面可以根据健康检查阈值触发故障切换
应用崩溃(中低) 应用数据损坏
(例如,由于应用 bug 或操作系统升级失败导致的应用数据损坏)
应用恢复:

使用 force-attach 功能对复制磁盘进行故障切换

如果主可用区发生故障,您可以使用强制挂接操作将区域级 Persistent Disk 或 平衡 Hyperdisk 高可用性卷(预览版)故障切换到另一个可用区中的计算实例。

如果主可用区发生故障,您可能无法从实例分离磁盘,因为系统无法访问实例来执行分离操作。借助强制挂接功能,您可以将区域级 Persistent Disk 或 平衡 Hyperdisk 高可用性卷挂接到计算实例,即使该卷已挂接到另一个实例。

完成强制挂接操作后,Compute Engine 会阻止原始实例向复制磁盘写入数据。使用强制挂接操作,您可以安全地重新获得对数据的访问权限并恢复服务。此外,您也可以选择在执行强制挂接操作后手动关停虚拟机实例

如需将现有磁盘强制挂接到计算实例,请选择以下任务之一:

控制台

  1. 转到虚拟机实例页面。

    转到“虚拟机实例”

  2. 选择您的项目。

  3. 点击要更改的实例名称。

  4. 在详细信息页面上,点击修改

  5. 额外磁盘部分中,点击挂接额外磁盘

  6. 从下拉列表中选择区域级复制磁盘。

  7. 要强制挂接磁盘,请选中强制挂接磁盘复选框。

  8. 点击完成,然后点击保存

解决故障后,您可以执行相同的步骤以对磁盘执行 force-attach 操作,来挂接到原始实例。

gcloud

在 gcloud CLI 中,使用 instances attach-disk 命令将副本磁盘挂接到计算实例。添加 --disk-scope 标志并将其设置为 regional

gcloud compute instances attach-disk VM_NAME \
    --disk DISK_NAME --disk-scope regional \
    --force-attach

替换以下内容:

  • VM_NAME:区域中新计算实例的名称
  • DISK_NAME:复制磁盘的名称

对磁盘执行 force-attach 操作后,如有必要,请将文件系统装载在磁盘上。计算实例可以使用强制挂接的磁盘继续进行磁盘读取和写入操作。

REST

构建一个向 compute.instances.attachDisk 方法发出的 POST 请求,并在其中添加您刚创建的复制磁盘的网址。如需将磁盘挂接到新的计算实例,如果主计算实例仍挂接该磁盘,则需要使用 forceAttach=true 查询参数。

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/VM_NAME/attachDisk?forceAttach=true

{
 "source": "projects/PROJECT_ID/regions/REGION/disks/DISK_NAME"
}

替换以下内容:

  • PROJECT_ID:您的项目 ID
  • ZONE:计算实例的位置
  • VM_NAME:您要在其中添加复制磁盘的计算实例的名称
  • REGION:复制磁盘所在的区域
  • DISK_NAME:复制磁盘的名称

在挂接复制磁盘后,您可以根据需要将文件系统装载在磁盘上。计算实例可以使用副本磁盘继续进行磁盘读取和写入操作。

将启动磁盘故障切换到次要实例

一个计算实例只能挂接一个启动磁盘。对复制启动磁盘进行故障切换时,请使用以下任一方法,具体取决于次要计算实例是否已存在:

使用副本恢复检查点恢复复制磁盘

副本恢复检查点表示完全复制区域级 Persistent Disk 或 平衡 Hyperdisk 高可用性(预览版)卷的最新崩溃一致时间点。借助 Compute Engine,您可以从副本恢复检查点为降级区域级磁盘创建标准快照。

在极少数情况下,如果磁盘降级,与最新磁盘数据同步的可用区级副本也可能会在不同步的副本完成同步之前失败。您无法将磁盘强制挂接到任一可用区中的计算实例。您的复制磁盘将不可用,必须将数据迁移到新磁盘。在这种情况下,如果没有任何适用于磁盘的现有标准快照,您仍然可以使用根据副本恢复检查点创建的标准快照从不完整副本恢复磁盘数据。 如需了解详细步骤,请参阅迁移和恢复磁盘数据的过程

迁移和恢复磁盘数据的过程

如需使用副本恢复检查点恢复并迁移复制磁盘的数据,请执行以下步骤:

  1. 通过副本恢复检查点创建受影响区域级 Persistent Disk 或 平衡 Hyperdisk 高可用性(预览版)卷的标准快照。

    您只能使用 gcloud CLI 或 REST,通过磁盘的副本恢复检查点为磁盘创建标准快照。

    gcloud

    如需使用副本恢复检查点创建快照,请使用 gcloud compute snapshots create 命令。 添加 --source-disk-for-recovery-checkpoint 标志以指定要使用副本恢复检查点创建快照。排除 --source-disk--source-disk-region 参数。

    gcloud compute snapshots create SNAPSHOT_NAME \
        --source-disk-for-recovery-checkpoint=SOURCE_DISK \
        --source-disk-for-recovery-checkpoint-region=SOURCE_REGION \
        --storage-location=STORAGE_LOCATION \
        --snapshot-type=SNAPSHOT_TYPE
    

    请替换以下内容:

    • DESTINATION_PROJECT_ID:您要在其中创建快照的项目的 ID。
    • SNAPSHOT_NAME:快照的名称。
    • SOURCE_DISK:要用于创建快照的来源磁盘的名称或完整路径。若要指定来源磁盘的完整路径,请使用以下语法:
        projects/SOURCE_PROJECT_ID/regions/SOURCE_REGION/disks/SOURCE_DISK_NAME
        

      如果指定来源磁盘的完整路径,则可以排除 --source-disk-for-recovery-checkpoint-region 标志。如果仅指定磁盘的名称,则必须添加此标志。

      如需通过其他项目中来源磁盘的恢复检查点创建快照,您必须指定来源磁盘的完整路径。

    • SOURCE_PROJECT_ID:要用于创建快照的检查点的来源磁盘的项目 ID。
    • SOURCE_REGION:要用于创建快照的检查点的来源磁盘的区域。
    • SOURCE_DISK_NAME:要用于创建快照的检查点的来源磁盘的名称。
    • STORAGE_LOCATION:可选:要存储快照的 Cloud Storagemulti-regionCloud Storageregion。请注意,您只能指定一个存储位置。
      只有在您想要替换在快照设置中配置的预定义或自定义默认存储位置时,才应使用 --storage-location 标志。
    • SNAPSHOT_TYPE:快照类型:STANDARDARCHIVE。如果未指定快照类型,系统会创建 STANDARD 快照。

    您可以使用副本恢复检查点仅在降级的磁盘上创建快照。 如果您尝试在完全复制设备后根据副本恢复检查点创建快照,则会看到以下错误消息:

    The device is fully replicated and should not create snapshots out of a recovery checkpoint. Please
    create regular snapshots instead.
    

    REST

    若要使用副本恢复检查点创建快照,请向 snapshots.insert 方法发出 POST 请求。排除 sourceDisk 参数,添加 sourceDiskForRecoveryCheckpoint 参数,以指定要使用检查点创建快照。

    POST https://compute.googleapis.com/compute/v1/projects/DESTINATION_PROJECT_ID/global/snapshots
    
    {
      "name": "SNAPSHOT_NAME",
      "sourceDiskForRecoveryCheckpoint": "projects/SOURCE_PROJECT_ID/regions/SOURCE_REGION/disks/SOURCE_DISK_NAME",
      "storageLocations": "STORAGE_LOCATION",
      "snapshotType": "SNAPSHOT_TYPE"
    }
    

    请替换以下内容:

    • DESTINATION_PROJECT_ID:您要在其中创建快照的项目的 ID。
    • SNAPSHOT_NAME:快照的名称。
    • SOURCE_DISK:要用于创建快照的来源磁盘的名称或完整路径。若要指定来源磁盘的完整路径,请使用以下语法:
        projects/SOURCE_PROJECT_ID/regions/SOURCE_REGION/disks/SOURCE_DISK_NAME
        

      如果指定来源磁盘的完整路径,则可以排除 --source-disk-for-recovery-checkpoint-region 标志。如果仅指定磁盘的名称,则必须添加此标志。

      如需通过其他项目中来源磁盘的恢复检查点创建快照,您必须指定来源磁盘的完整路径。

    • SOURCE_PROJECT_ID:要用于创建快照的检查点的来源磁盘的项目 ID。
    • SOURCE_REGION:要用于创建快照的检查点的来源磁盘的区域。
    • SOURCE_DISK_NAME:要用于创建快照的检查点的来源磁盘的名称。
    • STORAGE_LOCATION:可选:要存储快照的 Cloud Storagemulti-regionCloud Storageregion。请注意,您只能指定一个存储位置。
      仅当您想要替换快照设置中配置的预定义或自定义默认存储位置时,才应使用 storageLocations 参数。
    • SNAPSHOT_TYPE:快照类型:STANDARDARCHIVE。如果未指定快照类型,系统会创建 STANDARD 快照。

    您可以使用副本恢复检查点仅在降级的磁盘上创建快照。 如果您尝试在完全复制设备后根据副本恢复检查点创建快照,则会看到以下错误消息:

    The device is fully replicated and should not create snapshots out of a recovery checkpoint. Please
    create regular snapshots instead.
    

  2. 使用此快照创建新的 区域级 Persistent Disk 或 平衡 Hyperdisk 高可用性磁盘。创建新磁盘时,您可以通过从快照将数据恢复到新磁盘,从最新副本恢复检查点恢复所有数据。如需了解详细步骤,请参阅使用复制启动磁盘创建新虚拟机

  3. 将所有虚拟机工作负载迁移到新创建的磁盘,并验证这些虚拟机工作负载是否正常运行。如需了解详情,请参阅跨可用区或区域移动虚拟机

恢复磁盘数据和虚拟机并将其迁移到新创建的区域级 Persistent Disk 或 平衡 Hyperdisk 高可用性磁盘后,您可以继续操作。

确定副本恢复检查点提供的 RPO

本部分介绍了如何确定 区域级 Persistent Disk 或 平衡 Hyperdisk 高可用性(预览版)卷的最新副本恢复检查点所提供的 RPO。

可用区副本完全同步

Compute Engine 大约每 10 分钟刷新一次区域级 Persistent Disk 或平衡 Hyperdisk 高可用性卷的副本恢复检查点。因此,当可用区级副本完全同步后,RPO 大约为 10 分钟。

可用区副本不同步

您无法查看副本恢复检查点的确切创建和刷新时间戳。但是,您可以使用以下数据来估算最新检查点提供的近似 RPO:

  • 完全复制磁盘状态的最新时间戳:您可以使用复制磁盘的 replica_state 指标的 Cloud Monitoring 数据来获取此信息。在 replica_state 指标数据中检查是否存在不同步副本,以确定副本不同步的时间。Compute Engine 每 10 分钟刷新一次磁盘的检查点,因此最新检查点刷新可能比该时间戳早大约 10 分钟。
  • 最新写入操作时间戳:您可以使用复制磁盘的 write_ops_count 指标的 Cloud Monitoring 数据来获取此信息。检查 write_ops_count 指标数据以确定磁盘的最新写入操作。

确定这些时间戳后,请使用以下公式计算磁盘的副本恢复检查点提供的近似 RPO。如果计算值小于零,则 RPO 实际上为零。

Approximate RPO provided by the latest checkpoint = (Most recent write operation timestamp - (Most recent timestamp of the fully replicated disk state - 10 minutes))

后续步骤