Erlang / OTP持续部署简介

时间:2014-11-15 17:26:41

标签: erlang continuous-integration high-availability otp yaws

注意:这是我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中。

此外,“了解你一些Erlang”一书states以下内容:

“...如果您可以避免整个过程(从现在开始称为relup)并通过重新启动VM并启动新应用程序来进行简单的滚动升级,我建议您这样做。”

“据说,使用relups的爱立信部门花费的时间与测试应用程序本身一样多。”

此外,这里有another recommendation以避免在生产中为Erlang发布热插拔。

如果这是真的,那么我没有看到'Erlang热代码升级'的任何用处,因为我必须在每次升级时重启VM。这让我不知道在生产中定期部署Erlang / OTP新代码的强大且经过测试的方法。

P.S。关于我的软件要求的一些注意事项。

  • 我正在编写一组没有任何会话的API入口点,因此在软件更新期间无需维护会话。
  • 无需分发Erlang / OTP版本,我正在使用内部定制产品。

1 个答案:

答案 0 :(得分:4)

Erlang热门代码升级在两种情况下非常有用:

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

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

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

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

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

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

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