我一直在试图研究这个话题,但在迁移到云框架时还没有find推荐安装Redis和ElasticSearch等服务的地方。
目前,我正在两台静态服务器上运行Symfony2应用程序,一台运行MySQL,另一台运行Redis和ElasticSearch。 这两个服务器都是虚拟化的,但是目前这些服务器是无法复制的(各方面仍然依赖于本地文件系统)。
我们的目标是迁移到AWS,并使用自动扩展function来根据需要启动和停止Web服务器,但是我不清楚每个EC2实例上应该放置什么。 他们应该只是单一的责任吗? 即为Web服务器,Redis和ElasticSearch设置单个实例,并且很可能是MySQL的RDS实例,并且只在Web服务器上设置自动扩展?
我不预期必须随时扩展ElasticSearch服务器,因为它只能驱动searchfunction,但可能需要在某个时候复制Redis,但应该手动完成此操作吗? 我不确定这是如何自动完成的,因为据我所知,每个实例都需要被configuration为了解它的主/从。 我会很感激这方面的build议。
当我在这里时还有一个简单的问题 – 当X Web服务器当前处于活动状态时,如何部署代码更改? 我使用的Capifony部署脚本(Symfony2版本的Capistrano),我认为可以很容易地处理多个服务器,通过指定一个数组:domain地址…但如何可以这样处理,当Web服务器的数量可以改变?
我们处理这个问题的方式是在分层堆栈中创build多组服务器(即使一个组当前只需要一个实例)。 第一层是你的Elastic Load Balancer ,显然。
第二层是一个Web服务器(多可用区)的Auto Scaling组 。 这些引导定制的AMIdevise成在启动时处于适当的就绪状态。 (现在我们的stream程更加成熟了,我们实际上启动了一个通用的AMI,可以在启动时使用Chef自动configuration)。但是我们也在启动时进行最新的生产代码仓库的git pull ,所以我们不需要创build每个代码部署一个新的AMI。 这也允许我们更容易地更改configuration,例如数据库主机,Redis主机等。
第三层用于数据库和其他服务,如ElasticSearch和Redis。 您可以将所有三个服务都托pipe在一个框中,然后处理pipe理自己的mysql从站,也可以在自己的机器上托pipeRedis和ElasticSearch,并将Amazon的RDS用于您的Mysql服务。 你的select是基于你是否想在MySQL中pipe理自己的复制/容错。
通常最简单的方法是在多可用区域configuration中使用Amazon RDS 。 我们总是试图部署多可用区 ,所以如果单个可用区失败,我们仍然可以运行。 然后运行一个较小的实例来托pipeRedis和ElasticSearch。
使用ElasticSearch ,下面是一个我们用于rails安装的提示:在框中安装和维护一个完整的应用程序实例以及ElasticSearch。 然后为此angular色(或厨师angular色)构buildAMI。 原因是,如果您正在引导新的AMI,则可以在启动时运行实用程序任务以从头开始创buildElasticSearch索引。 然后,将这个实例放在一个多可用区ASG中,最多和最less一个服务器。 如果那个盒子或者AZ死了,ASG将启动一个replace,并且它将在启动时重build它的索引,并准备好为客户提供服务。
对于Redis来说 ,地平线上有好消息。 redis-cluster即将推出,这将有助于更轻松地pipe理缩放redis存储。 与此同时,您可以处理自己的复制或尝试使用托pipe的可扩展Redis服务器解决schemeGarantia,该解决scheme现在正在使用Redis-cluster版本(目前仅限于美国东部地区)。 这具有为您的configuration保留相同的IP地址的优点,无论您的实例池发生了什么情况。
最后,为了保护你的数据到你的数据库,我build议在公共/私有虚拟私有云的私有networking部分build立这个数据库。 这build立了你自己的专用networking,它与数据包嗅探器隔离开来。 您也可以为您的MySQL数据库连接使用SSLencryption。