注意:这是我的previous question在类似主题上的进化延续。
我一直在寻找有关部署和更新Erlang/OTP版本(一组应用程序)的“最佳实践”,但是我找不到任何直接的解决方案描述,而仅找到一些“相关信息”:
http://blog.equanimity.nl/blog/2013/06/04/continuous-integration-for-erlang-with-travis-ci/
https://www.youtube.com/watch?v=G0eBDWigORY
https://www.youtube.com/watch?v=0ZGHzI9F5YE
我所说的“直接解决方案”是对以下问题的答案:
给定一个生产Erlang/OTP集群,并在多个Erlang节点上运行一个Erlang/OTP版本,这些节点充当高可用性(24/7)REST API,那么如何定期将新代码推送到该生产集群?有没有像git push heroku master
with Heroku这样简单的最佳实践呢?如果不是,在生产中连续重新部署和Erlang/OTP软件的最简单方法是什么?
我已经阅读了《 Erlang/OTP实际应用》一书,以了解如何处理Erlang/OTP应用程序和发行版,在我看来,简单的软件升级并不那么容易。使用reltool
时,您必须生成一个存档,将该存档移至生产机器(scp
?),在其中解压缩,运行Erlang Shell并将新模块加载到Erlang VM中。
此外,“学习一些Erlang”这本书的states内容如下:
“...如果您可以避免整个过程(从现在开始将称为relup),并通过重新启动VM和引导新应用程序进行简单的滚动升级,我建议您这样做。”
和
“据说,爱立信的那些确实使用relup的部门花费了大量的时间来测试它们,就像他们自己测试其应用程序一样。”
另外,这里是another recommendation以避免在生产环境中热交换Erlang的发行版。
如果是这样,那么我看不到“Erlang热代码升级”的任何用处,因为每次升级我都必须重新启动VM。这使我完全不了解在生产环境中定期部署用于Erlang/OTP的新代码的可靠且经过测试的方法。
P.S.关于我的软件要求的一些注意事项。
最佳答案
Erlang热代码升级在两种情况下很有用:
最好避免热代码升级,因为这很困难,但有时是必需的。在那时,您将努力编写和测试升级。您将很高兴,它完全可以完成!
在您的情况下,您有一个无状态的节点集群,因此最简单的升级方法是从集群中删除该节点,在服务器上上传新发行版,启动该节点,然后将其重新添加到集群中。如果您在节点之间配置了application failovers,那么使用
scp
编写脚本应该很容易。最好在升级所有节点之前先在5%的机器上测试新版本的代码,例如在20%的机器上测试新版本的代码。在某些情况下,您可以复制梁文件,转到Erlang控制台并键入:
code:purge(my_module), code:load_file(my_module).
不建议每天进行此操作,但是当您在远程计算机上进行开发时,它可能会派上用场。例如,当您寻找锁争用时,当您拥有16个或更多核心时,它们可能会出现。您可以每次创建整个发行版并上载它,但这会减慢开发周期。这种使用热代码升级的方法可能有点笨拙,但是非常方便。
关于erlang - Erlang/OTP持续部署简介,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26948582/