在实例之间共享磁盘


您可以将磁盘挂接到每个虚拟机 (VM) 或裸机实例,从而从多个虚拟机或裸机实例访问同一磁盘。您可以将只读模式或多写入者模式下的磁盘挂接到实例。

使用只读模式时,多个实例只能从磁盘读取数据。所有实例都无法将数据写入磁盘。在实例之间共享只读模式下的磁盘比在多个磁盘上拥有相同数据的多个副本的费用低。

使用多写入者模式时,多个实例可以读写同一磁盘。这对于高可用性 (HA) 共享文件系统和数据库(例如 SQL Server 故障切换集群基础设施 [FCI])非常有用。

您只能在同一可用区中的实例之间共享可用区级磁盘。区域级磁盘只能与磁盘副本所在可用区中的实例共享。

在实例之间共享磁盘不会产生任何额外费用。Compute Engine 实例不必使用相同的机器类型即可共享磁盘,但每个实例都必须使用支持磁盘共享的机器类型。

本文档介绍了 Compute Engine 中的多写入者磁盘和只读磁盘共享,包括支持的磁盘类型和性能注意事项。

准备工作

  • 如果您尚未设置身份验证,请进行设置。身份验证是通过其进行身份验证以访问 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. REST

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

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

        gcloud init

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

启用磁盘共享

您可以将现有 Hyperdisk 或 Persistent Disk 卷挂接到多个实例。不过,对于 Hyperdisk 卷,您必须先通过设置磁盘的访问模式将磁盘置于多写入者模式或只读模式。

Hyperdisk 卷的访问模式是一个属性,用于确定实例如何访问磁盘。

可用的访问模式如下:

  • 单写入者模式 (READ_WRITE_SINGLE):这是默认访问模式。 允许磁盘在任何时候最多挂接到一个实例。实例具有磁盘的读写权限。
  • 只读模式 (READ_ONLY_MANY):支持在只读模式下同时挂接到多个实例。实例无法将数据写入此模式下的磁盘。此模式对于只读共享是必需的。
  • 多写入者模式 (READ_WRITE_MANY):支持在读写模式下同时挂接到多个实例。此模式对于多写入者共享是必需的。

对每种访问模式的支持因 Hyperdisk 类型而异,如下表所示。您无法为 Hyperdisk Throughput 卷或 Hyperdisk Extreme 卷设置访问模式。

