创建和管理同步复制的磁盘


区域级 Persistent DiskHyperdisk Balanced 高可用性是存储选项,可让您在 Compute Engine 中实现高可用性 (HA) 服务。区域级 Persistent Disk 和 Hyperdisk Balanced 高可用性可在同一区域中的两个可用区之间同步复制数据,并在发生一个可用区级故障时确保磁盘数据的高可用性。 同步复制的磁盘可以是启动磁盘,也可以是非启动磁盘。

本文档介绍了如何对复制的磁盘执行以下任务:

准备工作

  • 查看不同类型的磁盘存储选项之间的差异
  • 查看同步磁盘复制的基础知识。
  • 了解复制的磁盘故障切换
  • 如果您尚未设置身份验证,请进行设置。身份验证是通过其进行身份验证以访问 Google Cloud 服务和 API 的过程。如需从本地开发环境运行代码或示例,您可以按如下方式向 Compute Engine 进行身份验证。

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

    Console

    When you use the Google Cloud console to access Google Cloud services and APIs, you don't need to set up authentication.

    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. Terraform

      如需在本地开发环境中使用本页面上的 Terraform 示例,请安装并初始化 gcloud CLI,然后使用您的用户凭据设置应用默认凭据。

      1. Install the Google Cloud CLI.
      2. To initialize the gcloud CLI, run the following command:

        gcloud init
      3. If you're using a local shell, then create local authentication credentials for your user account:

        gcloud auth application-default login

        You don't need to do this if you're using Cloud Shell.

      如需了解详情,请参阅 Set up authentication for a local development environment

      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.disks.create
  • compute.instances.attachDisk
  • compute.disks.use
  • 创建磁盘的快照: compute.disks.createSnapshot
  • 查看磁盘的详细信息: compute.disks.get
  • 获取磁盘列表: compute.disks.list
  • 更改磁盘大小: compute.disks.update

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

限制

  • 您只能将区域级永久性磁盘挂接到使用 E2N1N2N2D 机器类型的虚拟机。
  • 您只能将 Hyperdisk Balanced 高可用性挂接到支持的机器类型
  • 您无法通过映像或通过映像创建的磁盘创建区域级永久性磁盘。
  • 使用只读模式时,您最多可以将一个区域级平衡永久性磁盘挂接到 10 个虚拟机实例。
  • 区域级标准永久性磁盘的大小下限为 200 GiB。
  • 您只能增加 区域级 Persistent Disk 或Hyperdisk Balanced 高可用性卷的大小;而无法减小其大小。
  • 区域级 Persistent Disk 和 Hyperdisk Balanced 高可用性卷与其对应的可用区级磁盘具有不同的性能特征。如需了解详情,请参阅块存储性能
  • 如果您通过克隆可用区级磁盘来创建复制磁盘,则两个可用区级副本在创建时不会完全同步。创建后,您一般可以在 3 分钟内使用区域级磁盘克隆。不过,您可能需要等待几十分钟,磁盘才会完全复制,恢复点目标 (RPO) 才会接近于零。了解如何检查复制磁盘是否已完全复制

关于将复制的磁盘用作虚拟机的启动磁盘

在预配生产工作负载之前,您可以挂接区域级 Persistent Disk 磁盘或 Hyperdisk Balanced 高可用性(预览版)磁盘作为提前预配的有状态工作负载的启动磁盘。复制的启动磁盘不适用于热备用,因为复制的启动磁盘无法同时挂接到两个虚拟机。

您只能通过快照创建 区域级 Persistent Disk 卷或 Hyperdisk Balanced 高可用性卷;无法通过映像创建复制的磁盘。

如需将复制的磁盘用作虚拟机启动磁盘,请使用以下任一方法:

  1. 创建具有复制的启动磁盘的新虚拟机
  2. 创建复制的启动磁盘,然后将其挂接到虚拟机:
    1. 通过启动磁盘的快照创建复制的磁盘
    2. 将复制的启动磁盘挂接到虚拟机

如果您需要将复制的启动磁盘故障切换到副本可用区中正在运行的备用虚拟机,请按照将复制的启动磁盘挂接到虚拟机中所述的步骤操作。

创建同步复制的磁盘

创建区域级 Persistent Disk 卷或 Hyperdisk Balanced 高可用性(预览版)卷。磁盘必须与您计划将其挂接到的虚拟机位于同一区域。

对于区域级 Persistent Disk,如果您在 Google Cloud 控制台中创建磁盘,则默认磁盘类型pd-balanced。如果您使用 gcloud CLI 或 REST 创建磁盘,则默认磁盘类型为 pd-standard

