如何在 Amazon EC2 上部署 Java webapp,以便您可以有效地使用自动缩放?

Posted

技术标签:

【中文标题】如何在 Amazon EC2 上部署 Java webapp,以便您可以有效地使用自动缩放?【英文标题】:How to deploy a Java webapp on Amazon EC2 so that you can efficiently use autoscaling? 【发布时间】:2015-03-10 06:16:08 【问题描述】:

我正在尝试了解 Amazon Web Services 上的一个简单的 WebApp Java 部署案例。

我已经在单个 EC2 实例上手动部署,在一个普通的 RedHat 映像上手动安装 Java、Tomcat、mysql——就好像我拥有硬件一样。

现在我正在尝试建立一个可自动扩展、易于管理、生产证明的环境:

1 -> n 个部署了标准 Java WebApp 的 Tomcat 实例, 1 个 MYSQL 数据库,带有 1 个架构和几个表(不多),webapp 连接到它。

我了解自动缩放取决于某些触发器(例如,超过 % 的使用率)。但是,当新服务器启动时,我的应用程序没有部署,因为它不在 VM 映像中。需要发生一些事情,以便新服务器运行我的代码。

    在亚马逊上大规模部署到 1-n 自动缩放组的仅 tomcat 服务器的最佳选择是什么? 升级应用程序的最佳选择是什么?我猜你不希望所有的服务器一次停机...... 如何创建一个自动检索从我的 CI 中可用的最新构建(上传到 S3 或其他东西)的 VM 映像?我可以轻松地将此脚本添加到 Tomcat 引导程序/linux 启动...

Chef 或 Puppet 等商业工具怎么样?任何开源等效项?

【问题讨论】:

看看 AWS Elastic Beanstalk 谢谢。我看了看,看起来很棒。话虽如此,我正在寻求有关一般部署策略的一些建议,然后是合适的工具。 【参考方案1】:

Boxfuse 做你想做的事。

对于您的 Java Web 应用程序,您实际上只需要执行:

boxfuse create my-tomcat-app -apptype=load-balanced
boxfuse scale my-tomcat-app -capacity=1-16:t2-micro:cpu25-75
boxfuse run my-tomcat-app-1.0.war -env=prod

这会

    将您的应用程序配置为使用 ELB 将其设置为根据 CPU 使用情况在 1 到 16 个 t2.micro 实例之间自动缩放(在 25% 及以下缩小,在 75% 及以上缩小) 创建 AMI 并设置您的应用和 Tomcat,以便它们准备好启动 创建 ELB 使用正确的端口创建安全组 创建自动缩放组 启动您的实例

任何后续更新都将作为零停机蓝/绿部署完成。

更多信息:https://boxfuse.com/blog/auto-scaling

【讨论】:

【参考方案2】:

我在网络上查看了很多东西,是的,正如 Georges 所说,ElasticBeanStalk 是正确的使用方法。不过,一开始感觉很混乱。

首先,您可以使用 t2.micro 实例在免费层上运行负载平衡/可扩展环境。重要的是总小时数。您可以使用 100 台服务器 7 小时,就可以了。小心使用健康检查,因为它一直在检测您的环境。如果您运行测试/评估并且不想付费,请确保您保存/备份并尽快终止您的环境。数据传输显然不是免费的,因此如果您不想付费,请确保不要使用任何多可用区和多区域。

也就是说,BeanStalk 是一种“黑匣子”,可以为您做很多事情。它旨在为您在控制台中创建所有配置。一种用于负载平衡/可扩展环境的“超级向导”。

配置是这样的:你说你有一个你想要部署的war文件,你上传它,你选择一个容器(例如linux+tomcat),你建立一个数据库,它会创建一个你所有的基本配置want :负载平衡、自动缩放和监控。可以轻松更改设置以满足您的需求。

一个棘手的事情是数据库配置:你需要设置环境变量并在你的 spring 配置中使用它们:https://raymondhlee.wordpress.com/2013/06/01/migrating-a-java-web-app-for-deploy-to-aws-elastic-beanstalk/

应用程序更新可以“滚动方式”发生,即发生在有限比例的服务器上(默认为 30%),这意味着您不必过多担心停机时间。

【讨论】:

【参考方案3】:

您可以在 EC2 启动配置中使用 User Data。您可以使用它向您的实例传递一个 shell 脚本,该脚本将在第一次启动时自动运行。正如您在问题中所建议的那样,一种常见的模式是让 shell 脚本下载并从 S3 安装构建。

使用此模式,升级您的自动缩放组的构建很容易。只需将新版本上传到 S3。然后,手动终止自动伸缩组中的实例。自动扩展将自动启动新的 EC2 实例,该实例将从 S3 下载新构建,然后您的自动扩展组将更新。如果您一次终止一个实例,并在终止下一个实例之前等待新实例上线,那么对您的系统的影响就会降到最低。

【讨论】:

以上是关于如何在 Amazon EC2 上部署 Java webapp,以便您可以有效地使用自动缩放?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Amazon EC2 上部署 Eclipse Java Web 动态项目?

在 Amazon 云上使用 Java Web 服务

在 EC2 上运行 Java EE 应用程序

如何在 Amazon Auto-scaling 组中的多个 ec2 实例上部署和更新应用程序?

在 amazon ec2 (beanstalk) 上编辑已部署文件的权限

如何在 Amazon 的 EC2 上运行 Java 服务器?