您可以将 Amazon EBS 附加到多个实例吗?

Posted

技术标签:

【中文标题】您可以将 Amazon EBS 附加到多个实例吗?【英文标题】:Can you attach Amazon EBS to multiple instances? 【发布时间】:2010-10-24 21:12:12 【问题描述】:

我们目前使用多个网络服务器访问一个 mysql 服务器和文件服务器。考虑迁移到云端,我是否可以使用相同的设置并将 EBS 附加到多个机器实例,或者其他解决方案是什么?

【问题讨论】:

给出的答案是否定的。但引用的原因困扰着我。每个人都说“这就像将同一个硬盘驱动器安装到多台计算机上”——而我说“那又怎样?”使用 SCSI 或 FibreChannel SAN,我们一直都在这样做,这是完全合理的。例如。用于在同一只读数据上只读装载多个服务器。 Oracle 和其他大型 RDBM 设计为在集群模式下运行,其中多台服务器使用相同的物理存储。它可以更快。 EBS/NFS 非常慢,不是一个选择。但请注意,即使您可以连接到多个 EC2,您的 IOPS 仍然会受到限制。 自 2020 年 2 月起,您可以将某些类型的 EBS 附加到多个 EC2 实例 - aws.amazon.com/blogs/aws/… 【参考方案1】:

更新 (2020) 现在可以了!

现在可以在同一可用区内的 AWS Nitro 中运行最新的实例类型。有一些注意事项,但这对于某些需要 EBS 速度以及 EFS 不可行的用例非常有用。

https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ebs-volumes-multi.html


原帖 (2009)

不,这就像在两台计算机中使用硬盘一样。

如果您想要共享数据,您可以设置一个所有实例都可以访问的服务器。如果您希望为所有实例提供一个简单的存储区域,您可以使用 Amazon 的 S3 存储服务来存储分布式和可扩展的数据。

迁移到云端,您可以拥有完全相同的设置,但您可以将文件服务器替换为 S3,或者让您的所有实例都连接到您的文件服务器。

您有很多选择,但在实例之间共享硬盘可能不是最佳选择。

【讨论】:

【参考方案2】:

EBS 刚刚宣布这是可能的:https://aws.amazon.com/about-aws/whats-new/2020/02/ebs-multi-attach-available-provisioned-iops-ssd-volumes/

【讨论】:

【参考方案3】:

虽然 EBS 以前只允许将单个 EC2 实例附加到给定卷,但现在可以进行多重附加,至少对于 io1 卷是这样。如需更多信息,请参阅this AWS blog post。

【讨论】:

【参考方案4】:

简短的回答是明确的“不”。其他人在上面已经说过了。

那些说“是”的人没有回答这个问题,而是一个不同的问题。如果 EFS 只是一个 NFS 服务,那么它不是最初所说的问题的答案。 EFS 是否“在所有区域推出”都没有关系,因为您可以完全创建自己的 NFS 实例,并让多台服务器挂载 NFS。这并不是什么新鲜事,我们在 1992 年就已经这样做了。 SMB 和 sshfs,所有这些都只是将驱动器挂载为远程文件系统的方法。

那些说“你为什么要这样做”或“一切都会以眼泪收场”的人是错误的。几十年来,我们一直在将多个磁盘安装到多个服务器。如果您曾经使用过 SAN(存储区域网络),那么通常通过 FibreChannel SAN 将同一设备连接到多个节点的能力是完全正常的。因此,任何在十年前在虚拟化/云服务器普及之前运行过服务器的人都会对此有所了解。

很快出现了集群文件系统,其中两个系统可以读取和写入完全相同的卷。我相信这已经从历史上的 VAX 和 Alpha VMS 时代开始了。集群文件系统使用分布式互斥方案能够直接操作块。

将同一个磁盘挂载到多个节点的优势在于速度和减少单点故障。

现在,集群文件系统并没有在“消费者”托管业务中大受欢迎,这是事实。而且它们很复杂并且有一些陷阱。但是您甚至不需要集群文件系统来使用连接到多个计算节点的磁盘。如果你想要一个只读驱动器怎么办?您甚至不需要集群文件系统!您只需将与只读 (ro) 相同的物理设备放入您的 /etc/fstab 中。然后您安装到 2 或 10 个 EC2 服务器,所有这些服务器都可以直接从该设备读取!