控制台

  1. 在 Google Cloud 控制台中,转到磁盘页面。

    转到“磁盘”

  2. 选择所需项目。

  3. 点击创建磁盘

  4. 指定磁盘的名称

  5. 位置部分,选择区域级

  6. 选择区域可用区。您必须选择与创建虚拟机时选择的相同区域。

  7. 选择同一区域中的副本可用区。记下所选的可用区,因为您必须将磁盘挂接到位于其中一个可用区的虚拟机。

  8. 选择磁盘来源类型

  9. 选择磁盘类型大小

  10. 点击创建以完成磁盘的创建。

gcloud

使用 compute disks create 命令创建同步复制的磁盘。

如果您需要使用区域级 SSD Persistent Disk 以实现更高的吞吐量或 IOPS,请添加 --type 标志并指定 pd-ssd

gcloud compute disks create DISK_NAME \
   --size=DISK_SIZE \
   --type=DISK_TYPE \
   --region=REGION \
   --replica-zones=ZONE1,ZONE2

替换以下内容:

  • DISK_NAME:新磁盘的名称
  • DISK_SIZE:新磁盘的大小(以 GB 为单位)
  • DISK_TYPE:对于区域级 Persistent Disk,这是复制的磁盘的类型。默认值为 pd-standard。 对于 Hyperdisk,请指定值 hyperdisk-balanced-high-availability
  • REGION:复制的磁盘所在的区域,例如 europe-west1
  • ZONE1ZONE2:两个磁盘副本所在区域内的可用区,例如 europe-west1-b,europe-west1-c

Terraform

如需创建区域级 Persistent Disk 卷或 Hyperdisk Balanced 高可用性卷,您可以使用 google_compute_region_disk 资源

resource "google_compute_region_disk" "regiondisk" {
  name                      = "region-disk-name"
  snapshot                  = google_compute_snapshot.snapdisk.id
  type                      = "pd-ssd"
  region                    = "us-central1"
  physical_block_size_bytes = 4096
  size                      = 11

  replica_zones = ["us-central1-a", "us-central1-f"]
}

REST

如需创建区域级 Persistent Disk 卷或 Hyperdisk Balanced 高可用性卷,请构建对 compute.regionDisks.insert 方法POST 请求。

如需创建空白磁盘,请勿指定快照来源。

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/disks
{
  "name": "DISK_NAME",
  "region": "projects/PROJECT_ID/regions/REGION",
  "replicaZones": [
    "projects/PROJECT_ID/zones/ZONE1",
    "projects/PROJECT_ID/zones/ZONE2"
  ],
  "sizeGb": "DISK_SIZE",
  "type": "projects/PROJECT_ID/regions/REGION/diskTypes/DISK_TYPE"
}

替换以下内容:

  • PROJECT_ID:您的项目 ID
  • REGION:复制的磁盘所在的区域,例如 europe-west1
  • DISK_NAME:新磁盘的名称
  • ZONE1ZONE2:新磁盘副本应位于的可用区
  • DISK_SIZE:新磁盘的大小(以 GB 为单位)
  • DISK_TYPE:对于区域级 Persistent Disk,这是 Persistent Disk 的类型。 对于 Hyperdisk,请指定值 hyperdisk-balanced-high-availability

将复制的磁盘挂接到虚拟机

对于非启动磁盘,在创建区域级 Persistent Disk 卷或 Hyperdisk Balanced 高可用性(预览版)卷后,您可以将其挂接到虚拟机。虚拟机必须与磁盘位于同一区域。

如需将复制的启动磁盘挂接到虚拟机,请参阅将复制的启动磁盘挂接到虚拟机

控制台

  1. 如需将磁盘挂接到虚拟机,请进入虚拟机实例页面。

    转到虚拟机实例

  2. 名称列中,点击虚拟机的名称。

  3. 点击修改

  4. 点击 +挂接现有磁盘

  5. 选择要添加到虚拟机的之前创建的复制磁盘。

  6. 如果您看到一条警告,指示所选磁盘已挂接到其他实例,请选中强制挂接磁盘复选框,将该磁盘强制挂接到正在修改的虚拟机。

    如需了解强制挂接复制的磁盘的应用场景,请参阅复制的磁盘故障切换

  7. 点击保存

  8. 修改虚拟机页面上,点击保存

gcloud

如需将复制的磁盘挂接到正在运行或已停止的虚拟机,请使用 compute instances attach-disk 命令并将 --disk-scope 标志设置为 regional

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

替换以下内容:

  • VM_NAME:您要将复制的磁盘添加到的虚拟机的名称
  • DISK_NAME:您要挂接到虚拟机的新磁盘的名称

Terraform

如需将区域级 Persistent Disk 卷或 Hyperdisk Balanced 高可用性卷挂接到虚拟机,您可以使用 google_compute_attached_disk 资源

