我使用EC2作为现场制作服务器,我使用git进行源代码pipe理。 目前,当我推送更改到网站,我有一个bash脚本运行并从git拉最近的变化,并重新启动服务器。 这会导致该站点在这种情况下停机约十秒。
我希望能够推动变化,保持网站的生活。 (我最初的想法是使用现有的代码启动额外的EC2实例,同时将这些更改推送到正在更新的服务器上。)有什么方法可以在推送更改时保持网站的正常运行?
我喜欢从运行旧代码的服务器转换到使用负载平衡器运行新代码的服务器。
如果有足够的活动服务器可以处理两倍的当前stream量,则可以:
如果您没有足够的运行服务器,您可以按照如下步骤操作:
这对于像Web服务器这样的无状态实例最适合。 数据库需要一种不同的方法,但是您的Web服务器通常使用一个不需要经常更改的单一数据库,而您的数据库更改可以同时使用新旧代码进行转换。
使用Amazon的Elastic Load Balancer(ELB)执行上述types的实时切换到新的服务器时,我们发现了一个问题。 当你将旧的实例退出服务时,ELB粗鲁地放弃了任何活动的连接。 根据您的应用程序,您可能能够忍受它,特别是如果您以前的行为是一个服务器重新启动完全中断。
这里是我们在Amazon报告这个错误的线程。 你可以关注它的更新:
从ELB中抽取实例时,现有连接粗暴地掉线
https://forums.aws.amazon.com/thread.jspa?threadID=61278
如果亚马逊需要进一步的反馈意见,那么这是您的问题。
您可能需要“平稳重启”而不是正常的“重启”。 在Apache中,您可以使用/etc/init.d/apache2 graceful (Ubuntu)或/etc/init.d/apache graceful (RHEL / CentOS)来使新连接使用新近更新的应用程序实例。 另一个好处是现有的请求不会在重启完成时中断。
从你的描述,这应该解决你的问题。 有关“优雅”意味着什么的更多细节,请参阅man apachectl的“优雅”部分。