Auto Scaling 无法与 Elastic Beanstalk 中的 Tomcat 一起正常工作
Posted
技术标签:
【中文标题】Auto Scaling 无法与 Elastic Beanstalk 中的 Tomcat 一起正常工作【英文标题】:Auto Scaling not working properly with Tomcat in Elastic Beanstalk 【发布时间】:2014-08-22 01:57:50 【问题描述】:我使用 Tomcat(基于 java)创建了一个 Autoscaled Elastic Beanstalk 应用程序来提供 Web 服务。
作为首次初始化的一部分,我必须将一些大文件从 S3 复制并解压缩到底层 EC2 实例(如果实例重新启动并且已经有数据文件,则不需要此步骤)。这一切都在 servlets init() 方法中完成,并且在非缩放环境中完美运行 - 但速度很慢 - 大约需要 30 分钟。
但是当我创建一个自动缩放的环境时,我发现了两个问题:
它实际上启动了三个 EC2 实例,即使没有对服务进行一次调用,我假设在监视第一个实例以启动它时它没有响应,因为它在 init() 方法中很忙,因此它启动另一个实例,依此类推。
这表明服务已准备就绪,即使它们正忙于 init() 方法并且尚未准备好接受请求。
当然,Elastic Beanstalk 应该等待第一个实例的 init() 方法完成BEFORE,它指示它已准备好,然后再将其监控为繁忙并考虑启动新实例。
然后我离开了二十分钟,因为没有活动,三个实例中的两个被停止了。所以我想好吧,我可以在第一次部署时解决这个问题预加载,因此它们将快速启动。但是我又看了一遍,发现这两个实例现在已经被终止,所以认为问题在于如果 EB 决定启动一个新实例,因为 instance1 真的很忙,那么会有一段时间 instance2 没有真正准备好但正在接受请求,因此用户请求可能成功也可能失败,具体取决于它们是重定向到 instance1(有效)还是 instance2(失败)。
我的假设是否正确,为什么 EB 不尊重 init() 方法,我该如何解决这个问题?
【问题讨论】:
【参考方案1】:Elastic Beanstalk 大多不了解应用程序服务器内部,包括 servlet 上下文侦听器。 Beanstalk 将对您的环境资源进行健康检查,如果您的实例没有响应,它们可能会根据您的自动扩展配置被替换。这可能是您看到更多实例出现而没有流量的原因。
此处描述了 Elastic Beanstalk 执行的应用程序运行状况监控:
http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/using-features.healthstatus.html
使用 .config 文件设置实例可能比上下文侦听器 init() 更好,请参阅:
http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/using-features.customami.html
【讨论】:
嗯,谢谢,这将是 .eb_extensions,然后我真的不喜欢尝试处理诸如此类的自定义配置文件。 我知道我还可以创建一个自定义 ami 以与 eb 一起使用,我没有意识到我可以这样做,所以也许更容易创建加载数据文件的自定义 ami,然后将此 ami 用于 eb? 我不会为 EB 创建自定义 AMI,因为构建和维护起来很复杂。但是由于 EB 支持 docker,准备好 docker 容器并将其部署到 beanstalk 似乎是一个更好的主意。 这是一个有趣的想法,可能值得在未来进行一些调查,但我真的不想花更多时间调查和引入另一种我不了解的基础设施来解决一个问题 好的,我已经设法使用 ebextensions 进行部署,这实际上并没有那么困难。以上是关于Auto Scaling 无法与 Elastic Beanstalk 中的 Tomcat 一起正常工作的主要内容,如果未能解决你的问题,请参考以下文章
Elastic Beanstalk 环境的 Auto Scaling 组
为 Auto Scaling 配置 AWS Elastic Beanstalk 时区
Elastic Beanstalk 上的 Auto Scaling 批处理作业
Elastic Beanstalk Auto Scaling - 我应该使用哪个指标?