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

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

但是,我不知道该怎么做,因为文档不适合我: 在Amazon EC2上使用EBS(Elastic Block Store)运行MySQL,

由于该指南最后更新于2010年3月23日,我想这可能是过时的。

以下是我所做的:

  1. 设置EC2实例,连接EBS卷,通过ssh连接到实例,并通过命令“sudo su – ”获得root权限(迄今为止)。
  2. 根据指南,我现在应该运行“sudo apt-get update && sudo apt-get upgrade -y”命令,但是找不到apt-get命令。 没问题,我跑yum更新和yum升级。
  3. 同样,“sudo apt-get install -y xfsprogs mysql-server”没有工作,所以我运行“sudo yum install -y xfsprogs mysql-server”,并安装了MySQL。
  4. 该指南说在/ dev / sdh上创build一个XFS文件系统,但是我的EBS卷连接到/ dev / sda1(这是使用Elastic Beanstalk时的默认设置,不能更改),并且已经有一个文件系统它(我猜Elastic Beanstalk自动创build一个),所以它不让我运行“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. 是否有一个更新的指南,将configurationMySQL在Elastic Beanstalk上使用EBS卷? search谷歌,stackoverflow,serverfault导致从2008/2009年的几个指南,所以他们还没有经过Elastic Beanstalk的testing。 (编辑:有没有像Eric Hammond文档,但是对于CentOS / RHEL?)
  2. 我怎样才能撤消所有阻止MySQL启动的挂载绑定? 我应该删除实例和音量重新开始吗?
  3. 我是否浪费时间试图在Elastic Elastic Beanstalk上设置MySQL? 基于缺乏可用的信息,它可以是a)简单容易做,不需要指导(因此使我成为一个白痴); 或者b)没有人在Elastic Beanstalk上设置MySQL,因为它是不必要的/冗余的(因此我不应该打扰)。

编辑:谢谢你的意见和答案。 我试图找出在AWS上设置PHP / MySQL网站的最佳方法,因此Elastic Beanstalk似乎是一个好主意,因为AWS将它视为“更快速地部署和pipe理AWS中的应用程序云。”

但是,如果你想用EBS运行MySQL,这似乎不是完全正确的。 从我收集的信息来看,我想每个人都会使用RDS和Elastic Beanstalk,因为它可以自动扩展,并可能具有自动快照function。

所以我想我留下这些选项:

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

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

3)使用Elastic Beanstalk:但是在EBS卷上运行configuration了MySQL的Ubuntu AMI(这可能吗?Elastic Beanstalk是否可以使用私有AMI?)

4)使用Elastic Beanstalk:重新开始,并使用cyberx86的指示来调整Ubuntu的指令在CentOS / RHL上工作。

在这一点上,我的数据库和网站stream量很小。 这将是很好的使其可扩展,但在这一点上,我只是想让它运行的方式,让我部署新的版本使用git之后,我的代码在本地主机上工作。 最重要的是让网站运行起来,回到营销和build设function,而不是花时间在主机上。 我该怎么办?

我不使用Elastic Beanstalk – 但是您所遵循的指南是针对EC2(我绝对可以提供帮助)。 你所遇到的第一个难题是你正在使用的指南是Ubuntu 9.10; 亚马逊的Linux基于CentOS / RHEL – 所以如果你能find一个CentOS 6指南,你会更容易。

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

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

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

你会注意到,在你所做的第5步中,你实际上是在其内部安装根卷(即/ dev / sda1已经挂载为/,而你正在挂载/ dev / sda1为/ ebsvol) – 最好避免这样做。

另外,虽然/etc/init.d/mysql stop不起作用,但是/etc/init.d/mysqld stop可能会起作用。 (再次,你可以通过运行ls /etc/init.d得到一个init.d脚本的列表 – 并且应该能够使用这些path,就像你一样,我通常使用service命令)。

MySQL数据库应该位于/ var / lib / mysql中 – 但是,/ etc / fstab中的挂载点可能不正确(因为/ ebsvol问题中的ebsvol)。 当你cd /var/lib/mysql你应该能够看到你的数据库 – 如果没有你的坐骑没有正常工作。 (通过mountpoint -d /var/lib/mysqlvalidation/ 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的一个MySQLpipe理版本,它简化了MySQL实例的configuration和扩展。 请记住,MySQL没有很好的自动调整function,没有太多的设置。 你不能只启动第二个MySQL实例,并在两个实例之间分配负载 – 你需要设置复制,这可能不是一个简单的任务)。