在构建快速扩展的农场时,云服务器领域有一个明显的用例。您可以准备好您的主系统磁盘,并为每台服务器使用一个非常小的启动和配置磁盘。你甚至可以让它们全部从同一个启动盘启动,在读写模式下重新挂载 / 之前,你可以插入一个 3 层的 Union-FS:

    主只读系统磁盘,带有引导、内核和用户空间 安装 一个配置文件系统,只有几个文件 (主要在 /etc 中)特定于单个服务器。这 磁盘可以被另一台服务器写出以准备启动 新实例。这里的示例文件将是 /etc/hostname 并且只是 每个节点需要保持不同的配置文件非常少。 您可能根本不需要的可写磁盘可能只是 /tmp 作为内存文件系统。

所以,是的,这个问题很有意义,不幸的是,答案(仍然)是“否”。并且没有 NFS 并不能很好地替代该用例,因为它会惩罚系统磁盘中的所有读取活动。但是,从 NFS 系统磁盘进行网络引导是实现上述用例的唯一替代方法。不幸的是,由于设置网络启动代理和 NFS 比访问同一个物理块设备要复杂得多。

PS:我本来想提交一个较短的版本作为 cmets,但我不能因为愚蠢的 51 学分门槛,所以我必须用同样的基本“否”写一个答案,但要包括我的观点为什么这是一个没有得到应有答案的相关问题。

PPS:我刚刚在 StackExchange 上发现有人提到 iSCSI。 iSCSI 有点像 NFS,但在逻辑上像 FibreChannel SAN。您可以访问(和共享)物理块设备。这将使启动磁盘共享更容易,因此您无需设置可能很挑剔的 bootd 网络启动。但是在 AWS 上,也没有可用的网络启动。

【讨论】:

【参考方案5】:

更新(2015 年 4 月):对于这个用例,您应该开始查看新的 Amazon Elastic File System (EFS),它旨在以您想要的方式进行多重附加。 EFS 和 EBS 之间的主要区别在于它们提供了不同的抽象:EFS 公开 NFSv4 协议,而 EBS 提供原始块 IO 访问。

您将在下面找到我关于为什么无法在多台机器上安全地挂载原始块设备的原始解释。


原帖(2011 年):

即使您能够将 EBS 卷附加到多个实例,它也将是一个_REALLY_BAD_IDEA_。引用 Kekoa 的话,“这就像同时在两台计算机上使用硬盘一样”

为什么这是个坏主意? ... 不能将卷附加到多个实例的原因是 EBS 提供了一种“块存储”抽象,客户在该抽象上运行 ext2/ext3/等文件系统。大多数这些文件系统(例如,ext2/3、FAT、NTFS 等)都是在假设它们对块设备具有独占访问权的情况下编写的。访问同一个文件系统的两个实例几乎肯定会以撕裂和数据损坏而告终。

换句话说,只有在您运行旨在在多台机器之间共享块设备的集群文件系统时,双重挂载 EBS 卷才有效。此外,即使这样也不够。 EBS 需要针对这种情况进行测试,并确保它提供与其他共享块设备解决方案相同的一致性保证......即,块不会缓存在中间非共享级别,如 Dom0 内核、Xen 层、和 DomU 内核。然后是在多个客户端之间同步块的性能考虑 - 大多数集群文件系统设计用于高速专用 SAN,而不是尽力而为的商品以太网。听起来很简单,但你要求的却是一件很不平凡的事情。

或者,查看您的数据共享方案是否可以是 NFS、SMB/CIFS、SimpleDB 或 S3。这些解决方案都使用旨在共享文件而无需共享块设备子系统的更高层协议。很多时候,这样的解决方案实际上更有效。

在您的情况下,您仍然可以拥有一个由多个 Web 前端访问的 MySql 实例/文件服务器。然后,该文件服务器可以将其数据存储在 EBS 卷上,允许您进行夜间快照备份。如果运行文件服务器的实例丢失,您可以分离 EBS 卷并将其重新附加到新的文件服务器实例,并在几分钟内备份并运行。

“有没有像 S3 这样的文件系统?” - 有也没有。是的,有像s3fs 这样的第 3 方解决方案可以“正常”工作,但在幕后,他们仍然必须为每次读/写进行相对昂贵的 Web 服务调用。对于共享工具目录,效果很好。对于您在 HPC 世界中看到的那种集群 FS 使用,这不是一个机会。为了做得更好,您需要一个提供二进制面向连接协议的新服务,例如 NFS。提供这样一个具有合理性能和行为的多挂载文件系统将是 EC2 的一个很棒的功能插件。长期以来,我一直倡导亚马逊构建类似的东西。

