Pergunta

Eu tenho um grupo de nós Erlang que estão a replicar seus dados através de "extra_db_nodes" do mnesia ... Preciso fazer upgrade de hardware e software, por isso tenho de destacar alguns nós como eu fazer o meu caminho de nó em nó.

Como se remover um nó e ainda preservar os dados que foram inseridos?

[update] remoção de nós é tão importante como adicioná-los. tempo sobre como seu cluster cresce, ela também deve contrato. Se não, então Mnesia vai ser ocupado tentando enviar dados para nós inexistentes enchendo filas e manter a rede ocupada.

[ atualização final ] depois de derramar através do código fonte erlang / mnesia eu era capaz de determinar que não é possível para os nódulos completamente dissociar. Enquanto del_table_copy remove a ligação entre as tabelas é incompleta. Eu iria fechar esta pergunta, mas nenhuma das descrições estreitas são adequadas.

Foi útil?

Solução

Eu gostaria de ter encontrado esta há muito tempo: http://weblambdazero.blogspot.com/2008/08/erlang-tips-and-tricks-mnesia.html

basicamente, com um conjunto bom funcionamento ....

  • Acesso ao cluster para ser removido

  • parada mnesia

    mnesia:stop().
    
  • login para um nó diferente no cluster

  • excluir o esquema

    mnesia:del_table_copy(schema, node@host.domain).
    

Outras dicas

Estou extremamente atrasado para a festa, mas deparei com esta informação no doc ao procurar uma solução para o mesmo problema:

"A chamada de função mnesia: del_table_copy (esquema, mynode @ host) apaga o nó 'Mynode @ host' do sistema Mnesia. A chamada falha se mnesia está sendo executado em 'Mynode @ host'. Os outros nós mnesia nunca vai tentar se conectar a esse nó novamente. Note que, se houver um disco esquema residente no nó 'Mynode @ host', toda a mnesia diretório deve ser excluído. Isso pode ser feito com mnesia: delete_schema / 1. Se mnesia é iniciado novamente no a nó 'mynode @ host' eo diretório não tenha sido apagado, de mnesia comportamento é indefinido." ( http://www.erlang.org/doc/apps/mnesia /Mnesia_chap5.html#id74278 )

Eu acho o seguinte pode fazer o que você deseja:

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').

Embora, eu não testei isso desde o meu cenário é um pouco diferente.

Eu certamente utilizado este método para executar esta (apoiando o mnesia: del_table_copy / 2 uso). Veja removeNode / 1 abaixo:

-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().

Se você tiver replicado na tabela (cópias de tabelas adicionadas) em outros que o que você está removendo os nós, então você já está muito bem - basta remover o nó

.

Se você queria ser um pouco mais arrumado que você excluir as cópias de mesa a partir do nó que está prestes a remover primeira via mnesia:del_table_copy/2.

Geralmente, mnesia graciosamente lida com a perda de nó e voltar nó detecta (nós reiniciado obter novos tabela cópias de nós que continuou correndo, nós que não reinicialização são detectados como um evento de partição de rede). não Mnesia não consumir CPU ou tráfego de rede para nós que têm ido para baixo. Eu acho que, embora eu não tenha confirmado na fonte, mnesia não vai se reconectar com os nós que têm ido para baixo automaticamente -. O nó que se põe é esperado para reboot (mnesia) e reconecte

mnesia:add_table_copy/3, mnesia:move_table_copy/3 e mnesia:del_table_copy/2 são as funções que você deve olhar para a gestão do esquema ao vivo.

O parâmetro extra_db_nodes só deve ser usado quando inicializar um novo nó DB - uma vez que um novo nó possui uma cópia do esquema não precisa o parâmetro extra_db_nodes.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top