介绍 Erlang/OTP 生产应用程序部署



我想在VPS上开发Erlang/OTP应用程序并将其部署到生产中。

我非常熟悉在本地机器上开发 Erlang 代码,我的问题是关于部署的。

基本上,我想知道我应该采取哪些步骤才能将 Erlang 代码从本地机器移动到生产服务器并使其运行,即可供用户使用。

注意:我已经阅读了一些关于 Erlang 和命令行、Erlang 代码模块、Erlang 版本的文档,但我仍然不确定如何执行所需的任务。

但是,我想在服务器上部署基于 Erlang 的软件比为 LAMPsudo tasksel要棘手一些。

我计划有一个Erlang/OTP应用程序,其中包含Mochiweb,CouchDB(couchbeam)和boss_db作为依赖项。

因此,我关于在生产服务器上部署所有这些东西的新手问题如下:

  • 我计划使用 Ubuntu Server 12.04;Linux 发行版在生产环境中用于 Erlang/OTP 有更好的选择吗?
  • 应该如何组织所有代码?我应该把我的应用程序放到/home/myapp/dir 中,然后将所有依赖项放入/home/myapp/deps 中吗?或者我应该将所有依赖项放入/usr/local/lib/erlang/lib 中?(返回者代码:get_path())。我应该以某种方式定期更新依赖项还是应该冻结它们?
  • 服务器启动后,如何使整个应用程序启动?它应该是某种 bash 脚本还是其他任何东西?
  • 我知道 Erlang 允许热代码升级,但我应该如何组织呢?在 Rails 上,我可以用 git 更新代码,Erlang 世界中是否存在类似的东西?

有两种类型的依赖项:内部和外部。如果你想以正确的方式(tm)做,需要一点时间才能工作:

外部依赖关系:

首先采用后者,外部依赖项是应用程序运行之前必须运行的其他一些东西。例如,PostgreSQL数据库或Riak集群。对于这些,您通常只需使用 Ubuntu 中的常用内容即可使其正确启动。我在使用monit完成这些任务方面有很好的经验:

http://mmonit.com/monit/

内部依赖关系:

对于内部依赖项,您需要将程序排列到 Erlang VM 中的应用程序中。它们彼此依赖,就像外部依赖关系一样。例如,您的主应用程序可能需要运行记录器才能启动。然后创建发布发行版将 Erlang 二进制文件和必要的库/beam/应用程序复制到发布目录中,形成一个独立的 Erlang 系统。它包含一个引导脚本,该脚本告诉如何以正确的顺序启动应用程序并保持它们运行。因此,您可以对此版本进行压缩,将其复制到服务器,然后启动它。这里涵盖了一些基础知识:

http://learnyousomeerlang.com/release-is-the-word

但也请阅读前面关于应用程序的章节。您还可以让rebar调用reltool来构建发布。这是我通常做的事情。

热升级:

可以通过几种方式处理生产中的热升级。您可以将光束移动到机器上,然后部署它,获取外壳,然后调用l(Module)将其加载到正在运行的系统中。这适用于较小的修复。对于大型系统升级,您可以执行发布升级,这将在不停止服务的情况下即时升级正在运行的系统。但是,如果您的系统大部分时间都不共享,那么通常不值得。相反,您可以拥有多台计算机并按顺序升级它们。

例如,您可以升级一台机器,然后使用 HAProxy 等系统将所有请求的 2% 发送到新系统。然后系统地调高请求负载权重。

虽然@I给出了一个非常彻底的总结,但我觉得有必要使用同步,这有助于自动化模块的热重新编译和重新加载。

简单的方法是将 sync 指定为 rebar 依赖项,然后在准备部署升级时,可以在 Erlang 节点上运行sync:go()。 这将启动同步引擎,该引擎监视文件系统更改。 然后你可以使用 git 推送到你的服务器。同步会注意到文件的变化,重新编译它们,并自动加载新的光束。

然后,您可以立即运行sync:stop()告诉系统停止监视文件系统更改(通常不建议在实时服务器上保持同步运行,只是为了防止意外重新编译,无论出于何种原因,源文件更改并且是无意的。

相关内容

  • 没有找到相关文章

最新更新