Какой лучший способ запустить gen_server на всех узлах кластера Erlang? - PullRequest
11 голосов
/ 03 апреля 2011

Я создаю инструмент мониторинга в Эрланге .При запуске в кластере он должен запускать набор функций сбора данных на всех узлах и записывать эти данные с помощью RRD на одном узле «устройства записи».

В текущей версии на главном узле работает супервизор (rolf_node_sup), который пытается запустить 2-й супервизор на каждом узле в кластере (rolf_service_sup).Каждый из супервизоров на узле должен затем запускать и отслеживать группу процессов, которые отправляют сообщения обратно на gen_server на главном узле (rolf_recorder).

Это работает только локально.Супервизор не запущен ни на одном удаленном узле.Я использую следующий код , чтобы попытаться загрузить супервизор на узле с узла записывающего устройства:

rpc:call(Node, supervisor, start_child, [{global, rolf_node_sup}, [Services]])

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

Что такоенаиболее OTP способ реализовать мое требование, чтобы контролируемый код выполнялся на всех узлах кластера?

  • Распределенное приложение предлагается в качестве одной из альтернатив распределенному дереву супервизора.Это не подходит для моего варианта использования.Они обеспечивают аварийное переключение между узлами, но поддерживают выполнение кода на множестве узлов.
  • Модуль pool интересен.Тем не менее, он обеспечивает выполнение задания на узле, который в настоящее время наименее загружен, а не на всех узлах.
  • В качестве альтернативы, я мог бы создать набор контролируемых «прокси» процессов (по одному на узел) намастер, который использует proc_lib:spawn_link для запуска супервизора на каждом узле.Если что-то пойдет не так на узле, процесс прокси должен прерваться, а затем будет перезапущен своим супервизором, который, в свою очередь, должен перезапустить удаленные процессы.Модуль slave может быть очень полезен здесь.
  • Или, может быть, я слишком усложняю.Непосредственное наблюдение за узлами - плохая идея, вместо этого, возможно, мне следует разработать приложение для сбора данных в более слабосвязанной форме.Создайте кластер, запустив приложение на нескольких узлах, скажите, чтобы он был мастером, оставьте это при этом!

Некоторые требования:

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

Ответы [ 2 ]

4 голосов
/ 04 апреля 2011

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

Поскольку я понимаю вашу программу, вам нужен один главный узел, с которого вы запускаете свое приложение.Это запустит виртуальную машину Erlang на узлах в кластере.Модуль pool использует для этого модуль slave, для которого требуется ssh-связь на основе ключей в обоих направлениях.Также необходимо, чтобы у вас работали соответствующие днс.

Недостаток slave заключается в том, что, если мастер умирает, то же самое делают и рабы.Это сделано специально, поскольку, вероятно, оно идеально подходит к исходному сценарию использования, однако в вашем случае это может быть глупо (вы можете собирать данные, даже если мастер не работает, например)

Что касаетсяПриложения OTP, каждый узел может запускать одно и то же приложение.В своем коде вы можете определить роль узлов в кластере, используя конфигурацию или обнаружение.

Я бы предложил запустить виртуальную машину Erlang с использованием некоторого средства ОС или daemontools или подобного.Каждая виртуальная машина запускает одно и то же приложение, где один запускается как ведущий, а остальные - как ведомые.Это имеет недостаток, заключающийся в том, что труднее «автоматически» запускать программное обеспечение на компьютерах, входящих в кластер, как вы могли бы сделать с slave, однако это также намного более надежно.

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

Я бы также посоветовал всем узлам подтолкнуть к мастеру.Таким образом, мастеру на самом деле не нужно заботиться о том, что происходит в подчиненном устройстве, он может даже игнорировать тот факт, что узел не работает.Это также позволяет добавлять новые узлы без каких-либо изменений в мастер.Файл cookie может использоваться в качестве аутентификации.Несколько мастеров или «рекордеров» также были бы относительно простыми.

Однако «ведомые» узлы должны будут следить за тем, чтобы мастер вышел из строя и вышел из строя, и предпринять соответствующие действия, такие как сохранение данных мониторинга, чтобы они моглиотправьте его позже, когда мастер вернется.

3 голосов
/ 04 апреля 2011

Я бы посмотрел в riak_core.Он обеспечивает уровень инфраструктуры для управления распределенными приложениями поверх необработанных возможностей erlang и otp.В riak_core ни один узел не должен быть обозначен как главный.Ни один узел не является центральным в смысле otp, и любой узел может взять на себя другие отказавшие узлы.Это сама суть отказоустойчивости.Более того, riak_core обеспечивает элегантную обработку узлов, присоединяющихся и покидающих кластер, без необходимости прибегать к политике master / slave.

Хотя этот вид «топологической» децентрализации удобен, распределенным приложениям обычно нужны логически специальные узлы,По этой причине узлы riak_core могут объявлять, что они предоставляют конкретные кластерные услуги, например, в соответствии с вашим вариантом использования, узел сборщика результатов.

Еще одна интересная особенность / следствие архитектуры заключается в том, что riak_core предоставляет механизм для поддержания глобального состояния, видимого для членов кластера, через протокол «сплетен».

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

otoh, документации почти нет.: (

Вот парень, который говорит о внутреннем приложении AOL, которое он написал с помощью riak_core:

http://www.progski.net/blog/2011/aol_meet_riak.html

Вот примечание о шаблоне арматуры:

http://lists.basho.com/pipermail/riak-users_lists.basho.com/2011-March/003632.html

... и вот пост о развилке этого шаблона арматуры:

https://github.com/rzezeski/try-try-try/blob/7980784b2864df9208e7cd0cd30a8b7c0349f977/2011/riak-core-first-multinode/README.md

... talk on riak_core:

http://www.infoq.com/presentations/Riak-Core

... объявление riak_core:

http://blog.basho.com/2010/07/30/introducing-riak-core/

...