Erlang/OTP持续部署简介

Posted

技术标签:

【中文标题】Erlang/OTP持续部署简介【英文标题】:Introduction to Erlang/OTP continuous deployment 【发布时间】:2015-01-12 22:36:16 【问题描述】:

注意:这是我的 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 masterwith 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%。

有些情况,你可以复制beam文件,到Erlang控制台输入:

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

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

【讨论】:

感谢您解释真正需要热升级的情况!您能否详细说明“...在服务器上上传新版本,启动节点...”?这在业界是如何做到的?哪些工具用于自动上传和启动新版本?另外,当您提到“节点之间的应用程序故障转移”时,您是指任何 Erlang 功能吗? 在我写关于应用程序故障转移的文章时,我已经在我的回答中添加了链接。为了使发布更容易,您可以使用 rebar、relx 或 erlang.mk(在内部使用 relx)。然后我们通常使用普通的旧 scp 将发布复制到服务器(只用 bash 脚本包装它)。有一个非常酷的商业工具叫 Wombat,主要用于监控,但具有编排功能。您通过网络界面上传新版本,它可以将其部署到指定的ips或云提供商(再次:“部署”意味着停止运行节点,上传并解压新版本,重新启动节点) 所以,基本上我的问题的答案是“使用 rebar 生成发布 > 停止 Erlang/OTP 节点,它是 Erlang 集群的一部分 > scp 发布到节点 > 再次启动节点 > 加入它到集群”

以上是关于Erlang/OTP持续部署简介的主要内容,如果未能解决你的问题,请参考以下文章

持续集成部署工具jenkins简介

CICD:持续集成持续交付持续部署

2022,你的团队距离持续部署还有多远?

RabbitMQ Linux: 单机和集群部署

部署:持续集成(CI)与持续交付(CD)——《微服务设计》读书笔记

吕健|Microservices 场景下的持续部署