Введение в развертывание приложений Erlang/OTP

Я хотел бы разработать и развернуть приложение Erlang/OTP для создания на VPS.

Я хорошо знаком с разработкой кода Erlang на локальном компьютере, и мой вопрос касается развертывания.

В принципе, я хотел бы знать, какие шаги я должен предпринять, чтобы переместить код Erlang с локальной машины на производственный сервер и заставить его работать, то есть быть доступным для пользователей.

Примечание. Я прочитал некоторую документацию о Erlang и командной строке, Erlang code, Erlang релизы, но я до сих пор не уверен, как выполнить требуемую задачу.

Однако я полагаю, что развертывание программного обеспечения на сервере Erlang немного сложнее, чем выполнение sudo tasksel для LAMP.

Я планирую иметь приложение 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 script или что-нибудь еще?
  • Я знаю, что Erlang позволяет обновлять горячие коды, но как мне это организовать? В Rails я мог обновить код с помощью git, что-то подобное существует в мире Erlang?

Ответы

Ответ 1

Существует два типа зависимостей: внутренний и внешний. Если вы хотите сделать это правильно (tm), потребуется немного времени для работы:

Внешние зависимости:

Взяв последнее, внешняя зависимость - это еще одна вещь, которая должна выполняться до запуска вашего приложения. Например, база данных PostgreSQL или кластер Riak. Для тех, кто обычно использует обычный материал в Ubuntu для правильного запуска. У меня был хороший опыт использования monit для этих задач:

http://mmonit.com/monit/

Внутренние зависимости:

Для внутренних зависимостей вам необходимо организовать вашу программу в приложениях внутри виртуальной машины Erlang. Они имеют зависимости друг от друга, как и внешние зависимости. Например, вашему основному приложению может потребоваться запуск регистратора до его запуска. Затем вы создаете выпуск. Релиз копирует двоичные файлы Erlang и необходимые библиотеки/лучи/приложения в каталог выпуска, формируя автономную систему Erlang. Он содержит boot- script, который рассказывает, как запускать приложения в правильном порядке и поддерживать их работу. Таким образом, вы можете настроить этот выпуск, скопировать его на сервер и затем запустить. Здесь есть некоторые основы:

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

но также читайте главы перед ним в приложениях. Вы также можете получить rebar для вызова reltool, чтобы вы могли создать выпуск. Это то, что я обычно делаю.

Горячие обновления:

Обработка горячих обновлений в производстве может быть выполнена несколькими способами. Вы можете переместить луч на машину, а затем развернуть его, взять оболочку и затем вызвать l(Module), чтобы загрузить ее в запущенную систему. Это работает для небольших исправлений. Для больших систематических обновлений вы можете выполнить обновление выпуска, которое будет обновлять запущенную систему "на лету" без остановки обслуживания. Но если ваша система в основном не разделяет ничего, она обычно не стоит. Вместо этого вы можете иметь несколько машин и обновлять их последовательно.

Например, вы можете обновить машину, а затем использовать такую ​​систему, как HAProxy, для отправки 2% всех запросов в новую систему. Затем систематически установите вес нагрузки запроса.

Ответ 2

В то время как @I GIVE CRAP ANSWERS дал довольно подробное резюме, я вынужден отказаться от использования sync, что помогает автоматизировать горячую перекомпиляцию и перезагрузка модулей.

Простым способом является указание синхронизации в зависимости от типа арматуры, а затем, когда вы готовитесь к развертыванию обновления, вы можете запустить sync:go() в Erlang node. Это запустит механизм синхронизации, который следит за изменениями файловой системы. Затем вы можете использовать git для нажатия на ваш сервер. Sync увидит изменения файлов, перекомпилирует их и автоматически загрузит новые лучи.

Затем вы можете сразу запустить sync:stop(), чтобы сообщить системе прекратить просмотр изменений в файловой системе (обычно не рекомендуется поддерживать синхронизацию на реальном сервере, чтобы предотвратить случайную перекомпиляцию, если по какой-либо причине источник изменений файла и непреднамеренного.