как удалить лишний узел - PullRequest
10 голосов
/ 04 мая 2009

У меня есть группа узлов erlang, которые реплицируют свои данные через "extra_db_nodes" Mnesia ... Мне нужно обновить аппаратное и программное обеспечение, чтобы мне приходилось отсоединять некоторые узлы, когда я пробиваюсь от узла к узлу.

Как удалить узел и сохранить данные, которые были вставлены?

[обновление] удаление узлов так же важно, как и их добавление. Со временем, когда ваш кластер растет, он также должен сокращаться. Если нет, то Mnesia будет занята попыткой отправки данных на несуществующие узлы, заполняя очереди и занимая сеть.

[ окончательное обновление ] после пролистывания исходного кода erlang / mnesia Мне удалось определить, что невозможно полностью разобщить узлы. Хотя del_table_copy удаляет связь между таблицами, она является неполной. Я бы закрыл этот вопрос, но ни одно из близких описаний не является адекватным.

Ответы [ 4 ]

6 голосов
/ 05 октября 2012

Хотел бы я найти это давным-давно: http://weblambdazero.blogspot.com/2008/08/erlang-tips-and-tricks-mnesia.html

в основном, с правильно работающим кластером ....

  • вход в кластер для удаления

  • Стоп Мнезия

    mnesia:stop().
    
  • вход в другой узел в кластере

  • удалить схему

    mnesia:del_table_copy(schema, node@host.domain).
    
3 голосов
/ 20 января 2011

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

"вызов функции Mnesia: del_table_copy (схема, mynode @ host) удаляет узел mynode @ host из системы Mnesia. Вызов не выполняется, если Mnesia работает 'MyNode @ хост. Другие мнезийные узлы никогда не будет пытаться подключиться к этому узлу снова. Обратите внимание, если есть диск резидентная схема на узле 'mynode @ host', вся мнезия Каталог должен быть удален. Это может покончить с мнезией: delete_schema / 1. Если мнезия начинается снова на узел "mynode @ host" и каталог не было очищено, мнезия поведение не определено. " (http://www.erlang.org/doc/apps/mnesia/Mnesia_chap5.html#id74278)

Я думаю, что следующее может делать то, что вы хотите:

AllTables = mnesia:system_info(tables),
DataTables = lists:filter(fun(Table) -> Table =/= schema end,
                          AllTables),

RemoveTableCopy = fun(Table,Node) ->
  Nodes = mnesia:table_info(Table,ram_copies) ++
          mnesia:table_info(Table,disc_copies) ++
          mnesia:table_info(Table,disc_only_copies),
  case lists:member(Node,Nodes) of
    true -> mnesia:del_table_copy(Table,Node);
    false -> ok
  end
end,

[RemoveTableCopy(Tbl,'gone@gone_host') || Tbl <- DataTables].

rpc:call('gone@gone_host',mnesia,stop,[]),
rpc:call('gone@gone_host',mnesia,delete_schema,[SchemaDir]),
RemoveTablecopy(schema,'gone@gone_host').

Хотя я не проверял это, поскольку мой сценарий немного отличается.

1 голос
/ 09 июня 2009

Я определенно использовал этот метод для выполнения этого (поддерживая использование mnesia: del_table_copy / 2). См. RemoveNode / 1 ниже:

-module(tool_bootstrap).

-export([bootstrapNewNode/1, closedownNode/0,
     finalBootstrap/0, removeNode/1]).

-include_lib("records.hrl").

-include_lib("stdlib/include/qlc.hrl").

bootstrapNewNode(Node) ->
    %% Make the given node part of the family and start the cloud on it
    mnesia:change_config(extra_db_nodes, [Node]),
    %% Now make the other node set things up
    rpc:call(Node, tool_bootstrap, finalBootstrap, []).

removeNode(Node) ->
    rpc:call(Node, tool_bootstrap, closedownNode, []),
    mnesia:del_table_copy(schema, Node).

finalBootstrap() ->
    %% Code removed to actually copy over my tables etc...
    application:start(cloud).

closedownNode() ->
    application:stop(cloud), mnesia:stop().
0 голосов
/ 04 июня 2009

Если вы реплицировали таблицу (добавили копии таблиц) на узлы, отличные от того, который вы удаляете, то вы уже в порядке - просто удалите узел.

Если вы хотите быть немного более аккуратным, удалите копии таблицы с узла, который вы собираетесь удалить сначала, с помощью mnesia:del_table_copy/2.

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

mnesia:add_table_copy/3, mnesia:move_table_copy/3 и mnesia:del_table_copy/2 - это функции, на которые следует обратить внимание при управлении живой схемой.

Параметр extra_db_nodes следует использовать только при инициализации нового узла БД - если у нового узла есть копия схемы, ему не нужен параметр extra_db_nodes.

...