2010-08-26 3 views
8

Ich führe zwei Erlang-Knoten mit einer replizierten MNS-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 angerufen 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 gut weiter 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?Welche Bedeutung hat ein Mnesia-Master-Knoten in einem Cluster?

%%% 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 scheitern, da Mnesia auf der anderen ist unten!

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.

Thanks again ...

Antwort

4

Mnesia Masterknoten werden verwendet, Split-Brain-Situationen in einem ziemlich brutalen Art und 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, laden sie bedingungslos Tabellen von den Master-Knoten.

Es gibt einen anderen Mechanismus in Mnesien, genannt force_load. 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.

+0

Danke user6834 –

+0

uwiger, danke. Denkst du (in der Zukunft), dass Mnesia eine Möglichkeit haben wird, zwei Replikate basierend auf einem kürzlichen Aktualisierungsmechanismus oder einer Art von Zeitsignaturen zu verbinden, insbesondere wenn der schwerwiegende Fehler "partitioniertes Netzwerk ausgeführt" erkannt wird? –

+1

Dies ist heute möglich, obwohl nicht in allen Teilen sehr gut dokumentiert oder getestet. http://github.com/esl/unsplit ist eine Bibliothek zum automatischen Zusammenführen von Mnesiatabellen nach Netsplits. Jüngste Mnesien-Versionen wurden sorgfältig erweitert, um dies zu unterstützen, und R14B03 fügt auch eine Form der Quorumprüfung ("Majorität") hinzu, um das Risiko von schwer zu lösenden Inkonsistenzen zu reduzieren. – uwiger