管理区域级永久性磁盘的故障


区域级永久性磁盘是一种存储选项,用于在同一区域中的两个可用区之间同步复制数据。当您在 Compute Engine 中实现高可用性 (HA) 服务时,可以使用区域级永久性磁盘作为基础组件。

本文档介绍了可能中断区域级永久性磁盘卷工作的各种场景,以及如何管理这些场景。

准备工作

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

    选择标签页以了解您打算如何使用本页面上的示例:

    gcloud

    1. 安装 Google Cloud CLI,然后通过运行以下命令初始化 Google Cloud CLI:

      gcloud init
    2. 设置默认区域和可用区

    REST

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

      安装 Google Cloud CLI,然后通过运行以下命令初始化 Google Cloud CLI:

      gcloud init

故障场景

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

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

如果 Compute Engine 检测到可以继续复制,则之前自设备进入降级状态以来写入的数据会同步到这两个可用区,并且磁盘将返回完全复制状态。此转换完全自动化。

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

区域故障

区域级永久性磁盘卷会同步复制到主要和次要可用区中的磁盘副本。当可用区副本发生故障并变得不可用时,就会发生可用区级故障。由于以下某种原因,可用区可能会出现故障:

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

下表提供了区域级永久性磁盘可能会遇到的各种可用区故障场景,以及每种场景的推荐操作。 在上述每种情况下,系统都会假设主要可用区副本在初始状态期间运行状况良好并同步。

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

主实例:已同步

辅助副本:已同步

磁盘状态:已完全复制

挂接的磁盘:主要可用区

主可用区

主副本:不同步或不可用

辅助副本:已同步

磁盘状态:已降级

挂接的磁盘:主要可用区

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

主实例:已同步

辅助副本:已同步

磁盘状态:已完全复制

挂接的磁盘:主要可用区

次要可用区

主实例:已同步

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

磁盘状态:已降级

挂接的磁盘:主要可用区

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

主实例:已同步

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

磁盘状态:已降级

挂接的磁盘:主要可用区

主可用区

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

辅助副本:不同步

磁盘状态:不可用

挂接的磁盘:主要可用区

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

主实例:已同步

辅助副本:同步但可用

磁盘状态:同步

挂接的磁盘:主要可用区

主可用区

主副本:不可用

辅助副本:同步但可用

磁盘状态:不可用

挂接的磁盘:主要可用区

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

主实例:已同步

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

磁盘状态:已降级

挂接的磁盘:主要可用区

主可用区

主副本:不可用

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

磁盘状态:不可用

挂接的磁盘:主要可用区

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

应用和虚拟机故障

如果由虚拟机配置错误、操作系统升级失败或其他应用故障导致服务中断,您可以将区域级永久性磁盘卷 force-attach 挂接到同一区域的虚拟机实例。

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

使用 force-attach 功能对区域级永久性磁盘进行故障切换

如果主可用区发生故障,您可以使用强制挂接操作将区域级永久性磁盘卷故障切换到另一个可用区中的虚拟机。如果主可用区发生故障,您可能无法从虚拟机分离磁盘,因为系统无法访问虚拟机来执行分离操作。借助强制挂接操作,您可以将区域级永久性磁盘卷挂接到虚拟机,即使该卷已挂接到另一个虚拟机也是如此。完成强制挂接操作后,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:新磁盘的名称

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

使用副本恢复检查点恢复降级的区域级永久性磁盘卷

副本恢复检查点表示完全复制的区域级永久性磁盘卷的最新崩溃一致时间点。借助 Compute Engine,您可以从副本恢复检查点为降级磁盘创建标准快照。

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

所需的角色

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

  • 如需使用副本恢复检查点迁移区域级永久性磁盘数据: 针对项目的 Compute Instance Admin (v1) (roles/compute.instanceAdmin.v1) 角色

如需详细了解如何授予角色,请参阅管理访问权限

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

所需权限

使用副本恢复检查点迁移区域级永久性磁盘数据时需要以下权限:

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

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

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

如需使用副本恢复检查点恢复并迁移区域级永久性磁盘卷的数据,请执行以下步骤:

  1. 从副本的恢复检查点创建受影响区域级永久性磁盘卷的标准快照。您只能使用 Google Cloud 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. 使用此快照创建新的区域级永久性磁盘卷。创建新磁盘时,您可以将数据移动到新磁盘,从最近的副本恢复检查点恢复所有数据。如需了解详细步骤,请参阅使用区域级永久性磁盘启动磁盘创建新虚拟机

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

恢复磁盘数据和虚拟机并将其迁移到新创建的区域级永久性磁盘卷后,您可以继续操作。

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

本部分介绍如何确定区域级永久性磁盘卷的最新副本恢复检查点提供的 RPO。

可用区副本完全同步

Compute Engine 大约每 10 分钟刷新一次区域级永久性磁盘卷的副本恢复检查点。因此,当可用区副本完全同步时,RPO 大约为 10 分钟。

可用区副本不同步

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

  • 完全复制的磁盘状态的最新时间戳:您可以使用 replica_state 指标的区域级永久性磁盘 Cloud Monitoring 数据获取此信息。检查 replica_state 指标数据是否存在不同步副本,以确定副本不同步的时间。Compute Engine 每 10 分钟刷新一次磁盘的检查点,因此最新的检查点刷新可能比该时间戳早大约 10 分钟刷新一次。
  • 最近的写入操作时间戳:您可以使用永久性磁盘 Cloud Monitoring 数据作为 write_ops_count 指标来获取此信息。检查 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))

后续步骤