使用 EBS(弹性块存储)和 Elastic Beanstalk 在 Amazon EC2 上运行 MySQL

使用 EBS(弹性块存储)和 Elastic Beanstalk 在 Amazon EC2 上运行 MySQL

我是 Elastic Beanstalk 的新手,但我创建了一个容器环境,该容器运行 64 位 Amazon Linux,运行 PHP 5.3。我想在 EBS 上设置 MySQL,然后安装 phpMyAdmin 并导入我的数据库。

但是,我不知道该怎么做,因为文档对我来说不起作用: 使用 EBS(弹性块存储)在 Amazon EC2 上运行 MySQL

由于该指南最后更新于 2010 年 3 月 23 日,我猜它可能已经过时了。

这是我所做的:

  1. 设置 EC2 实例、附加 EBS 卷、通过 ssh 连接到实例,并使用命令“sudo su -”获取 root 访问权限(到目前为止一切顺利)。
  2. 根据指南,我现在应该运行“sudo apt-get update && sudo apt-get upgrade -y”命令,但找不到 apt-get 命令。没问题,我运行了 yum update 和 yum upgrade。
  3. 同样,“sudo apt-get install -y xfsprogs mysql-server”不起作用,所以我运行“sudo yum install -y xfsprogs mysql-server”并安装了 MySQL。
  4. 指南说要在 /dev/sdh 上创建一个 XFS 文件系统,但是我的 EBS 卷已连接到 /dev/sda1(这是使用 Elastic Beanstalk 时的默认设置,无法更改)并且其上已经有一个文件系统(我猜 Elastic Beanstalk 会自动创建一个),所以它不允许我运行“sudo mkfs.xfs /dev/sdh”命令(我将其更改为“sudo mkfs.xfs /dev/sda1”,因为那是我的卷连接的地方)。
  5. 指南中的接下来 3 个命令似乎可以执行(没有错误消息),所以现在我的 EBS 卷已挂载为 /ebsvol。但是,我注意到 /ebsvol 在 /ebsvol 中有一个根目录结构的副本。但是,/ebsvol/ebsvol 是一个空目录。此时我有点担心,但我继续。
  6. 我使用命令“/sbin/service mysqld stop”停止了 MySQL 服务器,因为指南中的命令(sudo /etc/init.d/mysql stop)不起作用。
  7. 现在我必须将现有的数据库文件移动到 EBS 卷并将 MySQL 指向 EBS 卷。这是一场灾难,因为 mysql 文件不在指南中所说的位置。现在我无法重新启动 MySQL 服务器。

帮助!

  1. 是否有更新的指南可以配置 MySQL 以在 Elastic Beanstalk 上使用 EBS 卷?在 Google、stackoverflow、serverfault 上搜索,结果只有 2008/2009 年的几份指南,因此它们尚未使用 Elastic Beanstalk 进行测试。(编辑:是否有类似 Eric Hammond 文档的东西,但适用于 CentOS/RHEL?)
  2. 如何撤消所有阻止 MySQL 启动的挂载绑定?我应该删除实例和卷并重新开始吗?
  3. 我是否在浪费时间尝试在 Elastic Beanstalk 上的 EBS 上设置 MySQL?由于缺乏可用信息,这要么是 a) 很容易做到,不需要指南(因此我是个白痴);要么是 b) 没有人在 Elastic Beanstalk 上设置 MySQL,因为这是不必要的/多余的(因此我不应该费心)。

编辑:感谢您的评论和回答。我正在尝试找出在 AWS 上设置 PHP/MySQL 网站的最佳方法,因此 Elastic Beanstalk 似乎是个好主意,因为 AWS 将其宣传为“一种更简单的方法,让您在 AWS 云中快速部署和管理应用程序。”

但是,如果你想要使用 EBS 运行 MySQL,那么这似乎并不完全正确。据我所知,我猜每个人都使用带有 Elastic Beanstalk 的 RDS,因为它可以自动扩展,并且可能具有自动快照功能。

所以我想我只剩下这些选择了:

1)不要使用 Elastic Beanstalk:按照 Eric Hammond 文档,设置一个在 EBS 卷上运行 MySQL 的 Ubuntu EC2 实例(听起来好像会有一些可扩展性问题?)。

2)使用 Elastic Beanstalk:在 RDS 上设置我的数据库(没有可扩展性问题)。

3)使用 Elastic Beanstalk:但使用在 EBS 卷上运行 MySQL 的 ubuntu AMI(这可能吗?Elastic Beanstalk 可以与私有 AMI 一起使用吗?)

4) 使用 Elastic Beanstalk:重新开始并使用 cyberx86 的说明调整 ubuntu 说明以在 CentOS/RHL 上运行。