从本质上讲,如果你能够从你的web服务器实例运行MySQL并且可以无缝地进行自动调整,那么你几乎肯定会更好地直接使用EC2,而不用担心Elastic Beanstalk。 因此,我build议大多数人不会在Elastic Beanstalk上设置MySQL(你可以做的是设置一个单独的MySQL实例,但是如果你使用的是Beanstalk,RDS可能是一个更简单的方法)。


编辑:

与许多其他大多数作为黑盒子运行的服务不同,Elastic Beanstalk确实可以让您访问底层组件。 也就是说,如果您要手动设置您的EC2实例,您已经否定了Elastic Beanstalk的要点。

如果你使用的是EC2,PHP / MySQL的方法很less:

  1. 您可以将您的networking服务器和数据库托pipe在一个实例上 – 当您开始时,这可能是一个合理的方法,但是它不能很好地进行横向扩展(但仍然可以使用较大的实例进行垂直扩展)。 希望当你超过x-large实例的容量时,你将能够设置一个更复杂的设置。 也就是说,这对冗余是不利的 – 一切都在单个实例上,任何组件的故障都会导致整个设置失败。
  2. 您可以在一个实例上托pipe您的Web服务器,并使用RDS作为数据库。 大多数devise良好的应用程序将比Web服务器更多地使用数据库(并且数据库负载理想情况下会被读取偏向)。 在这种情况下,您可以相对轻松地扩展您的Web服务器实例(例如,将它们放在ELB后面 – 只需一点努力即可确保所有服务器都提供相同的内容)。 RDS是由AWSpipe理的MySQL–它不是完全自动化的,但是对于自动调节还有很长的路要走。 从本质上讲,RDS将configuration多个只读从属设备,以及具有多个热备份的单个写入主设备,如果需要可以接pipe。 缺点是你正在为所有正在运行的实例付费(而你没有完全控制一些MySQL的复杂设置)。
  3. 最后的办法是使用你的Web服务器集群和你自己的MySQL集群。 本质上,你可以扩展你的web实例(如上),然后你将设置可以单独扩展的MySQL实例。 您将需要考虑MySQL复制(或者,如果您可以使您的应用程序适应其数据结构,也许使用MySQL群集)。

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

  • RDS vs EC2
  • 部署应用程序
  • 一些EC2缩放的方法

我的观点是通常一点击解决scheme并不是最好的方法 – 我喜欢手动操作提供的控制。 我发现,不仅我通常会得到更加定制和有效的最终结果,而且我还更好地理解系统如何工作,这使得更容易找出错误。 一旦你对错综复杂的问题有了很好的了解,你就可以自动完成自己的设置。

有一点要记住RDS – 它已经被EBS支持了。 RDS是MySQL–它不是类似的,或者是其他的关系数据库。 它是在EBS支持的EC2实例上运行的MySQL的托pipe实例。 AWS将使软件保持最新状态,并且可以对数据执行正常的EBS快照等。您只是无法直接访问实例上运行的底层软件。

至于操作系统的select,我偏向于亚马逊的Linux。 它得到了AWS的很好的支持,并且使用了最less的资源 – 它完全与CentOS兼容(事实上,它包括最新版本默认的EPEL仓库)。 通常的观点是使用任何你喜欢的Linux发行版,因为它们之间的差异通常很小(CentOS的工作方式和Ubuntu的工作方式一样 – 大多数命令(apt-get除外)在CentOS上都是一样的考虑到我自己的安装程序使用Amazon的Linux在单独的EBS卷上有数据库,我可以向你保证这并不困难)。

我build议有一些主要考虑因素:

  • 学习Linux系统的乐于学习的意愿 – 如果你不介意build立你自己的服务器并想更好地理解它们,我肯定会去EC2的路线。 如果你做得对,你会得到一个更好的最终结果,从长远来看将会有更多的多样性。 我会提到,如果你正在采取这种方法,你想真正理解你正在运行的命令是什么 – 只要遵循指南是不够的,如果你真的想承诺。
  • 预算 – 请记住,使用AWS一切都有一个价格。 AWS为您提供的服务越多,他们就会收取越多的费用。 RDS实例比等效的EC2实例花费约30%(并且没有微型实例),如果你想要它们提供的冗余,你需要运行多个RDS实例(并为每个实例付费)。 Elastic Beanstalk将为您提供实例,负载均衡器,RDS实例等,这些成本会快速增加。
  • 时间 – 如果你没有时间,想要按几个button,并有一些function,Elastic Beanstalk可能是最适合你的方法。

