如何在 Amazon EC2 上部署 Java webapp,以便您可以高效地使用自动缩放?
How to deploy a Java webapp on Amazon EC2 so that you can efficiently use autoscaling?
我正在尝试了解 Amazon Web Services 上的一个简单 WebApp Java 部署案例。
我已经在单个 EC2 实例上手动部署,在 vanilla RedHat 映像上手动安装 Java、Tomcat、MySql——就好像我拥有硬件一样。
现在我正在尝试设置一个可自动扩展、易于管理、生产证明的环境:
- 1 -> n Tomcat 个部署了标准 Java WebApp 的实例,
- 1 MYSQL 具有 1 个模式和一些表(不多)的数据库,webapp 连接到它。
我知道自动缩放取决于某些触发器(例如超过 % 的使用率)。但是,当新服务器启动时,我的应用程序未部署,因为它不在 VM 映像中。需要发生一些事情,以便新服务器 运行 我的代码。
- 大规模部署到 1-n 自动缩放组的最佳选择 tomcat 亚马逊上只有服务器?
- 升级您的应用程序的最佳选择是什么?我猜你不希望所有的服务器一下子宕机...
- 如何创建一个 VM 映像来自动检索我的 CI 中可用的最新版本(已上传到 S3 或其他设备)?我可以轻松地将此脚本添加到 Tomcat bootstrap / linux startup...
像 Chef 或 Puppet 这样的商业工具怎么样?任何开源等效项?
您可以在 EC2 启动配置上使用 User Data。您可以使用它来将 shell 脚本传递给您的实例,该实例将在首次启动时自动 运行。正如您在问题中所建议的那样,一种常见的模式是让 shell 脚本从 S3 下载并安装一个构建。
使用此模式,升级自动缩放组的构建很容易。只需将新构建上传到 S3。然后,手动终止自动伸缩组中的实例。自动缩放将自动启动新的 EC2 实例,该实例将从 S3 下载新版本,很快,您的自动缩放组已更新。如果您一次终止一个实例,并在终止下一个实例之前等待新实例上线,那么对您系统的影响就会最小化。
我在网上看了很多东西,是的,正如 Georges 所说,ElasticBeanStalk 是正确的选择。不过,一开始感觉还是挺乱的。
首先,您可以使用 t2.micro 个实例 运行 免费层上的负载平衡/可扩展环境。重要的是总小时数。你可以用100台服务器7个小时就没事了。小心健康检查,因为它会一直对您的环境执行 ping 操作。如果您 运行 测试/评估并且不想付费,请确保您保存/备份并尽快终止您的环境。数据传输显然不是免费的,因此如果您不想付费,请确保不要使用任何多可用区和多区域。
也就是说,BeanStalk 是一种 "black box" 可以为您提供很多帮助的工具。它旨在为您在控制台中创建所有配置。一种用于负载平衡/可扩展环境的 "super-wizard"。
配置是这样的:你说你有一个要部署的 war 文件,你上传它,你选择一个容器(例如 linux+tomcat),你设置一个数据库,它将创建一个包含所有你想要的基本配置:负载平衡、自动缩放和监控。更改设置以满足您的需要很容易。
一个棘手的事情是数据库配置:您需要设置环境变量并按照以下方式在 spring 配置中使用它们:https://raymondhlee.wordpress.com/2013/06/01/migrating-a-java-web-app-for-deploy-to-aws-elastic-beanstalk/
应用程序更新可能会在 "rolling way" 内发生,即在您的服务器群的有限百分比(默认为 30%)上发生,这意味着您不必太担心停机时间。
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
- 使用正确的端口创建安全组
- 创建自动缩放组
- 启动您的实例
任何后续更新都将作为零停机 blue/green 部署完成。
我正在尝试了解 Amazon Web Services 上的一个简单 WebApp Java 部署案例。
我已经在单个 EC2 实例上手动部署,在 vanilla RedHat 映像上手动安装 Java、Tomcat、MySql——就好像我拥有硬件一样。
现在我正在尝试设置一个可自动扩展、易于管理、生产证明的环境:
- 1 -> n Tomcat 个部署了标准 Java WebApp 的实例,
- 1 MYSQL 具有 1 个模式和一些表(不多)的数据库,webapp 连接到它。
我知道自动缩放取决于某些触发器(例如超过 % 的使用率)。但是,当新服务器启动时,我的应用程序未部署,因为它不在 VM 映像中。需要发生一些事情,以便新服务器 运行 我的代码。
- 大规模部署到 1-n 自动缩放组的最佳选择 tomcat 亚马逊上只有服务器?
- 升级您的应用程序的最佳选择是什么?我猜你不希望所有的服务器一下子宕机...
- 如何创建一个 VM 映像来自动检索我的 CI 中可用的最新版本(已上传到 S3 或其他设备)?我可以轻松地将此脚本添加到 Tomcat bootstrap / linux startup...
像 Chef 或 Puppet 这样的商业工具怎么样?任何开源等效项?
您可以在 EC2 启动配置上使用 User Data。您可以使用它来将 shell 脚本传递给您的实例,该实例将在首次启动时自动 运行。正如您在问题中所建议的那样,一种常见的模式是让 shell 脚本从 S3 下载并安装一个构建。
使用此模式,升级自动缩放组的构建很容易。只需将新构建上传到 S3。然后,手动终止自动伸缩组中的实例。自动缩放将自动启动新的 EC2 实例,该实例将从 S3 下载新版本,很快,您的自动缩放组已更新。如果您一次终止一个实例,并在终止下一个实例之前等待新实例上线,那么对您系统的影响就会最小化。
我在网上看了很多东西,是的,正如 Georges 所说,ElasticBeanStalk 是正确的选择。不过,一开始感觉还是挺乱的。
首先,您可以使用 t2.micro 个实例 运行 免费层上的负载平衡/可扩展环境。重要的是总小时数。你可以用100台服务器7个小时就没事了。小心健康检查,因为它会一直对您的环境执行 ping 操作。如果您 运行 测试/评估并且不想付费,请确保您保存/备份并尽快终止您的环境。数据传输显然不是免费的,因此如果您不想付费,请确保不要使用任何多可用区和多区域。
也就是说,BeanStalk 是一种 "black box" 可以为您提供很多帮助的工具。它旨在为您在控制台中创建所有配置。一种用于负载平衡/可扩展环境的 "super-wizard"。
配置是这样的:你说你有一个要部署的 war 文件,你上传它,你选择一个容器(例如 linux+tomcat),你设置一个数据库,它将创建一个包含所有你想要的基本配置:负载平衡、自动缩放和监控。更改设置以满足您的需要很容易。
一个棘手的事情是数据库配置:您需要设置环境变量并按照以下方式在 spring 配置中使用它们:https://raymondhlee.wordpress.com/2013/06/01/migrating-a-java-web-app-for-deploy-to-aws-elastic-beanstalk/
应用程序更新可能会在 "rolling way" 内发生,即在您的服务器群的有限百分比(默认为 30%)上发生,这意味着您不必太担心停机时间。
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
- 使用正确的端口创建安全组
- 创建自动缩放组
- 启动您的实例
任何后续更新都将作为零停机 blue/green 部署完成。