此时我的数据库和网站流量都很小。如果能使其可扩展就好了,但此时我只想让它以一种方式运行,这样我就可以在本地主机上运行代码后使用 git 部署新版本。当务之急是让网站启动并运行,然后重新进行营销和构建功能,而不是花时间托管。我该怎么办?

答案1

我不使用 Elastic Beanstalk - 但您遵循的指南适用于 EC2(我绝对可以提供帮助)。您遇到的第一个困难是,您使用的指南适用于 Ubuntu 9.10;亚马逊的 Linux 基于 CentOS/RHEL - 因此,如果您能找到 CentOS 6 指南,您会更轻松。

您的问题的根源似乎源于“附加 EBS 卷”。在 EC2 上,您可以将多个 EBS 卷附加到单个实例。所有实例都有一个根卷 - 这些可以是 S3 支持的,也可以是 EBS 支持的。到目前为止,首选方法是使用 EBS 支持的根卷(成本稍高,但在灵活性和耐用性方面弥补了这一点)。具有 EBS 根卷的实例几乎总是将此卷附加为 /dev/sda1 - 在现代 Linux 系统上,该设备实际上显示为 /dev/xvda1(后者应该传递给任何命令)。(除了尝试格式化已安装的卷之外 - 您试图在实例运行时格式化根文件系统 - 即您试图擦除操作系统,这绝对不是一个好主意,即使可能的话)。

在这种情况下,建议添加第二个 EBS 卷 - 将其附加到您的实例(例如作为 /dev/sdh,但使用 /dev/xvdh 作为命令),并使用它来存储您的 MySQL 数据。 (尽管没有使用 Elastic Beanstalk)我很难相信 Elastic Beanstalk 不允许您附加第二个卷 - 因为此功能对于 EC2 来说相当重要。

您应该能够通过运行cat /proc/partitions(或使用fdisk -l)获取 EBS 设备的列表。

您会注意到,在您完成的第 5 步中,您实际上是在将根卷安装在其自身内(即 /dev/sda1 已安装为 / 并且您正在将 /dev/sda1 安装为 /ebsvol) - 最好避免这样做。

此外,虽然/etc/init.d/mysql stop没有起作用,但/etc/init.d/mysqld stop可能还是会起作用的。(同样,您可以通过运行获取 init.d 脚本的列表ls /etc/init.d- 并且应该能够使用这些路径,就像您一样,我通常使用该service命令)。

MySQL 数据库应该位于 /var/lib/mysql 中 - 但是,/etc/fstab 中的挂载点可能不正确(考虑到 /ebsvol 中的 ebsvol 问题)。您应该cd /var/lib/mysql能够看到您的数据库 - 如果看不到,则说明您的挂载没有正常工作。(验证 /var/lib/mysql 是否安装在不同的设备上,并将mountpoint -d /var/lib/mysql该设备与 进行比较cat /proc/partitions)。

您所遵循的指南的基本思想非常有效 - 将数据和数据库放在与根卷不同的 EBS 卷上是一种常见做法,因为它提供了许多优点(性能、易于快照、更容易在实例之间移动等),并且基本的 Linux 命令没有改变 - 它们仅适用于 Ubuntu。

使用 来撤消挂载umount /path- 就像您通常所做的那样,当然,您需要确保设备不忙(如果您尚未启动 MySQL,这可能不是问题)。但是 umount 只是暂时的 - 因此您还必须/etc/fstab从那里编辑和删除对挂载点的任何引用。如果实例上没有任何有价值的东西,您最好重新开始(不是因为卸载几个卷很困难,而是因为从已知状态开始时总是更容易找出问题所在)。

最后,关于 Elastic Beanstalk 上的 MySQL:Elastic Beanstalk 的要点应该是它处理资源的配置和自动扩展 - 它仍然基于核心 AWS 组件(例如 EC2、S3、ELB 等),但它会为您做一些事情。Elastic Beanstalk 通常使用 RDS 来处理 MySQL 数据库。RDS 是 Amazon 托管的 MySQL 版本,可简化 MySQL 实例的配置和扩展。请记住,如果没有大量设置,MySQL 不适合自动扩展。您不能只启动第二个 MySQL 实例并让负载在两个实例之间分配 - 您需要设置复制,这可能不是一项简单的任务。

本质上,如果您能够以这样一种方式设置 MySQL,使其从您的 Web 服务器实例运行并可以无缝自动扩展,那么您几乎肯定会更好地直接使用 EC2,而不必担心 Elastic Beanstalk。因此,我建议大多数人实际上不要在 Elastic Beanstalk 上设置 MySQL(您可以做的是设置一个单独的 MySQL 实例,但如果您使用 Beanstalk,RDS 可能是一种更简单的方法)。


编辑:

