在 Google Compute Engine 虚拟机之间共享永久性磁盘

Posted

技术标签:

【中文标题】在 Google Compute Engine 虚拟机之间共享永久性磁盘【英文标题】:Share a persistent disk between Google Compute Engine VMs 【发布时间】:2015-01-10 17:18:24 【问题描述】:

来自 Google 的文档:

可以将永久磁盘附加到多个实例。但是,如果您将永久磁盘附加到多个实例,则所有实例都必须以只读模式附加永久磁盘。无法以读写模式将永久磁盘附加到多个实例。

如果您以读写模式附加永久性磁盘,然后尝试将该磁盘附加到后续实例,Google Compute Engine 会返回错误。

所以,我需要一个共享持久磁盘作为我所有计算引擎的前端,很好,你怎么能在这个共享磁盘上写?

我的猜测(我希望)是只能使用 1 个计算引擎附加读/写持久磁盘,但是同一个磁盘可以以只读方式共享给其他人 虚拟机,对吗?

假设我有 2 个 Compute Engine 虚拟机和 2 个永久性磁盘, 这个流程可以吗?

compute1 读/写 disk1 和只读 disk2 compute2 读/写 disk2 和只读 disk1

【问题讨论】:

您可能对我们最近推出的Google Cloud Filestore 感兴趣——它可能最接近您的需求,因为它提供了 NFSv3 文件系统。我也用这个链接更新了我的答案。 【参考方案1】: 推荐的答案 Google Cloud

更新:自 2020-06-16 起可用

根据 Matthew Lenz 的 another answer,creating multi-writer persistent disks 的功能可用,但仍处于 alpha 状态(尽管它被记录为处于 beta 轨道)并且需要针对每个项目进行特殊启用。

注意:This GitHub issue 指出该功能仍处于 alpha 阶段,尽管它被标记为 beta。如果您想提前使用此功能,可以通过 Cloud Console 提交反馈,为您的项目请求反馈,但不保证会启用。


假设您的项目有权使用此功能(或该功能变为公共访问),请注意它带有一些警告:

--multi-writer

在多写入器模式下创建磁盘,以便它可以附加到多个 VM 的读写访问权限。只能与地区 SSD 永久性磁盘一起使用。多写入器模式下的磁盘不支持调整大小和快照操作。

您可以通过以下方式使用它:

$ gcloud beta compute disks create DISK_NAME --multi-writer [...]

注意注意事项:

仅限地区 SSD 永久性磁盘 没有调整磁盘大小 没有快照

如果您无法接受这些权衡,请参阅原始答案(如下),其中有一长串推荐的存储替代方案,用于在多个 GCE 虚拟机之间共享数据。


原答案(2020-06-16之前有效)

不,这是不可能的,正如documentation that you cited 在撰写本文时所说(自更新以来):

但是,如果您将永久磁盘附加到多个实例,则所有实例都必须以只读模式附加永久磁盘。

从那时起,文档已重新排列;新文档位于different URL,但内容相同:

您可以在只读模式下将非根永久磁盘附加到多个虚拟机实例,这样您就可以在多个实例之间共享静态数据。从一个永久性磁盘在多个实例之间共享静态数据比将数据复制到单个实例的唯一磁盘更便宜。

如果您将永久性磁盘附加到多个实例,则所有这些实例都必须以只读模式附加永久性磁盘。无法以读写模式将永久磁盘附加到多个实例。如果您需要在多个实例之间共享动态存储空间,请将您的实例连接到Cloud Storage 或create a network file server。

如果您有一个包含要在多个实例之间共享的数据的永久性磁盘,请将其与任何读写实例分离,并以只读模式将其附加到一个或多个实例。

这意味着您不能让一个实例具有写访问权限,而另一个实例具有只读访问权限。

如果你想在它们之间共享数据,你需要使用 Persistent Disk 以外的东西。以下是一些可能的解决方案。

您可以使用以下任何托管/托管服务

