Question

J'ai un groupe de nœuds erlang qui répliquent leurs données via "extra_db_nodes" de Mnesia ... J'ai besoin de mettre à niveau le matériel et les logiciels, de sorte que je dois détacher certains nœuds lorsque je me dirige d'un nœud à l'autre.

Comment supprime-t-on un nœud tout en conservant les données insérées?

[update] La suppression des nœuds est aussi importante que leur ajout. Au fil du temps, à mesure que votre cluster grandit, il doit également se contracter. Sinon, Mnesia va être occupé à essayer d'envoyer des données à des noeuds inexistants, remplissant les files d'attente et gardant le réseau occupé.

[ mise à jour finale ] après avoir analysé le code source erlang / mnesia, j'ai pu déterminer qu'il n'était pas possible de dissocier complètement les nœuds. Bien que del_table_copy supprime le lien entre les tables, il est incomplet. Je voudrais clore cette question, mais aucune des descriptions détaillées n’est adéquate.

Était-ce utile?

La solution

J'aurais aimé trouver cela il y a longtemps: http://weblambdazero.blogspot.com/2008/08/erlang-tips-and-tricks-mnesia.html

fondamentalement, avec un cluster qui fonctionne correctement ....

  • vous connecter au cluster à supprimer

  • arrêtez mnesia

    mnesia:stop().
    
  • vous connecter à un autre noeud du cluster

  • supprimer le schéma

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

Autres conseils

Je suis extrêmement en retard pour la fête, mais je suis tombé sur cette information dans le doc lorsque nous avons cherché une solution au même problème:

  

" L'appel de fonction   mnesia: del_table_copy (schéma,   mynode @ host) supprime le noeud   'mynode @ host' du système Mnesia.   L'appel échoue si mnesia est en cours d'exécution   'mynode @ host'. Les autres nœuds de mnesia   ne tentera jamais de se connecter à ce noeud   encore. Remarque, s'il y a un disque   schéma résident sur le noeud   'mynode @ host', toute la mnesia   le répertoire devrait être supprimé. Cela peut   être fait avec mnesia: delete_schema / 1.   Si on recommence la mnesia sur le la   noeud 'mynode @ host' et le répertoire   n'a pas été effacé, mnesia   le comportement n'est pas défini. "   ( http://www.erlang.org/doc/apps/mnesia /Mnesia_chap5.html#id74278 )

Je pense que ce qui suit pourrait faire ce que vous désirez:

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

Bien que je ne l'ai pas testé depuis mon scénario est légèrement différent.

J'ai certainement utilisé cette méthode pour cela (supportant l'utilisation de mnesia: del_table_copy / 2). Voir removeNode / 1 ci-dessous:

-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 vous avez répliqué la table (des copies de table ajoutées) sur des nœuds autres que celui que vous supprimez, tout va déjà bien - il suffit de supprimer le nœud.

Si vous souhaitez être légèrement plus ordonné, supprimez les copies de la table du nœud que vous êtes sur le point de supprimer en premier via mnesia: del_table_copy / 2 .

En règle générale, mnesia gère gracieusement la perte de noeuds et détecte le regroupement de noeuds (les noeuds redémarrés obtiennent de nouvelles copies de table à partir de noeuds qui continuent à s'exécuter, les noeuds qui ne redémarrent pas sont détectés en tant qu'événement de partition réseau). Mnesia ne consomme pas de trafic CPU ou réseau pour les nœuds en panne. Bien que je ne l'aie pas confirmé dans le code source, mnesia ne se reconnectera pas aux nœuds qui se sont éteints automatiquement. Le nœud qui tombe en panne doit redémarrer (mnesia) et se reconnecter.

mnesia: add_table_copy / 3 , mnesia: move_table_copy / 3 et mnesia: del_table_copy / 2 sont les fonctions à surveiller en direct gestion du schéma.

Le paramètre extra_db_nodes ne doit être utilisé que lors de l'initialisation d'un nouveau noeud de base de données. Dès qu'un nouveau noeud dispose d'une copie du schéma, il n'a plus besoin du paramètre extra_db_nodes .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top