【讨论】:

NFS(和类似的 SMB 方法)的问题是一台机器将充当服务器(文件系统将物理安装到该服务器)。那台机器宕机将导致 EBS 卷(或磁盘也宕机)。有没有像 S3 这样的文件系统? 只是为了澄清 - 如果 EBS 卷附加到实例并且实例发生灾难性死亡,则 EBS 卷会很好。它只会“关闭”,因为要访问它,您需要将它从关闭的实例中分离出来并将其重新附加到一个新实例。 "...几乎肯定会以眼泪和数据损坏告终。"经典的。 @DaveDopson 对于看到此答案的其他任何人都知道亚马逊刚刚发布了EFS,它允许共享自动扩展驱动器,可以通过 NFS 安装在多个实例上。 @JoshStrange - 感谢您的提醒。更新帖子。【参考方案6】:

您完全可以在 AWS 的多台服务器上使用一个驱动器。 我使用 sshfs 挂载一个外部驱动器并与 EC2 中的多个服务器共享它。

我需要将单个驱动器连接到多个服务器的原因是在将所有备份拉到本地之前,有一个地方可以放置所有备份。

【讨论】:

【参考方案7】:

多个 Web 服务器访问 MySQL 服务器和文件服务器在 AWS 中是正常的。上述架构应遵循的一些最佳实践是:

要点 1) EC2 上的 MySQL 可以在 AWS 中以异步/半同步模式设置为主从。 RAID 0 中的 EBS-OPT+PIOPS 推荐用于高性能数据库

第 2 点)或者,您可以使用 Amazon RDS + 多可用区模式。对于读取扩展,可以将多个 RDS 只读副本附加到 MySQL RDS。

第 3 点)EBS 卷不能同时附加到多个 EC2。您可以使用 EBS 在 Amazon EC2 上创建基于 GlusterFS 的文件服务器。多个 Web 服务器可以在 AWS 基础设施上同时与单个 GlusterFS 通信。

第 4 点)如果您的应用程序可以与 S3 作为文件存储集成,那么它是首选,因为它为架构带来了稳定性。您还可以使用 S3fuse 等工具从您的应用程序访问 S3。

【讨论】:

添加到上面。如果提供的文件是静态的,则 S3 可以工作。如果提供的文件发生更改或需要 RW,您可以尝试按照另一个建议使用 EFS。您可能还需要考虑在网络服务器前面使用负载平衡器。要利用 AWS,请考虑为使用 RDS 实例的弹性负载均衡器后面的 Web 服务器创建一个自动扩展组。【参考方案8】:

为什么不创建一个具有卷的实例,并在其他实例中通过 sshfs 连接到该卷?

【讨论】:

【参考方案9】:

在 IT 世界中有一些东西被称为集群文件系统、Redhat GFS、Oracle OCFS2、Veritas CFS...

【讨论】:

查看对 ddopson 答案的评论 @sheki 我认为您对 ddopson 答案的评论与集群文件系统完全无关。集群文件系统被设计为由多个服务器同时挂载。 clusteredfs 的重点是避免单点故障。【参考方案10】:

不,根据 EBS 文档:“一个卷一次只能附加到一个实例”。

您目前如何使用共享存储空间?如果只是为了从文件服务器提供文件,您是否考虑过设置一个系统,以便您可以将某些请求代理到文件服务器上的进程,而不是让网络服务器为这些文件提供服务?

【讨论】:

这是该引用的链接:aws.amazon.com/articles/1667。请参阅文章底部的常见问题解答。让我想知道为什么 aws ec2 describe-volumes 返回一个 array 附件。【参考方案11】:

我很确定您不能,但您可以克隆 EBS 并将其附加到另一个实例。

这对于固定数据集或测试“真实”数据很有用,但不允许超过 1 个实例在单个块存储上运行

【讨论】:

以上是关于您可以将 Amazon EBS 附加到多个实例吗?的主要内容,如果未能解决你的问题,请参考以下文章

Amazon EMR:将 EBS 卷附加到实例时如何确保使用该卷

将多个 ebs 卷附加到每个 ec2 实例

在 Amazon EBS 设备之间同步

Amazon EC2 - 使用实例存储根设备转换 EBS 根设备

Amazon EC2 密钥对

在启动 Amazon EC2 Linux 实例时自动挂载 EBS 卷