Google Cloud Filestore — 可能最接近您正在寻找的内容,因为它提供了 NFSv3 文件系统 您也可以将Elastifile on GCP 用作fully-managed service;请注意GCP acquired Elastifile in July 2019 Google Cloud Datastore Google Cloud Storage,您可以通过 GCS API(JSON 或 XML)使用它,也可以使用 gcsfuse 作为块设备安装它 Google Cloud Bigtable Google Cloud SQL

或者,您可以运行自己的

自行管理或第三方管理的 file servers 解决方案,包括 NetApp 和 Panzura 自我管理Elastifile storage deployment(对于完全管理,请参阅上一节的链接) 数据库(无论是 SQL 还是 NoSQL) 分布式文件系统,如Ceph、GlusterFS、OrangeFS、ZFS等 文件服务器,例如NFS 或SAMBA 将单个 VM 作为数据存储节点,并使用 sshfs 从要访问该数据的其他 VM 创建 FUSE 挂载

【讨论】:

感谢 Misha,这对我来说似乎很令人惊讶,所以如果我想与我的所有照片共享一个简单的磁盘,我不能这样吗?我不想使用云存储,我的项目需要大量照片存储 @flaubert 因为磁盘必须以只读方式挂载到所有实例,一个可能的用例是以读写模式将其挂载到单个实例,分离它,然后将其挂载到几个实例处于只读模式。如果这不适用于您的用例,请考虑创建从单个实例到其他实例的文件共享,例如,使用 NFS 或 SAMBA(请参阅更新的链接答案)。 @DanielMöller — 如果磁盘仅连接到一个虚拟机,您只能写入磁盘。因此,您可以 (a) 以读/写模式附加到单个 VM,(b) 向其写入数据,(c) 将其与该 VM 分离,(d) 以只读模式将其附加到 N 个 VM。这有利于共享只读数据;对于共享读写数据,您需要使用分布式文件系统或数据库,例如答案中列出的那些;原始磁盘不能成为良好的共享文件系统,因为它无法防止损坏,因为每个操作系统都希望对已安装的磁盘进行独占的读/写访问。 --multi-writer 听起来很有希望,但出现错误ERROR: (gcloud.beta.compute.disks.create) Could not fetch resource: - Invalid resource usage: 'Multi Writer Disk feature is not available for this project.'. @JonathanLin — 根据GitHub issue,显然这个功能实际上仍处于 alpha 和受限访问状态,尽管它被标记为 beta(可能是无意的)。您可以订阅该 GitHub 问题以关注更新,和/或随时在 Cloud Console 中提交反馈,看看您是否可以在它广泛可用之前尽早访问它。对于那个很抱歉!我会更新答案。【参考方案2】:

GCP 具有“多次写入”永久性磁盘的 Alpha 版功能。它已经处于 alpha 状态很长一段时间了,所以谁知道它是否会很快进入 beta 或 ga。这是文档的链接。 https://cloud.google.com/sdk/gcloud/reference/beta/compute/disks/create#--multi-writer 编辑:2020-06-16。这已升级为测试版。

【讨论】:

现在已移至预览版cloud.google.com/compute/docs/disks/sharing-disks-between-vms 但是,共享存在一些限制,例如不能与超过 2 个 N2 实例等共享。 哦,关于 2 个实例真是太糟糕了!很高兴我在花费大量时间调试问题之前看到了这条评论。

以上是关于在 Google Compute Engine 虚拟机之间共享永久性磁盘的主要内容,如果未能解决你的问题,请参考以下文章

ImportError:没有名为 google_compute_engine 的模块

ruby Google Compute Engine快照在Ruby中创建和旋转

Google Cloud 中的 Google Compute Engine、App Engine 和 Container Engine 有啥区别?

Google App Engine 通过内部网络与 Compute Engine 通信

如何在 Google Compute Engine 上运行 Docker?

Google Compute Engine 上的 FreeBSD