Docker上的Erlang / Elixir和热代码交换

时间:2016-03-23 08:54:17

标签: docker erlang elixir

Erlang(根据定义,Elixir)的一个特性是你可以进行热代码交换。但是,对于Docker来说,这似乎很奇怪,你需要停止你的实例并用新图像重新启动新实例。这基本上似乎是每个人都做的事情。

这就是说,我也知道可以使用一个隐藏节点通过网络将更新分发给所有其他节点。当然,就像这听起来像是在寻找麻烦,但是......

我的问题如下:有没有人尝试并取得了成功,为Erlang / Elixir设置了基于Docker的基础架构,允许热代码交换?如果是这样,那么做什么,不该做什么和不注意什么?

1 个答案:

答案 0 :(得分:25)

故事

想象一个处理移动电话或移动数据访问的系统(这就是Erlang的创建方式)。有一些网关服务器在呼叫期间维持用户会话,或者数据访问会话(我将其称为会话进程)。只要会话处于活动状态(用户已连接),那些服务器就具有会话的内存中表示。

现在还有另一个系统可以计算用户为呼叫或传输的数据收取多少费用(称之为PDF - Policy Decision Function)。两个系统的连接方式使网关服务器创建一些到PDF的TCP连接,如果这些TCP连接断开,它将丢弃用户会话。网关一次可以处理几十万个客户。每当存在用户需要收费的事件(下一次数据传输,另一分钟的呼叫)时,网关就该事实通知PDF并且PDF从用户帐户中减去特定数量的钱。当用户帐户为空时,PDF会通知网关断开呼叫(您已经没钱了,需要充值)。

您的问题

最后,让我们在这个背景下谈谈你的问题。我们想要升级PDF节点,节点正在Docker上运行。我们使用新版本的软件创建了一个新的Docker实例,但是我们无法关闭旧版本(在他们的通话过程中有成千上万的客户,我们无法断开它们)。但我们需要以某种方式将客户从旧PDF转移到新版本。因此,我们告诉网关节点使用更新的节点而不是旧的PDF创建任何新连接。客户可能很健谈,而且其中一些可能有长时间运行的数据连接(下载Windows 10 iso),因此整个操作需要2-3天才能完成。在发生严重错误的情况下,将一个版本的软件升级到另一个版本需要多长时间。可能有很多像这样的服务器,每个服务器处理数十万客户。

但是如果我们使用Erlang发布处理程序呢?我们使用新版本的软件创建relup文件。我们正确地测试它并部署到PDF节点。每个节点都就地升级 - 转换应用程序的内部状态,节点正在运行新版本的软件。但最重要的是,与网关服务器的TCP连接尚未被删除。因此,当我们升级系统时,客户会愉快地继续通话或下载最新的Windows ISO。一切都在10秒内完成,而不是2-3天。

答案

这是具有特定要求的特定系统的示例。 Docker和Erlang's Release Handling是正交技术。你可以使用其中之一或两者,一切归结为以下几点:

  • 要求
  • 费用

您是否有足够的资源以可预测的方式测试这两种方法,并有足够的耐心教授您的Ops团队,以便他们可以使用任何一种方法部署系统?如果测试设备花费数百万英镑(由于所需的硬件)并且一次只能使用这两种方法中的一种(因为测试周期需要数天)会怎样?

实用的方法可能是最初使用Docker部署节点,然后使用Erlang release handler升级它们(如果您首先需要使用Docker)。或者,如果您的系统在升级期间不需要可用(如示例PDF系统那样),您可能只选择始终使用Docker部署新版本而忘记版本处理。或者您可以坚持使用发布处理程序并忘记Docker,如果您需要即时快速可靠的更新,Docker将仅用于初始部署。我希望有所帮助。