使用 EBS(Elastic Block Store)和 Elastic Beanstalk 在 Amazon EC2 上运行 MySQL

edp*_*lis 6 mysql amazon-ec2 amazon-ebs amazon-web-services

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

但是,我不知道如何执行此操作,因为文档对我不起作用: 使用 EBS (Elastic Block Store) 在 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 卷?从 2008/2009 年开始搜索 Google、stackoverflow、serverfault 会得到一些指南,因此它们尚未使用 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,这似乎并不完全正确。从我收集的信息来看,我猜每个人都将 RDS 与 Elastic Beanstalk 一起使用,因为它可以自动扩展并且大概具有自动快照功能。

所以我想我还有这些选择:

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

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

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

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

在这一点上,我的数据库和站点流量非常小。让它可扩展会很好,但在这一点上,我只想让它以一种方式运行,让我在我的代码在本地主机上工作后使用 git 部署新版本。首要任务是让网站启动并运行,然后重新开始营销和构建功能,而不是花时间在托管上。我该怎么办?

cyb*_*x86 2

我不使用 Elastic Beanstalk - 但您遵循的指南适用于 EC2(我绝对可以提供帮助)。您遇到的第一个困难是您使用的指南适用于 Ubuntu 9.10;Amazon 的 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 是 MySQL 的 Amazon 托管版本,可简化 MySQL 实例的配置和扩展。请记住,如果没有大量设置,MySQL 不太适合自动缩放。您不能只启动第二个 MySQL 实例并在两个实例之间分配负载 - 您需要设置复制,这可能不是一个简单的任务)。

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


编辑:

与大多数以黑匣子方式运行的许多其他服务不同,Elastic Beanstalk 确实允许您访问底层组件。也就是说,如果您打算手动设置 EC2 实例,那么您就否定了 Elastic Beanstalk 的意义。

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

  1. 您可以在单个实例上托管网络服务器和数据库 - 当您开始时,这可能是一种合理的方法,但是,它不能很好地水平扩展(但您仍然可以垂直扩展 - 使用更大的实例)。希望当您超过超大型实例的容量时,您将能够设置更复杂的设置。也就是说,这对冗余来说是不利的 - 一切都在单个实例上,任何组件的故障都会导致整个设置崩溃。
  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 上是相同的鉴于我自己的设置使用 Amazon 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. 根据需要,一次将一个实例升级到更大的实例大小。


归档时间:

查看次数:

5494 次

最近记录:

13 年,4 月 前