2016-05-23 3 views
4

Я пишу распределенное приложение mnesia и использую схему. Когда новый узел присоединяется к кластеру, он добавляется в схему Mnesia с помощью RPC вызов (от masternode который начал схему), которая выполняет следующие функции:Erlang: Как удалить узел из кластера Mnesia

start_Mnesia(MasterNode) -> 
    mnesia:start(), 
    mnesia:change_config(extra_db_nodes, [MasterNode]), 
    Tabs=mnesia:system_info(tables) -- [schema], 
    [mnesia:add_table_copy(Tab, node(), ram_copies) || Tab <- Tabs]. 

Когда узел аварии или разорвано, главный узел получает событие nodedown, и узел должен быть удален из кластера. Как я могу это достичь?

EDIT: Я получил следующее решение: TabList - это список всех таблиц в моей схеме, которые использует мой узел.

Mnesia: del_table_copy (TabList, узел)

+0

Почему вы хотите удалить этот узел? Когда он вернется, он снова присоединится к кластеру mnesia. – user425720

+0

Когда узел выходит из строя, запускается другой (резервный) узел и выполняет свою работу. Таким образом, мне нужен старый узел (который пошел вниз), чтобы покинуть кластер, и он должен быть настроен чистым, когда он снова присоединяется. (Тогда он будет резервным узлом до тех пор, пока другой узел не сработает) – muehsi

+0

у вас есть один ответ - так что я ничего не добавлю. Дело в том, что у меня сложилось впечатление, что вы можете злоупотреблять mnesia в этом случае. локальных таблиц будет недостаточно? Вам нужен кластер? – user425720

ответ

1

This should do what you want. Согласно документам:

del_table_copy (Tab, Node) -> {aborted, R} | {atomic, ok}

Удаляет реплику таблицы Tab в узле узла. Когда последняя реплика удаляется с помощью этой функции, таблица полностью исчезает.

Эта функция также может использоваться для удаления реплики таблицы с именем . Узел Mnesia затем удаляется. Обратите внимание, что Mnesia должна быть сначала остановлена ​​на узле.

+0

Я попробую это, спасибо заранее. – muehsi

Смежные вопросы