Введение в развертывание приложений 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()
, чтобы сообщить системе прекратить просмотр изменений в файловой системе (обычно не рекомендуется поддерживать синхронизацию на реальном сервере, чтобы предотвратить случайную перекомпиляцию, если по какой-либо причине источник изменений файла и непреднамеренного.