在Google Compute Engine VM之间共享持久磁盘

43

来自Google文档的信息:

可以将持久性磁盘连接到多个实例。但是,如果将持久性磁盘连接到多个实例,则所有实例都必须以只读模式附加持久性磁盘。不可能将持久性磁盘以读写模式连接到多个实例。

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

所以,我需要一个共享的持久性磁盘作为我的所有计算引擎的前端,好的,如何在这个共享磁盘上写入内容?

我的想法(希望如此)是读/写持久性磁盘只能连接到1个计算引擎,但是这个相同的磁盘可以以只读方式共享给其他VM,这样对吗?

假设我有2个Compute Engine VM和2个持久性磁盘,以下流程是否可行?

  • compute1 读/写 disk1,只读 disk2
  • compute2 读/写 disk2,只读 disk1

您可能对我们最近推出的Google Cloud Filestore感兴趣 -- 它可能是您正在寻找的最接近的解决方案,因为它提供了一个NFSv3文件系统。我也已经更新了我的回答,并附上了这个链接。 - Misha Brukman
2个回答

59

更新:此功能可在2020-06-16之后使用

根据Matthew Lenz的另一个答案创建多作者持久磁盘的功能已经可用,但仍处于alpha状态(尽管它被记录为在beta轨道中),需要特殊的项目启用。

注意:此GitHub问题指出,尽管标记为beta,但该功能仍处于alpha状态。如果您想要提前访问此功能,则可以通过Cloud Console提交反馈以请求其为您的项目启用,但不能保证启用。


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

--multi-writer

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

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

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

请注意以下事项:
  • 仅支持分区 SSD 持久性磁盘
  • 无法调整磁盘大小
  • 无法创建快照

如果这些权衡对您不可接受,请参阅原始答案(下面),其中列出了多个建议的存储替代方案,可用于在多个 GCE VM 之间共享数据。


原始答案(截至2020年6月16日有效)

不,这是不可能的,因为你在撰写时引用的文档所说(已更新):

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

自那时以来,文档已重新排列;新文档位于不同的网址,但内容相同:

您可以将非根持久磁盘以只读模式附加到多个虚拟机实例中,从而使多个实例之间共享静态数据。通过从一个持久磁盘共享静态数据,比为各个实例复制数据到唯一磁盘更为便宜。
如果将持久磁盘附加到多个实例,则所有这些实例都必须以只读模式附加持久磁盘。不可能以读写模式将持久磁盘附加到多个实例。如果需要在多个实例之间共享动态存储空间,请将实例连接到Cloud Storage创建网络文件服务器
如果有一个包含要在多个实例之间共享的数据的持久磁盘,请将其从任何读写实例中分离,并以只读模式将其附加到一个或多个实例上。
这意味着您不能让一个实例具有写访问权限,而另一个实例具有只读访问权限。
如果您想在实例之间共享数据,则需要使用除持久磁盘之外的其他解决方案。以下是一些可能的解决方案:
您可以使用以下任何托管/管理服务:

或者,你可以运行自己的

  • 自管理或第三方管理的文件服务器解决方案,包括NetApp和Panzura
  • 自管理的Elastifile存储部署(完全托管,请参见上一节中的链接)
  • 数据库(无论是SQL还是NoSQL)
  • 分布式文件系统,例如CephGlusterFSOrangeFSZFS
  • 文件服务器,例如NFSSAMBA
  • 将单个VM作为数据存储节点,并使用sshfs从其他需要访问该数据的VM创建FUSE挂载

3
由于磁盘必须以只读方式挂载到所有实例上,因此一种可能的用例是将其以读写模式一次性挂载到单个实例上,然后卸载它,并以只读模式将其挂载到多个实例上。如果这对您的用例不起作用,请考虑从单个实例创建文件共享到其他实例,例如使用NFS或SAMBA(请参见更新答案的链接)。 - Misha Brukman
如何向此共享磁盘写入数据?是否有任何方法可以从任何实例外部进行写入? - Daniel Möller
1
@DanielMöller — 只有当磁盘连接到一个虚拟机时,你才能向其写入数据。因此,你可以(a)以读/写模式连接到单个虚拟机,(b)向其写入数据,(c)将其从该虚拟机中分离,(d)以只读模式将其连接到 N 个虚拟机。这对于共享只读数据非常有用;对于共享读写数据,你需要使用分布式文件系统或数据库,例如答案中列出的那些;原始磁盘不适合作为共享文件系统,因为它无法防止损坏,因为每个操作系统都期望对已挂载的磁盘具有独占的读/写访问权限。 - Misha Brukman
1
--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.'.`
- Jonathan Lin
1
根据 GitHub issue,显然这个功能实际上仍处于 alpha 和有限访问状态,尽管它被标记为 beta(可能是无意的)。您可以订阅该 GitHub issue 以跟踪更新,或者随时在 Cloud Console 中提交反馈,以查看是否可以在广泛推出之前提前获得访问权限。对此我感到抱歉!我会更新答案。 - Misha Brukman
显示剩余4条评论

7

1
此内容现已移至预览版https://cloud.google.com/compute/docs/disks/sharing-disks-between-vms 然而,共享存在一些限制,例如不能与超过2个N2实例共享等。 - mkumar118
哦,两个实例的问题真糟糕!很高兴在花费许多时间调试问题之前看到了这条评论。 - Gajus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接