注意:这是关于类似主题的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 / OTP版本在几个Erlang节点上运行,这些节点充当高可用性(24/7)REST API,如何定期将新代码推送到该 生产环境 集群?有没有最好的做法来做那些像 git push heroku master
with Heroku一样简单的做法?如果没有,在 生产环境 中连续重新部署和Erlang / OTP软件的最简单方法是什么?
我已经阅读了'Erlang/OTP in Action'书来了解如何处理Erlang / OTP应用程序和发行版,在我看来,简单的软件升级并不那么容易 . 使用 reltool
时,您必须生成存档,将该存档移动到 生产环境 计算机( scp
?),在那里解压缩,运行Erlang shell并将新模块加载到Erlang VM中 .
此外,'Learn You Some Erlang'书states以下内容:
“...如果你可以避免整个过程(从现在开始称为relup)并通过重新启动VM并启动新应用程序来进行简单的滚动升级,我建议你这样做 . ”
和
“有人说爱立信的部门使用relups会花费尽可能多的时间测试它们,就像测试应用程序本身一样 . ”
另外,这里是another recommendation以避免在 生产环境 中为Erlang发布热插拔 .
如果这是真的,那么我没有看到'Erlang热代码升级'的任何用处,因为我必须在每次升级时重启VM . 这让我不知道在 生产环境 中定期部署Erlang / OTP新代码的强大且经过测试的方法 .
附:关于我的软件要求的一些注意事项 .
-
我正在编写一组没有任何会话的API入口点,因此在软件更新期间无需维护会话 .
-
没有必要分发Erlang / OTP版本,我正在使用内部定制产品 .
1 回答
Erlang热代码升级在两种情况下很有用:
当您有单个关键节点时,无法停止 . 当您在交换机或路由器上运行Erlang时,可能就是这种情况,这对您的基础架构或者upgrade software on drone, while it is still flying至关重要 .
当你真的想保留运行节点的状态(并做一些改动)时 . 与处理复杂的升级相比,通常更容易以这种方式设计系统,而不需要这样做 .
最好避免热代码升级,因为它很难,但有时它是必要的 . 在那些时候,您将努力编写和测试升级 . 你会很高兴,它可以完成!
在您的情况下,您有一个没有状态的节点集群,因此最简单的升级方法是从集群中删除节点,在服务器上上载新版本,启动节点并将其添加回集群 . 如果在节点之间配置application failovers,则使用
scp
可以很容易地编写脚本 . 在升级所有节点之前,首先在5%的计算机上测试新版本的代码,例如20%,这也是一种很好的做法 .在某些情况下,您可以复制梁文件,转到Erlang控制台并键入:
这不建议用于日常工作,但是当您在远程计算机上进行开发时,它可能会派上用场 . 例如,当您查找锁定争用时,如果您有16个或更多核心,它们可能会出现 . 您可以每次创建完整版本并上传它,但这会减慢开发周期 . 这种热代码升级的使用可能有点hacky,但它非常方便 .