与许多其他主要以黑盒形式运行的服务不同,Elastic Beanstalk 确实允许您访问底层组件。也就是说,如果您要费力手动设置 EC2 实例,那么您就否定了 Elastic Beanstalk 的意义。

如果您使用 EC2,则可以使用 PHP/MySQL 的几种方法:

  1. 您可以在单个实例上托管 Web 服务器和数据库 - 当您刚开始时,这可能是一种合理的方法,但是,它不能很好地水平扩展(但您仍然可以垂直扩展 - 使用更大的实例)。希望到您超出超大型实例的容量时,您将能够设置更复杂的设置。也就是说,这对冗余不利 - 一切都在单个实例上,任何组件的故障都会破坏您的整个设置。
  2. 您可以在一个实例上托管您的 Web 服务器,并使用 RDS 作为您的数据库。大多数设计良好的应用程序对 Web 服务器的负担都会超过对数据库的负担(并且数据库负载理想情况下会偏向读取)。在这种情况下,您可以相对轻松地扩展您的 Web 服务器实例(例如,将它们放在 ELB 后面 - 只需稍加努力即可确保所有实例都提供相同的内容)。RDS 是由 AWS 管理的 MySQL - 它不是完全自动化的,但它在自动扩展方面确实大有帮助。本质上,RDS 将提供多个只读从属服务器和一个写入主服务器,以及多个可以在您需要时接管的热备份。缺点是您需要为所有正在运行的实例付费(并且您无法完全控制 MySQL 的一些复杂设置)。
  3. 最后一种方法是使用您的 Web 服务器集群和您自己的 MySQL 集群。本质上,您可以扩展您的 Web 实例(如上所述),然后您将设置将单独扩展的 MySQL 实例。您需要研究 MySQL 复制(或者如果您可以使您的应用程序适应其数据结构,也许可以使用 MySQL 集群)。

关于同一主题的其他一些答案:

我的观点通常是,一键式解决方案并不是最好的方法——我喜欢手动操作所带来的控制。我发现,我不仅通常能得到更定制、更高效的最终结果,而且对系统的工作原理有了更好的理解,这使得找出问题变得容易得多。一旦你很好地理解了它们的复杂性,你就可以随时自动化自己的设置。

关于 RDS 需要记住的一点是 - 它已经由 EBS 支持。RDS 就是 MySQL - 它不是类似的东西,也不是另一个关系数据库。它是在 EBS 支持的 EC2 实例上运行的 MySQL 托管实例。AWS 将使软件保持最新状态,您可以对数据进行正常的 EBS 快照等。您只是无法直接访问实例上运行的底层软件。

至于操作系统的选择,我偏爱亚马逊的 Linux。它得到了 AWS 的良好支持,并且占用的资源最少 - 它与 CentOS 完全兼容(事实上,它在最新版本中默认包含 EPEL 存储库)。通常的观点是使用您熟悉的任何 Linux 发行版,因为差异通常很小(对于您正在使用的说明,CentOS 的工作效果与 Ubuntu 一样好 - 大多数命令(apt-get 除外)在 CentOS 上都是相同的。鉴于我自己的设置使用亚马逊的 Linux 将数据库放在单独的 EBS 卷上,我可以向您保证这并不难)。

我建议主要考虑以下几点:

  • 熟悉/愿意学习 Linux 系统 - 如果您不介意设置自己的服务器并希望更好地了解它们,我绝对会选择 EC2 路线。如果您做得正确,最终结果会更好,并且从长远来看会更具多功能性。不过我要说的是,如果您采用这种方法,您需要真正了解您正在运行的命令的作用 - 如果您真的想坚持下去,仅仅遵循指南是不够的。
  • 预算 - 请记住,AWS 的一切都是有代价的。AWS 为您做的越多,他们向您收取的费用就越高。RDS 实例的成本比同等的 EC2 实例高出约 30%(并且没有微型实例),如果您想要他们提供的冗余,您需要运行多个 RDS 实例(并为每个实例付费)。Elastic Beanstalk 将为您配置实例、负载均衡器、RDS 实例等 - 成本很快就会增加。
  • 时间——如果您没有时间,想要按几个按钮并实现一些功能,Elastic Beanstalk 可能是最适合您的方法。

我建议不要将 Elastic Beanstalk 与内置于 AMI 中的 MySQL 一起使用 - 如果它能正常工作,它可能会非常不稳定。(只需考虑当它向您的集群添加和删除一个实例时,或者当数据进入一个实例而不是另一个实例时会发生什么......)

牢记可扩展性是件好事 - 但不要过早优化,否则您将一事无成。一定要牢记这一点,但如果目前使特定组件可扩展的成本(时间、金钱等)不切实际,请不要太担心 - 到需要扩展时,您就会明白(毕竟大多数热门网站都是这样开始的)。