我build议不要在你的AMI中使用带有MySQL的Elastic Beanstalk,如果它工作的话,它可能是相当不稳定的。 (只要想一想当它向你的集群中添加和删除一个实例,或者当数据转到一个实例而不是另一个实例时会发生什么……)

记住可扩展性是很好的 – 但不要过早地优化,否则你永远无法完成任何事情。 一定要记住,但是如果现在制作一个特定组件的成本(时间,金钱等)是不现实的,那么不要太担心 – 当时机成熟时,我会弄清楚(最stream行的网站是这样开始的,毕竟)。

我build议,如果你的应用程序devise得可以利用一些caching,那么它将会有很长的路要走。

通常情况下,EC2最好是垂直扩展(对于更大的实例),而不是水平扩展(对于更多的实例)。 但是,首先要扩展到两个实例,以便有一定的冗余度,并尽量减less单点故障。 因此,可能的做法可能是:

  1. 从一个微型实例开始 – 你的数据库和应用程序都在它上面(你不能小于这个数量,这是一个很好的起点)。
    • 这当然很容易垂直扩展,只要继续升级实例,直到使用x大型实例为止。 问题归结为冗余 – 如果您的实例有任何问题,您的应用程序处于脱机状态。
  2. 现在,您通常希望将数据库分离到另一个实例(因为a)数据库将看到与您的应用程序不同的负载,并且b)您不能像web服务器那样自动调整MySQL),但是微型实例只是不要所以我build议首先升级到一个更大的实例,至less是一个小的,然后,也许是一个中等的(基本上,这个想法是,一旦你需要更大的实例types,效果可能会更大)
  3. 将数据库从Web服务器中分离出来。 这将允许您迎合数据库(例如高内存)与Web服务器(例如更高的CPU)的不同需求以及您如何缩放每个( 推荐阅读 )之间的差异。 此时,您可能决定使用RDS而不是运行自己的MySQL实例。
  4. 现在你的应用程序运行在一个专用的实例上,你可以扩展它,而不用担心数据库设置的自动扩展,所以你有一些冗余。 这应该会自动添加更多的应用程序节点,因为它们中的任何一个都会失败,或者当负载超过您指定的阈值时。
  5. 添加第二个数据库节点并在节点之间configuration复制(如果您select使用MySQL集群或NoSQL解决scheme,则应该也可以设置自动缩放)。 一切都应该在这一点上有冗余,即使一个节点失败,你仍然应该在线。
  6. 一次将一个实例升级到更大的实例大小,因为需求值得考虑。

现在我已经对Elastic Beanstalk和EC2更加熟悉了,我决定放弃使用Elastic Beanstalk,因为尽pipe它有一些很酷的function,但是对于我的喜好来说,它太过于苛刻。 例如,我不喜欢我无法更改httpd.conf文件的事实(当然,您可以更改它,但是当您的环境重新启动时,这些更改将消失)。 另一个原因是用MySQL运行Elastic Beanstalk的唯一方法就是使用RDS(适当地,即自动扩展和自动备份)。 即使您可以免费获得3个月的RDS新注册,但我并没有达到需要其function的规模,所以我不需要为RDS支付大约$ 76 /月的费用。

底线:如果您拥有合理的stream量,并且您需要一个能够自行扩展和自我pipe理的解决scheme,那么带有RDS的Elastic Beanstalk是一个不错的select。 我喜欢你可以使用git进行部署的事实。 这就像PHP的Heroku。 入门指南应包括设置MySQL的说明。

我做了什么:我select使用“Synthetic Elastic Beanstalk”:我可以使用AWS提供的各种产品重新创build其function,并且可以灵活地按照自己想要的方式进行configuration。 当我在踢AWS的轮胎时,我已经在与我的webapp相同的EC2实例上设置了MySQL(一旦你需要扩展,不是很理想,但是在你学习使用AWS的时候是完美的)。

本指南是我用来在运行Amazon Linux AMI的EC2实例上设置LAMP堆栈的。 我发现用phpmyadmin导入我的数据库比较容易。 因为我使用的是微型实例,所以默认情况下会使用EBS,您可以使用快照来备份数据。 我会build议为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安装,数据库)。

总体而言,将网页应用程序迁移到AWS的整个过程仍然是一件非常痛苦的事情。 现在我已经经历了学习曲线,我感觉更舒适,但我不禁想到应该有更好的入门文档。