Ich führe zwei erlang-Knoten mit einer replizierten mnesia-Datenbank aus. Immer wenn ich versuchte, einen von ihnen zu starten, während MESIA NICHT auf dem anderen läuft, würde mnesia: wait_for_tables (? TABS,? TIMEOUT) an dem Knoten hängen, von dem es aufgerufen wurde. Ich muss eine Struktur haben, in der (wenn beide Knoten nicht laufen) ich anfangen kann, mit einem zu arbeiten, während der andere unten ist und sich später dafür entscheidet, den anderen oben zu bringen, noch weiter gut zu arbeiten. Ich muss sicher sein, dass der erste Knoten, der ausgeführt wurde, den letzten aktualisiert hat, wenn er aufsteht. Muss ich unbedingt einen als Meister haben?
%%% Bearbeitet ........................................... ................................
Oh, ich habe es. Die Datenbank, die ich benutzte, hatte ein paar fragmentierte Tabellen. Einige der Fragmente wurden zum Lastenausgleich über das Netzwerk verteilt. Also, Mnesia auf einem Host würde versuchen, sie über das Netzwerk zu laden und würde fehlschlagen, da Mnesia auf der anderen ist down!
Ich denke, das hat nichts mit einem Mnesia-Master-Knoten zu tun. Aber ich würde immer noch gerne die Bedeutung des gleichen verstehen, weil ich es vorher noch nicht benutzt habe, aber ich spiele immer mit verteilten Schemas.
Nochmals vielen Dank ...
Mnesia Master-Knoten werden verwendet, um Split-Brain-Situationen auf ziemlich brutale Weise zu lösen. Wenn Mnesie eine Split-Brain-Situation entdeckt, gibt es ein Ereignis aus, "partitioniertes Netzwerk ausführen". Eine Möglichkeit, darauf zu reagieren, wäre, Master-Knoten auf die "Insel" zu setzen, die Sie behalten möchten, und dann die anderen Knoten neu zu starten. Wenn sie wieder auftauchen, werden sie unbedingt Tabellen von den Master-Knoten laden.
Es gibt einen anderen Mechanismus in Mnesien, der force_load genannt wird. Man sollte sehr vorsichtig damit sein, aber in dem Fall, wo Sie zwei Knoten haben, A und B, beenden B (A loggt B als runter), dann beenden Sie A, dann starten Sie B neu, B wird keine Informationen darüber haben, wenn A untergegangen ist Sie können also keine Tabellen laden, die eine Kopie von A haben. Wenn Sie wissen, dass A nicht bald zurückkommt, können Sie mnesia: force_load_tables (Ts) auf B aufrufen, was dazu führt, dass es mit seinen eigenen Kopien läuft. Sobald A wieder auftaucht, erkennt es, dass B aktiv ist, und lädt Tabellen daraus. Wie Sie sehen, gibt es mehrere andere Szenarien, in denen Sie eine inkonsistente Datenbank haben können. Mnesia wird das nicht beheben, aber versucht, Werkzeuge zur Verfügung zu stellen, um die Situation zu lösen, falls sie auftritt. In dem obigen Szenario gibt Ihnen mnesia leider keine Hinweise, aber es ist möglich, eine Anwendung zu erstellen, die das Problem erkennt.