在虚拟机之间共享磁盘


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

只读模式下,多个虚拟机只能从磁盘读取数据。所有虚拟机都无法写入磁盘。在多个虚拟机之间共享一个只读模式的磁盘比在多个磁盘上复制相同数据要便宜。

多写入者模式下,多个虚拟机可以读取和写入同一磁盘。这对于高可用性 (HA) 共享文件系统和数据库(如 SQL Server 故障转移集群基础架构 [FCI])非常有用。

您只能在同一可用区中的虚拟机之间共享区域性磁盘。区域性磁盘只能与位于该磁盘副本所在可用区中的虚拟机共享。

在虚拟机之间共享磁盘不会产生任何额外费用。虚拟机不必使用相同的机器类型来共享磁盘,但每个虚拟机都必须使用支持磁盘共享的机器类型。

本文档介绍了 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 吞吐量
Hyperdisk Extreme
  • 单写入者模式

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

Hyperdisk 和永久性磁盘的只读模式

本部分介绍如何在多个虚拟机之间共享一个只读模式的磁盘。

支持的只读模式磁盘类型

您可以将以下磁盘类型以只读模式挂接到多个虚拟机:

  • 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 个虚拟机
    • 在只读模式下,区域级或区域平衡永久性磁盘卷最多支持 10 个虚拟机。
    • 对于 SSD 永久性磁盘,Google 建议最多 100 个虚拟机。
    • 对于标准永久性磁盘卷,建议的最大值为 10 个虚拟机。

如何在虚拟机之间共享一个只读模式的磁盘

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

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

Hyperdisk 的多写入者模式

多写入者模式下的磁盘适用于以下用例:

  • 实现 SQL Server 故障切换集群基础架构 (FCI)
  • 多个虚拟机都写入同一磁盘的集群文件系统
  • 采用活跃-活跃或活跃-非活跃模式的高可用性系统。将同一磁盘挂接到多个虚拟机可以防止中断,因为如果一个虚拟机发生故障,其他虚拟机仍可以访问该磁盘并继续运行工作负载。

如果您的主要目标是在虚拟机之间共享文件存储空间,请考虑以下任一选项:

适用于多写入器模式的受支持 Hyperdisk 和机器类型

您可以在多写入者模式下使用平衡 Hyperdisk 和高可用性平衡 Hyperdisk(预览版)卷。您最多可以将一个多写入者模式卷挂接到 8 个虚拟机。

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

高可用性平衡 Hyperdisk 支持以下机器类型的多写入器模式:

Hyperdisk 的多写入者模式支持 NVMe 接口。如果您要将多写入者模式下的磁盘挂接到虚拟机,则虚拟机的启动磁盘也必须使用 NVMe 挂接。

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

如需从多个虚拟机访问磁盘,请使用以下任一选项:

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

多写入者模式下的 Hyperdisk 性能

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

例如,假设您将预配了 100,000 IOPS 的 Hyperdisk Balanced 卷挂接到 2 个虚拟机。每个虚拟机同时获得 50,000 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 卷以多写入者模式挂接到 8 个虚拟机。
  • 您无法在多写入者模式下克隆磁盘。
  • 您无法在多写入者模式下通过磁盘创建快照、机器映像或磁盘映像。
  • 在创建或修改虚拟机时,您无法以多写入者模式创建 Hyperdisk 卷。您必须先单独创建磁盘,然后将其挂接到虚拟机。
  • 您无法在多写入者模式下调整磁盘的大小,除非您将磁盘从所有虚拟机中分离。
  • 您可以对处于多写入者模式的磁盘进行以下更改,即使该磁盘已挂接到多个虚拟机。

    • 修改其预配 IOPS 或吞吐量
    • 将磁盘挂接到其他虚拟机

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

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

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

  • 您无法将多写入者模式下的磁盘用作虚拟机的启动磁盘。

  • 多写入者模式中的磁盘不能与单租户虚拟机搭配使用。

  • 您必须使用与虚拟机的启动磁盘相同的接口类型。

  • 您无法更改以多写入器模式连接到磁盘的虚拟机的机器类型。

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

可用区域

提供平衡 Hyperdisk 和高可用性平衡 Hyperdisk 的所有区域中都支持多写入器模式。

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

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

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

支持的预订模式

支持以下预订模式:

  1. Write Exclusive:将有一个预订持有者和一个写入者。所有其他注册者/非注册者都将仅拥有读取权限。
  2. Write Exclusive - Registrants Only:将有一个单独的预订持有人。所有注册者都将拥有对磁盘的读写权限。非注册用户仅具有读取权限。

不支持以下预订模式:

  • 写入专属 - 所有注册者
  • 独占访问
  • 专享权限 - 仅限注册用户
  • 独享权限 - 所有注册者

支持 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 卷搭配使用之前,请确认您的文件系统支持这些功能。

后续步骤