如何在部署Clojure Web服务时减少重新加载时间?

3

我使用Linux/upstart启动我的jar文件。

我是这样做的:

  1. 使用lein uberjar生成myapp.jar
  2. 通过scp将myapp.jar复制到专用服务器上
  3. ssh到专用服务器
  4. 停止myapp.jar
  5. 将jar文件复制到目标目录(因此upstart可以找到它)
  6. 启动myapp.jar

有几个问题:

  1. 执行步骤1、2、3和6很繁琐。我认为可以在脚本中完成,但我不确定在停止myapp之前替换myapp.jar是否安全。更改正在运行的jar文件是否安全?
  2. 步骤5和7之间的延迟约为10秒。是否可以立即更新myapp.jar?更有趣的是:是否可以现场更新:例如,我已经打开了连接,我想保存它们。
  3. 是否可以像Erlang一样进行部署?如果部署失败,它会加载以前的版本。

3
这个问题是否更适合在serverfault等网站提问?它基本上是关于自动化部署,除了你使用lein构建"fat jar"这个随机的事实之外,几乎与Clojure无关。 - cfrick
我同意这个问题不适合在这里讨论。据我所知,Clojure和JVM都没有提供一种方法来实现这个。但你可以考虑使用类似Ansible的工具来从第二步开始进行脚本编写。 - Hugo
1
我同意这更适合在Serverfault上讨论。无论如何,这里有一些笔记。您可以从脚本内部向jvm发送停止信号,而不必手动执行。就智能更新而言,这可能涉及到拥有一个网关程序来决定谁提供请求。您将同时运行旧的和新的jvm应用程序,网关将以某种方式在它们之间进行选择。我敢打赌Serverfault的人会对此有一些好的建议。 - Dominykas Mostauskis
1个回答

0

你的问题由几个部分组成,让我逐一回答。

你是对的,替换jar文件不是一个好主意。你最好备份该文件(将其复制到backup目录中),而不是仅仅覆盖它。

如果你真的对启动时间和停机间隔感到好奇,有几个选项可供选择。首先,维护一个具有多个工作节点和代理的布局,该代理在它们之间分配传入请求。因此,您可以更新第一个节点,而当它离线时,所有请求都会转到第二个节点。然后您更新第二个节点,就可以了。但这需要您先获得一些运维技能。

第二个选项是执行热代码重新加载。简要地说,在生产服务器上公开一个nREPL端口。然后,您从Emacs或任何其他编辑器连接到它,打开一个更新的命名空间并按下C-c C-k,它会在远程机器上评估整个命名空间。结果,您可以在运行时更新代码,而无需重新启动机器。但请记住,重新加载后更改不会保存。

一个小提示,你最好使用Ansible自动化这个过程。它是一个工具,你可以在一个YAML文件中声明你的操作。结果将会是一组看起来简单易懂且易于维护的指令。Ansible在幕后考虑了很多事情。例如,当你尝试覆盖一个文件时,它可以自动创建备份。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接