我有一些带有负载均衡器的码头服务器。现在我想在不停机的情况下更新我的应用程序。当一个码头正在下降并且不再可达时,负载均衡器会自动将其从列表中删除,所以这不是问题。
主要问题是避免停机时间:因此,我必须确保一次只有一个码头重新启动 - 或者确保至少有 N 个码头在线!
目前我正在使用一个简单的 bash 脚本,我需要手动等待一个码头再次联机,然后再重新启动下一个码头等等。
现在 bash 对于这类事情不是很理想,我希望有更适合使整个任务自动化的工具。http://jetty-number-n.com/ping
例如,如果第 n 个码头在线,我可以使用一个简单的 ping URL来响应 OK (200)。
我如何解决这个任务以及使用哪种工具?
感谢@ceejayoz,我找到了 ansible的滚动更新。但它仍然不是最佳选择,因为我需要设置一个固定的超时时间。
使用 Ansible 这很容易。粗略的伪ansible剧本:
Salt 有一个方便的批处理选项。
一次在 25% 的 RedHat 服务器上重启 jetty 服务。
重新启动预定义的“group1”中的服务器,一次 2 个。
Puppet 具有Services和Ordering的概念。但是人偶在单个服务器上运行。所以它无法洞察它正在运行的其他系统。
如果你想使用 puppet,你可以拥有它,这样一个主控服务器就有一个初始化脚本来管理每台服务器的服务。因此 init 脚本将在每台服务器上运行重启并返回状态代码。您可以这样做并链接每个服务,从这台服务器重新启动,然后进行排序、链接或通知并订阅以移动到下一个服务器。
您还可以为 puppet 编写一个自定义库,它将一个服务器视为主控制服务器,而不是使用 init 脚本。它可以使用自定义的 ruby 库来管理每个服务器的服务。设置起来有点复杂,但可以工作。
我现在在工作中使用 Puppet,但正如第一位发帖人所回答的那样,这听起来不像是 Puppet 的理想第一项任务。我无法与 ansible 对话(尽管我想开始尝试)。
Puppet 更适合同时推出更改/重新启动系统——Puppet 守护进程在每个客户端上运行,并以预定的时间间隔(默认为每半小时)检查中央服务器。如果你想改变默认调度,你通常使用不同的机制来调用 puppet。
如果您可以同时重新启动,那么重新启动服务就是定义清单的问题
资源指令,然后推出清单并让 Puppet 做它的事情。这假设你可以打电话
这可能会或可能不会被接受甚至可能。
您还可以为此定义自己的自定义资源类型,这绝对超出了简单的首次木偶任务的范围。
但是,请查看http://forge.puppetlabs.com/,看看是否有其他人解决了类似的问题。
你想做的任务可以使用 ansible 完成,而且绝对可以使用 Puppet 完成。我将专注于如何使用木偶来完成它。
您可以使用 puppet 将 WAR 文件部署到码头,方法是使用普通的“文件”资源和为每个应用程序初始化的已定义资源。
Puppet 将从您指定的 URL(在您的 Puppet Master 上)下载。如果 WAR 文件修改时间发生变化,Jetty 能够在不重新启动的情况下重新部署 WAR 文件。因此,如果您的清单在其中创建了一个副本,
$JETTY_HOME/webapps
那么 Jetty 应该会自动获取它。这样(或通过触摸 context.xml)您不需要手动重新启动 Jetty。为了将 WAR 文件从您的 Puppet Master 下载到您的应用程序目录,您需要以下清单(替换 $JETTY_HOME):
并且您需要指示您的节点一个接一个地获取应用程序的特定版本(在您确定它已在其中一个节点上成功启动之后)。这可以使用ENC(外部节点分类器)来完成,或者,如果您不使用 ENC,则可以通过修改每个节点(或节点组)的 site.pp 部分来完成:
include jetty
仅当您想使用例如 puppet 管理 Jetty 配置时才需要该行。https://github.com/maestrodev/puppet-jetty并且这个定义的资源需要一个 appserver-jetty::$port 变量。此示例显示了您可以准确控制哪个节点提供哪个版本的应用程序的最简单方法。通过这种方式,您可以根据您的健康检查编写部署脚本,并仅在 node1 成功运行新版本后才在 node2 上部署。这个例子只是为了演示这个概念。
您可能想查看这些额外资源以获取更多信息和想法:关于重新加载上下文:https ://stackoverflow.com/questions/13965643/auto-reloading-war-in-jetty-standalone
这是用于 tomcat 的部署和管理,但思想(和清单)是相似的:http ://www.tomcatexpert.com/blog/2010/04/29/deploying-tomcat-applications-puppet
这是 IMO 直接复制 WAR 文件的更好替代方案 - 使用本机包(例如 RPM)部署您的应用程序: http ://www.slideshare.net/actionjackx/automated-java-deployments-with-rpm