我建议,如果您的应用程序设计能够利用一些缓存,那么它将大有裨益。

通常,在 EC2 上,垂直扩展(扩展到更大的实例)比水平扩展(扩展到更多实例)更好。但是,首先,您需要扩展到两个实例,以便具有一定的冗余度并最大限度地减少单点故障。因此,一种可能的方法可能是:

  1. 从一个微实例开始 - 在它上面同时拥有数据库和应用程序(你不能获得比这更小的实例,这使它成为一个很好的起点)。
    • 当然,垂直扩展相当容易,只需不断升级实例,直到使用超大型实例即可。问题归结为冗余 - 如果您的实例出现任何问题,您的应用程序就会脱机。
  2. 现在,您通常希望将数据库分离到另一个实例(因为 a)数据库的负载与应用程序的负载不同,并且 b)您不能以与 Web 服务器完全相同的方式自动扩展 MySQL),但是微型实例不能很好地处理负载,所以我建议先升级到更大的实例,至少是一个小型实例,然后是一个中型实例(基本上,这个想法是,一旦您需要更大的实例类型,效果可能会更大)
  3. 将数据库与 Web 服务器分开。这样,您就可以满足数据库(例如高内存)与 Web 服务器(例如更高的 CPU)的不同需求,以及扩展两者之间的差异(推荐阅读)。此时,您可能决定使用 RDS,而不是运行自己的 MySQL 实例。
  4. 现在您的应用程序已在专用实例上运行,您可以对其进行扩展,而不必担心数据库 - 设置自动扩展,以便获得一些冗余。当任何应用程序节点发生故障或负载超过您指定的阈值时,这将自动添加更多应用程序节点。
  5. 添加第二个数据库节点并配置节点之间的复制(如果您选择使用 MySQL 集群或 NoSQL 解决方案,您也应该能够设置自动扩展)。此时一切都应该具有冗余,即使节点发生故障,您仍然应该在线。
  6. 根据需求,一次将一个实例升级到更大的实例大小。

答案2

现在我对 Elastic Beanstalk 和 EC2 有了更多的了解,我决定放弃使用 Elastic Beanstalk,因为尽管它有一些很酷的功能,但对我来说太过死板。例如,我不喜欢无法更改 httpd.conf 文件这一事实(好吧,你可以更改它,但当你的环境重新启动时,这些更改就会消失)。另一个原因是,运行 Elastic Beanstalk 和 MySQL(正确运行,即自动扩展和自动备份)的唯一方法是使用 RDS。尽管你可以通过新注册获得 3 个月的免费 RDS,但我的规模还没有达到需要其功能的程度,所以对我来说,每月支付约 76 美元购买 RDS 是不值得的。

底线:如果您的流量适中,并且需要一个可扩展且可自行管理的解决方案,那么 Elastic Beanstalk 和 RDS 是一个不错的选择。我喜欢您可以使用 git 进行部署。它就像 PHP 版的 Heroku。入门指南应该包括设置 MySQL 的说明。

我的做法:我选择使用“合成 Elastic Beanstalk”:我可以使用 AWS 的各种产品重新创建其功能,并可以灵活地按照我想要的方式进行配置。在试用 AWS 时,我在与我的 webapp 相同的 EC2 实例上设置了 MySQL(当您需要扩展时,这不是理想的选择,但在您学习使用 AWS 时,这完全没问题)。

本指南是我用来在运行 Amazon Linux AMI 的 EC2 实例上设置 LAMP 堆栈的工具。我发现使用 phpmyadmin 导入数据库更容易。因为我使用的是微型实例,所以它默认使用 EBS,您可以拍摄快照来备份数据。我建议为 EC2 设置 CLI 工具并运行

ec2-modify-instance-attribute --block-device-mapping "/dev/sda1=:false" i-xxxxxxx

其中 i-xxxxxxxx 是 EBS 卷所附加到的 EC2 实例。这可以防止在实例终止时删除 EBS 卷。由于该 EBS 卷是所有运行的源头,也是我的数据库的存储地,所以我不想丢失它(当我正在使用 Elastic Beanstalk 时,我的 EC2 实例被终止,Elastic Beanstalk 立即启动了另一个实例,并附加了新的 EBS 卷,但幸运的是,我已将原始 EBS 卷的 DeleteOnTermination 设置更改为“false”,因此我能够停止新实例,分离新的 EBS 卷,并附加旧的 EBS 卷,从而保留我的 MySQL 安装和数据库)。

总体而言,将 Web 应用程序迁移到 AWS 的整个过程仍然相当麻烦。现在我已经完成了学习过程,感觉更适应了,但我忍不住想应该有更好的入门文档。

相关内容