Hyperdisk 类型 支持的访问模式
Hyperdisk Balanced
Hyperdisk Balanced 高可用性(预览版
  • 单写入者模式
  • 多写入者模式
Hyperdisk ML
  • 单写入者模式
  • 只读模式
Hyperdisk Throughput
Hyperdisk Extreme
  • 单写入者模式

对于可在实例之间共享的磁盘,您可以在创建磁盘时或之后设置访问模式。如需了解如何设置访问模式,请参阅设置磁盘的访问模式

Hyperdisk 和 Persistent Disk 的只读模式

本部分介绍如何在多个实例之间共享只读模式下的单个磁盘。

只读模式支持的磁盘类型

您可以将以下磁盘类型以只读模式挂接到多个实例:

  • Hyperdisk ML
  • 可用区级和区域级 Balanced Persistent Disk
  • SSD 永久性磁盘
  • 标准永久性磁盘

只读模式下的性能

将只读模式下的磁盘挂接到多个实例不会影响该磁盘的性能。每个实例仍可达到实例的机器类型可实现的磁盘性能上限。

共享只读模式下的磁盘的限制

  • 如果您共享只读模式下的 Hyperdisk ML 卷,则无法重新启用对磁盘的写入权限。
  • 每 30 秒可以将 Hyperdisk ML 卷挂接到最多 100 个实例。
  • 磁盘可挂接到的实例数量上限因磁盘类型而异:

    • 对于 Hyperdisk ML 卷,实例数量上限取决于预配的大小,如下所示:

      • 卷大小小于 256 GiB:2,500 个虚拟机
      • 容量至少为 256 GiB 且小于 1 TiB 的卷:1,500 个虚拟机
      • 容量至少为 1 TiB 且小于 2 TiB 的卷:600 个虚拟机
      • 容量至少为 2 TiB 的卷:30 个虚拟机
    • 只读模式下的可用区级或区域级 Balanced Persistent Disk 卷最多支持 10 个实例。
    • 对于 SSD Persistent Disk,Google 建议最多 100 个实例。
    • 对于标准 Persistent Disk 卷,建议的上限为 10 个实例。

如何在实例之间共享只读模式下的磁盘

如果您不使用 Hyperdisk ML,请按照将非启动磁盘挂接到实例中的说明将磁盘挂接到多个实例。

如需将只读模式下的 Hyperdisk ML 卷挂接到多个实例,您必须先将磁盘的访问模式设置为只读模式。设置访问模式后,将 Hyperdisk ML 卷挂接到实例

Hyperdisk 的多写入者模式

多写入者模式下的磁盘适用于以下应用场景:

  • 实现 SQL Server 故障切换集群基础设施 (FCI)
  • 其中的多个实例都将数据写入同一磁盘的集群文件系统
  • 采用主动-主动或主动-被动模式的高可用性系统。将同一磁盘挂接到多个实例可以防止中断,因为如果一个实例发生故障,其他实例仍有权访问该磁盘并继续运行工作负载。

如果您的主要目标是计算实例之间的共享文件存储,请考虑以下选项之一:

多写入者模式支持的 Hyperdisk 和机器类型

您可以使用多写入者模式下的 Hyperdisk Balanced 卷和 Hyperdisk Balanced 高可用性(预览版)卷。您可以将一个多写入者模式下的卷挂接到最多 8 个实例。

Hyperdisk Balanced 支持以下机器类型的多写入者模式:

Hyperdisk Balanced 高可用性支持以下机器类型的多写入者模式(预览版):

Hyperdisk 的多写入者模式支持 NVMe 接口。如果您要将多写入者模式下的磁盘挂接到实例,则实例的启动磁盘还必须挂接 NVMe。

多写入者模式支持的文件系统

如需从多个实例访问磁盘,请使用以下选项之一:

  • 永久性预留 (PR),尤其适用于 SQL Server FCI 和 NetApp ONTAP 等高可用性系统。Google 建议使用 PR 命令提供 I/O 防护并维护数据完整性。如需查看支持的 PR 命令列表,请参阅使用永久性预留实现 I/O 防护
  • 支持多个实例写入同一卷的集群文件系统。此类文件系统的示例包括 OCFS2、VMFS 和 GFS2。
  • Lustre 和 IBM Spectrum Scale 等横向扩容软件系统。
  • 您自己的同步机制,用于协调并发读写。

多写入者模式下的 Hyperdisk 性能

当您将多写入者模式下的磁盘挂接到多个实例时,磁盘的预配性能会在所有实例之间平均共享。性能会平均分配给所有实例,即使是未运行或未主动使用磁盘的实例也是如此。不过,每个实例的最大性能最终受每个实例的机器类型的吞吐量和 IOPS 上限的限制。

例如,假设您将预配了 100,000 IOPS 的 Hyperdisk Balanced 卷挂接到 2 个实例。每个实例可同时获得 5 万 IOPS。

下表展示了此示例中每个实例将获得的性能,具体取决于您将磁盘挂接到多少个实例。每当您将磁盘挂接到另一个实例时,Compute Engine 都会异步调整分配给之前已挂接的每个实例的性能。

关联的实例数 1 2 3 4 5 6 7 8
每个实例的 IOPS 上限
100000 5 万 ~33,333 25000 20,000 ~16,667 14285 12,500
每个实例的吞吐量上限(以 MiBps 为单位)

1200 600 400 300 240 200 ~172 150

共享多写入者模式下的 Hyperdisk 卷的限制

  • 您可以将一个多写入者模式下的 Hyperdisk Balanced 卷或 Hyperdisk Balanced 高可用性卷挂接到最多 8 个实例。
  • 您无法克隆多写入者模式下的磁盘。
  • 您无法通过多写入者模式下的磁盘创建快照、机器映像或磁盘映像。
  • 在创建或修改实例时,您无法创建多写入者模式下的 Hyperdisk 卷。您必须先单独创建磁盘,然后将其挂接到实例。
  • 您无法调整多写入者模式下的磁盘大小,除非您将该磁盘从所有实例中分离。
  • 您可以对多写入者模式下的磁盘进行以下更改,即使该磁盘已挂接到多个实例:

    • 修改磁盘的预配 IOPS 或吞吐量
    • 将磁盘挂接到其他实例

    当您进行上述任一更改时,Compute Engine 会将磁盘的预配置性能重新分配给所有已挂接的实例。此过程最长可能需要 6 小时才能完成。

  • 您无法通过多写入者模式下的磁盘创建映像。

  • 您无法为多写入者模式下的磁盘启用自动删除功能。

  • 您无法将处于多写入者模式的磁盘用作实例的启动磁盘。

  • 多写入者模式下的磁盘无法与单租户节点上的实例搭配使用。

  • 您必须使用与实例的启动磁盘相同的接口类型。

  • 您无法更改挂接到多写入者模式下的磁盘的实例的机器类型。

  • 存储池不支持多写入者模式下的磁盘。

可用区域

所有提供 Hyperdisk Balanced 和 Hyperdisk Balanced 高可用性的区域都支持多写入者模式。

使用永久性预留实现 I/O 防护

Google 建议将永久性预留 (PR) 与多写入者模式下的磁盘搭配使用,以提供 I/O 防护。永久性预留用于管理对实例之间的磁盘的访问权限。这样可以防止实例同时将数据写入磁盘的同一部分而导致数据损坏。

多写入者模式下的 Hyperdisk 卷支持 NVMe(规范 1.2.1)预留。

支持的预留模式

支持以下预留模式:

  1. 写入独占:有一个预留持有者和一个写入者。所有其他注册者/非注册者都仅拥有读取权限。
  2. 写入独占 - 仅限注册者:有一个预留持有者。所有注册者都拥有磁盘的读写权限。非注册者仅拥有读取权限。

不支持以下预留模式:

  • 写入独占 - 所有注册者
  • 独占访问
  • 独占访问 - 仅限注册者
  • 独占访问 - 所有注册者

支持 NVMe Get Features - Host Identifier。实例编号用作默认主机 ID。

不支持以下 NVMe 预留功能:

  • 设置功能 - 主机标识符
  • 预留通知:
    • “获取日志”页面
    • 预留通知屏蔽

支持的命令

NVMe 预留支持以下命令:

  • 预留注册操作 (RREGA) - 替换/注册/取消注册 - IEKEY
  • 预留获取操作 (RACQA) - 获取/抢占 - IEKEY
  • 预留释放操作 (RRELA) - 释放/清除 - IEKEY
  • 预留报告
  • 标识命名空间数据结构中的预留功能 (RESCAP) 字段。

NVMe 预留不支持以下命令:

  • 抢占和取消
  • 停用 Persist Through Power Loss (PTPL)。PTPL 始终处于启用状态。

如何共享多写入者模式下的磁盘

在您将多写入者模式下磁盘挂接到多个实例之前,您必须将磁盘的访问模式设置为多写入者。您可以在创建磁盘时设置其访问模式。

您也可以为现有磁盘设置访问模式,但必须先将磁盘从所有实例中分离。

如需以多写入者模式创建和使用新磁盘,请按照以下步骤操作:

  1. 创建磁盘,并将其访问模式设置为多写入者模式。
  2. 将磁盘挂接到每个实例

如需以多写入者模式下使用现有磁盘,请按照以下步骤操作:

  1. 从所有实例中分离磁盘。
  2. 将磁盘的访问模式设置为多写入者模式
  3. 将磁盘挂接到每个实例

Persistent Disk 卷的多写入者模式

您可以将多写入者模式的 SSD Persistent Disk 卷同时挂接到最多两个 N2 虚拟机 (VM) 实例,使两个虚拟机均可读写该磁盘。

如果您有 2 个以上的 N2 虚拟机,或者您使用的是任何其他机器系列,则可以使用以下选项之一:

如需为新的 Persistent Disk 卷启用多写入者模式,请创建新的 Persistent Disk 卷,并在 gcloud CLI 中指定 --multi-writer 标志或在 Compute Engine API 中指定 multiWriter 属性。

采用多写入者模式的 Persistent Disk 卷提供共享块存储功能,并为构建分布式存储系统和类似高可用性服务提供了基础架构基础。在使用多写入者模式的 Persistent Disk 卷时,请使用能够跨多个虚拟机协调对 Persistent Disk 设备的访问的横向扩容存储软件系统。这些存储系统的示例包括 Lustre 和 IBM Spectrum Scale。大多数单虚拟机文件系统(如 EXT4、XFS 和 NTFS)都不支持使用共享块存储。

如需了解详情,请参阅本文档中的最佳做法。如果您需要全代管式文件存储,可以在 Compute Engine 实例上装载 Filestore 文件共享

多写入者模式下的 Persistent Disk 卷支持部分 SCSI-3 永久性预留 (SCSI PR) 命令。高可用性应用可以将这些命令用于 I/O 防护和故障切换配置。

支持以下 SCSI PR 命令:

  • IN {REPORT CAPABILITIES, READ FULL STATUS, READ RESERVATION, READ KEYS}
  • OUT {REGISTER, REGISTER AND IGNORE EXISTING KEY, RESERVE, PREEMPT, CLEAR, RELEASE}

如需查看相关说明,请参阅在虚拟机之间共享多写入者模式下的 SSD Persistent Disk 卷

多写入者模式支持的 Persistent Disk 类型

您可以将多写入者模式下的 SSD Persistent Disk 同时挂接到最多 2 个 N2 虚拟机。

多写入者模式的最佳实践

  • 使用 SCSI PR 命令实现的 I/O 防护会使 Persistent Disk 数据具有崩溃一致状态。某些文件系统不具有崩溃一致性,因此如果使用 SCSI PR 命令,这些文件系统可能会损坏。
  • 许多文件系统(如 EXT4、XFS 和 NTFS)并非旨在与共享块存储一起使用,并且没有同步或执行源自多个虚拟机实例的操作的机制。
  • 在使用多写入者模式的 Persistent Disk 卷之前,请务必了解您的文件系统以及如何将该文件系统安全地用于共享块存储以及同时来自多个实例的访问。

多写入者模式下的 Persistent Disk 性能

在多写入者模式下创建的 Persistent Disk 卷具有特定的 IOPS 和吞吐量限制。

可用区级 SSD 永久性磁盘多写入者模式
最大持续 IOPS
读取 IOPS/GB 30
写入 IOPS/GB 30
读取 IOPS/实例 15000–100000*
写入 IOPS/实例 15000–100000*
最大持续吞吐量 (MB/s)
读取吞吐量/GB 0.48
写入吞吐量/GB 0.48
读取吞吐量/实例 240–1200*
写入吞吐量/实例 240–1200*
* 永久性磁盘 IOPS 和吞吐量性能取决于磁盘大小、实例的 vCPU 数量和 I/O 块大小等诸多因素
将多写入者磁盘挂接到多个虚拟机实例不会影响总体性能或费用。按磁盘的性能限制会分摊到每个虚拟机。

如需了解如何在多个虚拟机之间共享永久性磁盘,请参阅在虚拟机之间共享永久性磁盘

共享多写入者模式下的磁盘的限制

  • 只有 SSD 类型的 Persistent Disk 卷支持多写入者模式。
  • 您可以在任何可用区创建多写入者模式的 Persistent Disk 卷,但只能将该磁盘挂接到以下位置中的虚拟机:
    • australia-southeast1
    • europe-west1
    • us-central1(仅限 us-central1-aus-central1-c 可用区)
    • us-east1(仅限 us-east1-d 可用区)
    • us-west1(仅限 us-west1-bus-west1-c 可用区)
  • 挂接的虚拟机必须具有 N2 机器类型
  • 磁盘大小下限为 10 GiB。
  • 多写入者模式下的磁盘不支持一次挂接 2 个以上的虚拟机。多写入者模式 Persistent Disk 卷不支持 Persistent Disk 指标
  • 多写入者模式中的磁盘不能更改为只读模式。
  • 您无法使用磁盘映像或快照创建多写入者模式的 Persistent Disk 卷。
  • 您无法通过多写入者模式下的 Persistent Disk 卷创建快照或映像。
  • 降低 IOPS 限制。如需了解详情,请参阅磁盘性能
  • 您无法调整多写入者 Persistent Disk 卷的大小。
  • 使用 Google Cloud CLI 创建实例时,您无法使用 --create-disk 标志创建多写入者 Persistent Disk 卷。

在虚拟机之间共享一个多写入者模式的 SSD Persistent Disk 卷

您可以在同一可用区的多个 N2 虚拟机之间共享一个多写入者模式的 SSD Persistent Disk 卷。如需详细了解此模式的工作原理,请参阅 Persistent Disk 多写入者模式。您可以按照以下过程创建并挂接多写入者 Persistent Disk 卷:

gcloud

使用 gcloud CLI 创建和挂接可用区级 Persistent Disk 卷:

  1. 使用 gcloud beta compute disks create 命令创建可用区级 Persistent Disk 卷。添加 --multi-writer 标志,以指示该磁盘在多写入者模式下必须可以在虚拟机之间共享。

    gcloud beta compute disks create DISK_NAME \
       --size DISK_SIZE \
       --type pd-ssd \
       --multi-writer
    

    替换以下内容:

    • DISK_NAME:新磁盘的名称
    • DISK_SIZE:新磁盘的大小(以 GB 为单位)。可接受的大小范围介于 1 GB 到 65536 GB 之间(对于 SSD Persistent Disk 卷),或介于 200 GB 到 65536 GB 之间(对于多写入者模式的标准 Persistent Disk 卷)。
  2. 创建磁盘后,将其挂接到 N2 机器类型的任何正在运行或已停止的虚拟机。使用 gcloud compute instances attach-disk 命令

    gcloud compute instances attach-disk INSTANCE_NAME \
       --disk DISK_NAME
    

    替换以下内容:

    • INSTANCE_NAME:要添加新的可用区级 Persistent Disk 卷的 N2 虚拟机的名称
    • DISK_NAME:要挂接到虚拟机的新磁盘的名称
  3. 重复运行 gcloud compute instances attach-disk 命令,但将 INSTANCE_NAME 替换为第二个虚拟机的名称。

创建新磁盘并将其挂接到实例后,使用共享磁盘文件系统格式化和装载磁盘。大多数文件系统无法使用共享的存储空间。在将您的文件系统与多写入者 Persistent Disk 卷搭配使用之前,请确认您的文件系统支持这些功能。您无法通过将磁盘装载到单个虚拟机的同一进程将磁盘装载到多个虚拟机。

REST

使用 Compute Engine API 在多写入者模式下创建 SS Persistent Disk 卷并将其挂接到 N2 虚拟机。

  1. 在 API 中,构建一个 POST 请求以使用 disks.insert 方法创建可用区级 Persistent Disk 卷。请添加 namesizeGbtype 属性。如需新建一个空白且未格式化的非启动磁盘,请不要为此磁盘指定来源映像或来源快照。添加 multiWriter 属性(值为 True)以指示该磁盘在多写入者模式下必须可在虚拟机之间共享。

    POST https://compute.googleapis.com/compute/beta/projects/PROJECT_ID/zones/ZONE/disks
    
    {
    "name": "DISK_NAME",
    "sizeGb": "DISK_SIZE",
    "type": "zones/ZONE/diskTypes/pd-ssd",
    "multiWriter": "True"
    }
    

    替换以下内容:

    • PROJECT_ID:您的项目 ID
    • ZONE:您的虚拟机和新磁盘所在的可用区
    • DISK_NAME:新磁盘的名称
    • DISK_SIZE:新磁盘的大小(以 GB 为单位)。可接受的大小范围介于 1 GB 到 65536 GB 之间(对于 SSD Persistent Disk 卷),或介于 200 GB 到 65536 GB 之间(对于多写入者模式的标准 Persistent Disk 卷)。
  2. 如需将磁盘挂接到实例,请构建一个对 compute.instances.attachDisk 方法的 POST 请求。添加您刚刚创建的可用区级 Persistent Disk 卷的网址:

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

    替换以下内容:

    • PROJECT_ID:您的项目 ID
    • ZONE:您的虚拟机和新磁盘所在的可用区
    • INSTANCE_NAME:要添加新的 Persistent Disk 卷的虚拟机的名称
    • DISK_NAME:新磁盘的名称
  3. 如需将磁盘挂接到第二个虚拟机,请重复运行上一步中的 instances.attachDisk 命令。将 INSTANCE_NAME 设置为第二个虚拟机的名称。

创建新磁盘并将其挂接到实例后,使用共享磁盘文件系统格式化和装载磁盘。大多数文件系统无法使用共享的存储空间。在将您的文件系统与多写入者 Persistent Disk 卷搭配使用之前,请确认您的文件系统支持这些功能。

后续步骤