Pregunta

Tengo un grupo de nodos Erlang que están replicando sus datos a través de los "extra_db_nodes" de Mnesia. Necesito actualizar el hardware y el software, así que tengo que separar algunos nodos mientras me abro camino de nodo a nodo.

¿Cómo se elimina un nodo y aún se conservan los datos que se insertaron?

[actualizar] eliminar nodos es tan importante como agregarlos. Con el tiempo, a medida que su grupo crece, también debe contraerse. Si no, Mnesia estará ocupada intentando enviar datos a nodos inexistentes, llenando las colas y manteniendo la red ocupada.

[ actualización final ] después de verter el código fuente de erlang / mnesia, pude determinar que no es posible desasociar completamente los nodos. Mientras que del_table_copy elimina el enlace entre las tablas, está incompleto. Cerraré esta pregunta pero ninguna de las descripciones cercanas es adecuada.

¿Fue útil?

Solución

Ojalá lo hubiera encontrado hace mucho tiempo: http://weblambdazero.blogspot.com/2008/08/erlang-tips-and-tricks-mnesia.html

básicamente, con un clúster que funcione correctamente ....

  • inicie sesión en el clúster que se eliminará

  • deja de mnesia

    mnesia:stop().
    
  • inicie sesión en un nodo diferente en el clúster

  • eliminar el esquema

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

Otros consejos

Llegué tarde a la fiesta, pero encontré esta información en el documento cuando buscaba una solución para el mismo problema:

  

" La llamada de función   mnesia: del_table_copy (esquema,   mynode @ host) borra el nodo   'mynode @ host' del sistema Mnesia.   La llamada falla si mnesia se está ejecutando en   'mynode @ host'. Los otros nodos mnesia.   nunca intentará conectarse a ese nodo   otra vez. Nota, si hay un disco   esquema residente en el nodo   'mynode @ host', toda la mnesia   directorio debe ser eliminado. Esto puede   hacerse con mnesia: delete_schema / 1.   Si mnesia se inicia de nuevo en el   nodo 'mynode @ host' y el directorio   no ha sido autorizado, mnesia   el comportamiento no está definido. "   ( http://www.erlang.org/doc/apps/mnesia /Mnesia_chap5.html#id74278 )

Creo que lo siguiente podría hacer lo que desees:

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

Sin embargo, no lo he probado ya que mi escenario es ligeramente diferente.

Ciertamente, he usado este método para realizar esto (compatible con mnesia: del_table_copy / 2 use). Vea removeNode / 1 abajo:

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

Si ha replicado la tabla (copias de tabla agregadas) en nodos que no sea el que está eliminando, entonces ya está bien, simplemente elimine el nodo.

Si quisiera estar un poco más ordenado, eliminaría las copias de la tabla del nodo que está a punto de eliminar primero a través de mnesia: del_table_copy / 2 .

En general, mnesia maneja con gracia la pérdida de nodos y detecta la reincorporación de nodos (los nodos reiniciados obtienen nuevas copias de tablas de los nodos que siguieron ejecutándose, los nodos que no se reiniciaron se detectan como un evento de partición de red). Mnesia no consume CPU ni tráfico de red para los nodos que han caído. Creo que, aunque no lo he confirmado en la fuente, mnesia no se volverá a conectar a los nodos que se han caído automáticamente; se espera que el nodo que se cae se reinicie (mnesia) y se vuelva a conectar.

mnesia: add_table_copy / 3 , mnesia: move_table_copy / 3 y mnesia: del_table_copy / 2 son las funciones que debe buscar en vivo gestión de esquemas.

El parámetro extra_db_nodes solo debe usarse al inicializar un nuevo nodo DB: una vez que un nuevo nodo tiene una copia del esquema, no necesita el parámetro extra_db_nodes .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top