首页 文章

Erlang / OTP持续部署简介

提问于
浏览
5

注意:这是关于类似主题的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 回答

  • 4

    Erlang热代码升级在两种情况下很有用:

    • 当您有单个关键节点时,无法停止 . 当您在交换机或路由器上运行Erlang时,可能就是这种情况,这对您的基础架构或者upgrade software on drone, while it is still flying至关重要 .

    • 当你真的想保留运行节点的状态(并做一些改动)时 . 与处理复杂的升级相比,通常更容易以这种方式设计系统,而不需要这样做 .

    最好避免热代码升级,因为它很难,但有时它是必要的 . 在那些时候,您将努力编写和测试升级 . 你会很高兴,它可以完成!

    在您的情况下,您有一个没有状态的节点集群,因此最简单的升级方法是从集群中删除节点,在服务器上上载新版本,启动节点并将其添加回集群 . 如果在节点之间配置application failovers,则使用 scp 可以很容易地编写脚本 . 在升级所有节点之前,首先在5%的计算机上测试新版本的代码,例如20%,这也是一种很好的做法 .

    在某些情况下,您可以复制梁文件,转到Erlang控制台并键入:

    code:purge(my_module), code:load_file(my_module).
    

    这不建议用于日常工作,但是当您在远程计算机上进行开发时,它可能会派上用场 . 例如,当您查找锁定争用时,如果您有16个或更多核心,它们可能会出现 . 您可以每次创建完整版本并上传它,但这会减慢开发周期 . 这种热代码升级的使用可能有点hacky,但它非常方便 .

相关问题