Я создаю инструмент мониторинга на Erlang . При запуске в кластере он должен запускать набор функций сбора данных на всех узлах и записывать эти данные с помощью RRD на одном узле «записывающего».
В текущей версии на главном узле запущен супервизор ( rolf_node_sup
), который пытается запустить 2-й супервизор на каждом узле в кластере ( rolf_service_sup
). Затем каждый из супервизоров на узле должен запустить и контролировать группу процессов, которые отправляют сообщения обратно на gen_server на главном узле ( rolf_recorder
).
Это работает только локально. Ни на одном удаленном узле не запускается супервизор. Я использую следующий код , чтобы попытаться загрузить супервизор на узле из узла записи:
rpc:call(Node, supervisor, start_child, [{global, rolf_node_sup}, [Services]])
Я нашел пару человек, предполагающих, что супервизоры действительно предназначены только для локальных процессов. Например,
Каков наиболее однозначный способ реализации моего требования иметь контролируемый код, работающий на всех узлах кластера?
proc_lib: spawn_link
для запуска супервизора на каждом узле. Если что-то пойдет не так на узле, процесс прокси должен умереть, а затем его супервизор перезапустит. что, в свою очередь, должно перезапустить удаленные процессы. Здесь может быть очень полезен подчиненный модуль. Некоторые требования: