2015-06-16 3 views
6

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

Что я хочу:

Приложение является myapp_api с REST API, он имеет myapp применение в качестве зависимости. Я хочу начать myapp_api на 3 узлах, я хочу, чтобы все приложение (myapp_api + myapp) работало только на одном узле одновременно.

Что не так:

Основное приложение (myapp_api) работает, как ожидалось: только в одном узле с аварийного переключения и поглощения. Но по какой-то причине зависело myapp всегда начинается на каждом узле. Я хочу, чтобы он работал только на одном узле одновременно.

Что я делаю:

Мой конфиг для первого узла в качестве примера.

[ 
    {kernel, 
    [{distributed, [{myapp_api, 
     1000, 
     ['[email protected]', {'[email protected]', '[email protected]'}]}]}, 
     {sync_nodes_optional, ['[email protected]', '[email protected]']}, 
     {sync_nodes_timeout, 5000} 
    ]} 
]. 

Я называю erl -sname nI -config nI.config -pa apps/*/ebin deps/*/ebin -s myapp_api на каждом узле.

ответ

4

Теперь это становится немного запутанным, потому что вы говорите:

Я хочу начать myapp_api на 3 узлах, я хочу все приложения (myapp_api + MYAPP) будет работать только на одном узле одновременно ,

и добавить:

Основное приложение (myapp_api) работает, как ожидалось: только в одном узле с аварийного переключения и поглощения. Но по какой-то причине зависимость от myapp всегда начиналась с каждого узла.

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

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

Файл конфигурации используется показывает, что происходит:

[{kernel, 
    [{distributed, [{myapp_api, 
    1000, 
    ['[email protected]', {'[email protected]', '[email protected]'}]}]}, 
    {sync_nodes_optional, ['[email protected]', '[email protected]']}, 
    {sync_nodes_timeout, 5000} 
]}]. 

Важным является то, что немного myapp_api имеет узлы ['[email protected]', {'[email protected]', '[email protected]'}] определены. Этот порядок означает, что он работает на [email protected] в верхнем приоритете, а затем на других узлах с равным приоритетом, если есть переход на другой ресурс.

Дело в том, что ни одна из зависимостей не распространяется одинаково, и поэтому их можно ожидать повсюду.

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

[{kernel, 
    [{distributed, [ 
    {myapp_api, 1000, ['[email protected]', {'[email protected]', '[email protected]'}]}, 
    {myapp, 1000, ['[email protected]', {'[email protected]', '[email protected]'}]}, 
    ]}, 
    {sync_nodes_optional, ['[email protected]', '[email protected]']}, 
    {sync_nodes_timeout, 5000} 
]}]. 

Я не проверял это напрямую, но я уверен, что это будет работать.

Если то, что вы хотели было для myapp_api быть везде, но для myapp работать в одном месте, вы можете использовать global registration, дать имя публичной стороне процесса myapp «s, получить myapp_api называть их. myapp_api затем иметь возможность маршрутизировать трафик туда, где myapp будет, если поддерживается с помощью следующей конфигурации:

[{kernel, 
    [{distributed, [ 
    {myapp, 1000, ['[email protected]', {'[email protected]', '[email protected]'}]}, 
    ]}, 
    {sync_nodes_optional, ['[email protected]', '[email protected]']}, 
    {sync_nodes_timeout, 5000} 
]}]. 

(Посмотрите, как myapp является единственным приложением получить профиль распределения Другие приложения получат работать на всех узлах?)

+0

Да, спасибо, вы все поняли, я хотел, чтобы вся настройка была отказом. И да, добавление myapp в распределенную конфигурацию также работало. Для меня это странно, что я должен был сделать это вручную. – user2461860

+0

Это просто странно, если у вас простые настройки. У вас могут быть неоднородные кластеры, где приложения A и C необходимо запускать на узлах 1,2,3,4, а затем приложение B, которое может работать только на узлах 4 и 5 по соображениям аппаратного или ОС. С различными стратегиями для разных приложений более гибкий подход, подобный приведенному выше, имеет смысл. –