ska*_*tek 6 erlang continuous-integration yaws high-availability erlang-otp
我一直在寻找有关部署和更新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 Heroku一样简单的做法?如果没有,在生产中连续重新部署和Erlang/OTP软件的最简单方法是什么?
我已经阅读了"Erlang/OTP in Action"一书来了解如何处理Erlang/OTP应用程序和发行版,在我看来,简单的软件升级并不那么容易.使用reltool时必须生成存档,将该存档移动到生产机器(scp?),在那里解压缩,运行Erlang shell并将新模块加载到Erlang VM中.
另外,"Learn You Some Erlang"一书中指出了以下内容:
"...如果你可以避免整个过程(从现在开始称为relup)并通过重新启动VM并启动新应用程序来进行简单的滚动升级,我建议你这样做."
和
"有人说爱立信的部门使用relups会花费尽可能多的时间测试它们,就像测试应用程序本身一样."
此外,这是另一个建议,以避免生产中的Erlang版本的热交换.
如果这是真的,那么我没有看到'Erlang热代码升级'的任何用处,因为我必须在每次升级时重启VM.这让我不知道在生产中定期部署Erlang/OTP新代码的强大且经过测试的方法.
PS关于我的软件要求的一些注释.
Erlang 代码热升级在两种情况下很有用:
当您有单个关键节点时,就无法停止。这可能是这种情况,当您在交换机或路由器上运行 Erlang 时,这对您的基础设施或在无人机上升级软件时至关重要,而无人机仍在飞行。
当您真的想保留运行节点的状态(并进行一些更改)时。以不需要这样做的方式设计系统通常比处理复杂的升级更容易。
最好避免热代码升级,因为它很难,但有时它是必要的。在那些时候,您将努力编写和测试升级。你会很高兴,它可以做到!
在您的情况下,您有一个没有状态的节点集群,因此最简单的升级方法是从集群中删除节点,在服务器上上传新版本,启动节点并将其添加回集群。如果您在节点之间配置了应用程序故障转移,那么使用scp. 在升级所有节点之前,先在 5% 的机器上测试新版本的代码,例如 20%,这也是一种很好的做法。
在某些情况下,您可以复制梁文件,转到 Erlang 控制台并键入:
code:purge(my_module), code:load_file(my_module).
Run Code Online (Sandbox Code Playgroud)
这不推荐用于日常工作,但是当您在远程机器上进行开发时,它可能会派上用场。例如,当您查找锁争用时,当您有 16 个或更多内核时,它们可能会出现。您可以每次都创建整个版本并上传,但这会减慢开发周期。这种使用热代码升级可能有点hacky,但是非常方便。
| 归档时间: |
|
| 查看次数: |
1004 次 |
| 最近记录: |