resource "google_compute_instance" "test_node" {
  name         = "test-node"
  machine_type = "f1-micro"
  zone         = "us-west1-a"

  boot_disk {
    initialize_params {
      image = "debian-cloud/debian-11"
    }
  }
  attached_disk {
    source      = google_compute_disk.default.id
    device_name = google_compute_disk.default.name
  }

  network_interface {
    network = "default"
    access_config {
      # Ephemeral IP
    }
  }

  # Ignore changes for persistent disk attachments
  lifecycle {
    ignore_changes = [attached_disk]
  }


}

REST

如需将复制的磁盘挂接到正在运行或已停止的虚拟机,请构建对 compute.instances.attachDisk 方法POST 请求,并添加您创建的复制磁盘的网址。

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/VM_NAME/attachDisk
{
  "source": "/projects/PROJECT_ID/regions/REGION/disks/DISK_NAME"
}

替换以下内容:

  • PROJECT_ID:您的项目 ID
  • ZONE:您的虚拟机的位置
  • VM_NAME:您要将新的复制磁盘添加到的虚拟机的名称
  • REGION:复制的磁盘所在的区域
  • DISK_NAME:复制磁盘的名称

对于非启动磁盘,在创建空白复制磁盘并将其挂接到虚拟机后,您必须格式化并装载磁盘,以便操作系统可以使用可用的存储空间。

将可用区级磁盘更改为复制的磁盘

如需将现有的可用区级 Persistent Disk 转换为区域级 Persistent Disk,请通过克隆现有的可用区级磁盘来创建新磁盘。如需了解详情,请参阅通过可用区级磁盘创建区域级磁盘克隆

如需将 Hyperdisk 转换为同步复制的磁盘,请按照更改磁盘类型中所述,通过现有磁盘的快照创建新的 Hyperdisk Balanced 高可用性磁盘。

创建具有复制的磁盘的新虚拟机

创建虚拟机时,您可以视需要将区域级 Persistent Disk 卷或Hyperdisk Balanced 高可用性(预览版)卷作为额外磁盘进行添加。

如需在创建虚拟机期间创建区域级 Persistent Disk 卷或Hyperdisk Balanced 高可用性卷并将其挂接到虚拟机,请参阅以下任一内容:

创建具有复制的启动磁盘的新虚拟机

设置高可用性虚拟机实例时,您可以创建具有复制的启动磁盘的主虚拟机。如果发生可用区级服务中断,您可以重启次要可用区中的虚拟机,而不是创建新的虚拟机。

在高可用性设置(其中启动设备是复制的磁盘)中,Google 建议您不要预先创建并启动备用实例。而是在故障切换阶段,在创建备用实例时使用 forceAttach 选项挂接现有复制的磁盘。

如需创建启动磁盘是复制的磁盘的虚拟机,请使用以下任一方法:

gcloud

使用 gcloud compute instances create 命令创建虚拟机,并使用 --create-disk 标志指定复制的磁盘。

gcloud compute instances create PRIMARY_INSTANCE_NAME  \
 --zone=ZONE  \
 --create-disk=^:^name=REPLICATED_DISK_NAME:scope=regional:boot=true:type=DISK_TYPE:source-snapshot=SNAPSHOT_NAME:replica-zones=ZONE,REMOTE_ZONE

指定磁盘参数时,字符 ^:^ 指定参数之间的分隔符是英文冒号 (:)。这样您可以在指定 replica-zones 参数时使用英文逗号 (,)。

替换以下内容:

  • PRIMARY_INSTANCE_NAME:虚拟机的名称
  • ZONE:您要在其中创建虚拟机的可用区的名称
  • REPLICATED_DISK_NAME:复制的磁盘的名称
  • DISK_TYPE:要创建的磁盘的类型,例如 hyperdisk-balanced-high-availability预览版) 或 pd-balanced
  • SNAPSHOT_NAME:您为启动磁盘创建的快照的名称
  • REMOTE_ZONE:复制的磁盘的备用可用区

REST

创建对 instances.insert 方法POST 请求,并指定属性 boot: 'true'replicaZones。例如:

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances
{
 "name": "VM_NAME",
 "disks": [{
    "boot": true,
    "initializeParams": {
       "sourceSnapshot": "global/snapshots/BOOT_SNAPSHOT_NAME",
       "replicaZones": [
           "projects/PROJECT_ID/zones/ZONE",
           "projects/PROJECT_ID/zones/REMOTE_ZONE"
       ],
       "diskType": "projects/PROJECT_ID/zones/ZONE/diskTypes/DISK_TYPE"
    }
  }],
 "networkInterfaces": [
    {
      "network": "global/networks/default"
    }
  ]
}

