2009-05-04 12 views
10

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 a medida que hago mi camino desde nodo a nodo.cómo elimino un nodo adicional

¿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 clúster crece, también debe contraerse. De lo contrario, Mnesia estará ocupada intentando enviar datos a nodos inexistentes que llenan las colas y mantienen la red ocupada.

[actualización final] después de verter a través del código fuente erlang/mnesia yo era capaz de determinar que no es posible disociar completamente nodos. Si bien del_table_copy elimina el enlace entre las tablas, está incompleto. Cerraría esta pregunta, pero ninguna de las descripciones más cercanas es adecuada.

+0

posibilidades de piratas informáticos Erlang que pasan aquí? bajo. Pero encontré la pregunta intrigante, y estoy mirando erlang y mnesia, así que cuando lo haya aprendido podría regresar en uno o dos años y dar una respuesta. gracias por la interesante publicación – Will

+0

bueno, hay 19 preguntas de mnesia, por lo que las probabilidades no son tan bajas. Cuanto más nicho de la pregunta, más tiempo tendrá que esperar para obtener una respuesta, eso es todo. –

+0

Es solo cuestión de tiempo antes de abrir el código y buscarlo solo. Tendré mucho tiempo la próxima semana cuando mi despido sea definitivo. – Richard

Respuesta

0

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

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

En general, mnesia gestiona correctamente la pérdida de nodos y detecta la unión de nodos (los nodos reiniciados obtienen nuevas copias de tablas de nodos que continuaron ejecutándose, los nodos que no se reiniciaron se detectaron como un evento de partición de red). Mnesia no consume CPU ni tráfico de red para los nodos que se han desactivado. Creo que, aunque no lo he confirmado en la fuente, mnesia no se volverá a conectar a los nodos que se han desconectado automáticamente: se espera que el nodo que se apaga 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 tener en cuenta para la administración del esquema en vivo.

El parámetro extra_db_nodes solo debe utilizarse 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.

+0

Estoy en la cerca con esta respuesta. Me gusta la información general, sin embargo, no es actual. Los tres métodos que menciona no están incluidos en la versión R13B. Una búsqueda del código R13A no reveló ningún método similar. – Richard

+0

Continuando mi búsqueda de la fuente, encontré alguna indicación de que hay una llamada a mnesia_controller: add_list/2 que se usa al agregar el nodo adicional. Hay un comentario que sugiere llamar a mnesia_recover: disconnect_nodes/1, sin embargo, ese método no existe en ningún lado y podría ser simplemente un error tipográfico; mnesia_recover: disconnect/1 existe. – Richard

+0

Dije delete_table_copy en lugar de copia del_table, pero aparte de eso, esos métodos están presentes, documentados y actualizados. No debería tener que desconectar los nodos manualmente - mnesia maneja la desconexión del nodo por sí mismo. Simplemente apague los nodos no deseados. O use net_kernel: disconnect/1 para hacerlo a la fuerza. – archaelus

1

Ciertamente he usado este método para realizar esto (apoyando el uso de mnesia: del_table_copy/2). Ver removeNode/1 siguiente:

-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

aunque este código puede haber parecido funcionar, no limpia todos los datos. del_table_copy no elimina el nodo de la lista extra_db_node.De hecho, no hay un código en la fuente que elimine completamente el nodo. – Richard

+0

Sí, tienes razón. Eliminé todo el código específico de mi aplicación para mayor claridad ... –

+0

El código fuente al que me refería está en la biblioteca de Mnesia. – Richard

2

Estoy muy tarde a la fiesta, pero encontré con esta información en el documento cuando se busca una solución al mismo problema:

"La llamada de función mnesia:.. del_table_copy (esquema, minodo @ host) elimina el nodo 'minodo @ host' del sistema Mnesia la llamada falla si mnesia se está ejecutando en 'minodo @ host' los otros nodos Mnesia nunca se van a tratar para conectarse nuevamente a ese nodo . N ote, si hay un disco esquema residente en el nodo 'mynode @ host', todo el directorio mnesia debe ser eliminado. Esto puede hacerse con mnesia: delete_schema/1. Si se inicia de nuevo mnesia en el nodo 'mynode @ host' y el directorio no se ha borrado, el comportamiento de de mnesia no está definido. " (http://www.erlang.org/doc/apps/mnesia/ Mnesia_chap5.html # id74278)

Creo que el siguiente podría hacer lo que desee:

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:is_member(Node,Nodes) of 
    true -> mnesia:del_table_copy(Table,Node); 
    false -> ok 
    end 
end, 

[RemoveTableCopy(Tbl,'[email protected]_host') || Tbl <- DataTables]. 

rpc:call('[email protected]_host',mnesia,stop,[]), 
rpc:call('[email protected]_host',mnesia,delete_schema,[SchemaDir]), 
RemoveTablecopy(schema,'[email protected]_host'). 

Aunque no he probado ya que mi situación es un poco diferente.

Cuestiones relacionadas