迁移到具有自动扩展功能的 AWS 云 - Redis 和 ElasticSearch 应该放在哪里?

迁移到具有自动扩展功能的 AWS 云 - Redis 和 ElasticSearch 应该放在哪里?

我一直在尝试研究这个主题,但没有找到任何地方推荐在迁移到云框架时在哪里安装 Redis 和 ElasticSearch 等服务。

我目前在 2 台静态服务器上运行 Symfony2 应用程序 - 一台运行 MySQL,另一台是面向公众的 Web 服务器,上面还运行着 Redis 和 ElasticSearch。这两台服务器都是虚拟化的,但它们是静态的,目前无法复制(各个方面仍然依赖于本地文件系统)。

目标是迁移到 AWS 并使用自动扩展功能,以便能够根据需要启动和关闭 Web 服务器,但我不清楚应该在每个 EC2 实例上放什么。它们是否应该只承担单一责任?即为 Web 服务器、Redis 和 ElasticSearch 设置单独的实例,并且很可能为 MySQL 设置 RDS 实例,并仅在 Web 服务器上设置自动扩展?

我预计近期不会扩展 ElasticSearch 服务器,因为它仅用于驱动搜索功能,但 Redis 可能需要在某个时候进行复制 - 但应该手动完成吗?我不确定如何自动完成此操作,因为据我所知,每个实例都需要配置为了解其主/从属。我很感激对此的建议。

我在这里还有一个快速问题 - 当当前有 X 个 Web 服务器处于活动状态时,我如何部署代码更改?我正在使用 Capifony 部署脚本(Capistrano 的 Symfony2 版本),我认为它可以通过指定地址数组轻松处理多个服务器:domain...但是当 Web 服务器的数量可能变化时,应该如何处理?

答案1

我们处理这个问题的方式是在分层堆栈中创建多组服务器(即使一个组目前只需要一个实例)。第一层是您的弹性负载均衡器, 清楚地。

第二层是Auto Scaling 组Web 服务器(多可用区域)。这些服务器在启动时会启动一个自定义 AMI,该 AMI 旨在为执行此任务做好准备。(现在我们的流程更加成熟,我们实际上启动了一个通用 AMI,该 AMI 可以在启动时使用 Chef 自动配置。)但我们git pull在启动时也会执行最新的生产代码存储库,因此我们不必在每次部署代码时创建新的 AMI。这也使我们能够更轻松地更改配置,例如数据库主机、Redis 主机等。

第三层用于数据库和其他服务,例如 ElasticSearch 和 Redis。您可以将所有三个服务托管在一个盒子上,然后处理管理自己的 mysql 从属服务器,或者您可以将 Redis 和 ElasticSearch 托管在它们自己的盒子上,并使用 Amazon 的 RDS 来提供 Mysql 服务。您的选择取决于您是否想在 MySQL 中管理自己的复制/容错。

通常最简单的方法是使用亚马逊 RDS在多可用区域配置中。我们始终尝试部署多可用区,因此如果单个可用区发生故障,我们仍可正常运行。然后运行一个较小的实例来托管 Redis 和 ElasticSearch。

ElasticSearch,这是我们用于 rails 安装的一个技巧:在盒子上安装并维护您的应用程序的完整实例以及 ElasticSearch。然后为这个角色(或 Chef 角色)构建一个 AMI。原因是,如果您正在启动一个新的 AMI,您可以在启动时运行实用程序任务以从头开始创建 ElasticSearch 索引。然后,将此实例也放入多可用区 ASG 中,最小和最大服务器为一台。如果该盒子或可用区死机,ASG 将启动一个替代品,它将在启动时重建其索引并准备好为客户提供服务。

为了Redis,好消息即将到来。redis-cluster即将推出,它有望让管理 redis 存储的扩展变得更加容易。与此同时,您可以处理自己的复制或尝试 Garantia,一个托管的可扩展 redis 服务器解决方案,目前使用的是 redis-cluster 测试版(目前仅限于 us-east-1 区域)。这样做的好处是,无论实例池发生什么情况,都可以为您的配置保留相同的 IP 地址。

最后,为了保护进出数据库的数据,我建议在公有/私有网络的私有网络部分内构建它。虚拟私有云。这将设置您自己的与数据包嗅探器隔离的专用网络。您还可以对 MySQL 数据库连接使用 SSL 加密。

相关内容