请替换以下内容:

  • PROJECT_ID:您的项目 ID
  • ZONE:要创建虚拟机的可用区的名称
  • VM_NAME:虚拟机的名称
  • BOOT_SNAPSHOT_NAME:启动磁盘快照的名称
  • REMOTE_ZONE:复制的磁盘的远程可用区
  • DISK_TYPE:要创建的磁盘的类型,例如 hyperdisk-balanced-high-availability预览版) 或 pd-balanced

将复制的启动磁盘挂接到虚拟机

请按照以下步骤操作:

  • 将现有虚拟机的启动磁盘替换为复制的启动磁盘。
  • 将复制的启动磁盘故障切换到在备份可用区中运行的热备用虚拟机。为此,您可以将复制的磁盘作为启动磁盘挂接到虚拟机。

这些步骤假定复制的磁盘和虚拟机已存在。

gcloud

  1. 停止虚拟机。
    gcloud compute instances stop VM_NAME  --zone=ZONE
    
  2. 将当前启动磁盘与虚拟机分离。
    gcloud compute instances detach-disk VM_NAME \
     --zone=ZONE --disk=CURRENT_BOOT_DEVICE_NAME
    
  3. 将复制的启动磁盘挂接到虚拟机。
    gcloud compute instances attach-disk VM_NAME  \
     --zone=ZONE  \
     --disk=REPLICATED_DISK_NAME  \
     --disk-scope=regional --force-attach
    
  4. 重启虚拟机。

    gcloud compute instances start VM_NAME
    

将上述命令中的变量替换为以下变量:

  • VM_NAME:您要将复制的启动磁盘挂接到的虚拟机的名称
  • ZONE:虚拟机所在的可用区
  • CURRENT_BOOT_DEVICE_NAME:虚拟机正在使用的启动磁盘的名称。此名称通常与虚拟机名称相同。
  • REPLICATED_DISK_NAME:您要作为启动磁盘挂接到虚拟机的复制磁盘的名称

可选:如果您由于服务中断或故障而无法成功将复制的启动磁盘与主虚拟机分离,请添加 --force-attach 标志。

REST

  1. 停止虚拟机。

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/VM_NAME/stop
    
  2. 将当前启动磁盘与虚拟机分离。

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/VM_NAME/detachDisk?deviceName=CURRENT_BOOT_DEVICE_NAME
    
  3. 将复制的启动磁盘挂接到虚拟机。

    构建对 compute.instances.attachDisk 方法的 POST 请求,并添加复制的启动磁盘的网址:

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/VM_NAME/attachDisk
    {
    "source": "compute/v1/projects/PROJECT_ID/regions/REGION/disks/REPLICATED_DISK_NAME",
    "boot": true
    }
  4. 重启虚拟机。

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/VM_NAME/start
    

将上述命令中的变量替换为以下变量:

  • PROJECT_ID:您的项目 ID
  • VM_NAME:您要将复制磁盘挂接到的虚拟机的名称
  • ZONE:虚拟机所在的可用区
  • CURRENT_BOOT_DEVICE_NAME:虚拟机正在使用的启动磁盘的名称。此名称通常与虚拟机名称相同。
  • REGION:复制的磁盘所在的区域
  • REPLICATED_DISK_NAME:您要作为启动磁盘挂接到虚拟机的复制磁盘的名称

可选:如果您由于服务中断或故障而无法成功将复制的启动磁盘与其最初挂接到的虚拟机分离,请在请求正文中添加 "forceAttach": true

列出和描述复制的磁盘

您可以查看所有已配置的复制磁盘的列表,以及有关其属性的信息,包括:

  • 磁盘 ID
  • 磁盘名称
  • 大小
  • 磁盘类型
  • 区域
  • 可用区副本

如需查看有关复制的磁盘的详细信息,请使用以下选项:

调整复制的磁盘的大小

如果具有同步复制的磁盘的虚拟机需要额外存储空间,您可以调整磁盘的大小。无论磁盘是否已挂接到正在运行的虚拟机,您都可以随时调整磁盘的大小。如果您需要将数据拆分到多个唯一卷中,请为虚拟机创建多个辅助磁盘。对于 Hyperdisk Balanced 高可用性,您还可以提高磁盘的 IOPS 和吞吐量限制。

调整复制磁盘大小的命令与调整非复制磁盘大小的命令非常类似。但是,您必须为磁盘位置指定区域,而不是可用区。

您只能增加磁盘大小,而不能减小磁盘大小。如需减小磁盘大小,您必须创建较小的新磁盘。在删除较大的原始磁盘之前,您需要为这两个磁盘付费。

如需了解如何修改复制的磁盘,请参阅以下内容:

后续步骤