Frage

Ist es möglich, sich von einer Netzwerkpartition in einem MNEsie -Cluster zu erholen, ohne einen der beteiligten Knoten neu zu starten? Wenn ja, wie geht man damit?

Ich bin speziell daran interessiert zu wissen:

  • Wie kann dies mit der Standard -OTP -MNEsie (v4.4.7) gemacht werden
  • Welcher benutzerdefinierte Code, wenn jemand schreiben muss, um dies zu ermöglichen (z. B. Abonnieren von MNESIA Running_Paritioned_Network-Ereignissen, bestimmen Sie einen neuen Master, verschmelzen von Nicht-Master-Master-Lasttabelle aus dem neuen Master, Clear Running Parititioned Network Event- Beispielcode wäre sehr geschätzt).
  • Oder dass mnesia kategorisch keine Online-Wiederherstellung unterstützt und erfordert, dass die Knoten, die Teil der Nicht-Master-Partition sind, neu gestartet werden.

Während ich die Zeiger auf die allgemeine Theorie verteilter Systemtheorie schätze, interessiere ich mich in dieser Frage nur für Erlang/OTP MNEsia.

War es hilfreich?

Lösung

Nach einigen Experimenten habe ich Folgendes entdeckt:

  • MNEsia betrachtete das Netzwerk als Partition, wenn zwischen zwei Knoten eine Knoten -Trennung und eine Wiederverbindung ohne MNEsie -Neustart vorhanden ist.
  • Dies gilt auch dann, wenn während der Trennung keine MNEsie -Lese-/Schreibvorgänge auftreten.
  • Mnesia selbst muss neu gestartet werden, um das partitionierte Netzwerkereignis zu löschen - Sie können nicht force_load_table Nach der Verteilung des Netzwerks.
  • Nur MNEsie muss neu gestartet werden, um das netzwerk partitionierte Ereignis zu löschen. Sie müssen den gesamten Knoten nicht neu starten.
  • MNEsia löst die Netzwerkpartitionierung durch, indem der neu gesteuerte MNEsie -Knoten seine Tabellendaten mit Daten aus einem anderen MNEsie -Knoten (dem Lastalgorithmus für Startup -Tabellen) überschreibt.
  • Im Allgemeinen kopieren Knoten Tabellen aus dem Knoten, der am längsten gestiegen ist (dies war das Verhalten, das ich gesehen habe, ich habe nicht überprüft, ob dies explizit codiert und nicht eine Nebenwirkung von etwas anderem). Wenn Sie einen Knoten von einem Cluster trennen, Schreibvorgänge in beiden Partitionen (dem getrennten Knoten und seinen alten Kollegen) machen, alle Knoten herunterfahren und sie alle wieder starten Daten überschreiben alle anderen Knoten. Es gibt kein Tabellenvergleich/Überprüfungen/Quorum -Verhalten.

Um meine Frage zu beantworten, kann man durch Ausführung eine Semi -Online -Wiederherstellung durchführen mnesia:stop(), mnesia:start() Auf den Knoten in der Partition, deren Daten Sie entscheiden (was ich die Verlustpartition nennen werde). Ausführung der mnesia:start() Durch den Aufruf wird der Knoten die Knoten auf der anderen Seite der Partition kontaktiert. Wenn Sie mehr als einen Knoten in der Verlust -Partition haben, möchten Sie die Masterknoten für die Tabellenbelastung in die Knoten in der Gewinnspartition festlegen. Andernfalls denke ich, dass es eine Chance gibt, dass Tabellen aus einem anderen Knoten in der Verlustpartition und somit geladen werden. Kehren Sie zum partitionierten Netzwerkstaat zurück.

Leider bietet MNEsia während der Start -Tabellen -Lastphase keine Unterstützung für das Zusammenführen/Versand von Tabelleninhalten, und es sorgt auch nicht dafür, dass die Tabellenlastphase nach dem Start wieder in die Tabellenlastphase gelangt.

Eine Zusammenführungsphase wäre insbesondere für Ejabberd geeignet, da der Knoten weiterhin Benutzerverbindungen hat und somit weiß, für welche Benutzeraufzeichnungen er besitzt/die aktuellste sein sollte (unter der Annahme eines Benutzerverbots pro Cluster). Wenn eine Zusammenführungsphase vorhanden ist, könnte der Knoten UserData -Tabellen filtern, alle Datensätze für verbundene Benutzer speichern, Tabellen wie üblich laden und dann die gespeicherten Datensätze an den MNEsia -Cluster zurückschreiben.

Andere Tipps

Saras Antwort ist großartig, sogar einen Artikel darüber ansehen DECKEL. Mnesia -Entwickler opfern P für ca. Wenn Sie P benötigen, sollten Sie wählen, welche mit Cap Sie Opfer wünschen und als einen anderen Speicher wählen. Zum Beispiel Couchdb (Opfer c) oder Scalaris (Opfer a).

Es funktioniert so. Stellen Sie sich den Himmel voller Vögel vor. Machen Sie Fotos, bis Sie alle Vögel haben. Legen Sie die Bilder auf den Tisch. Karten Sie Bilder übereinander. Also siehst du jeden Vogel einmal. Segst du jeden Vogel? OK. Dann weißt du zu dieser Zeit. Das System war stabil. Notieren Sie, wie alle Vögel klingen (Nachrichten) und machen Sie weitere Bilder. Dann wiederholen.

Wenn Sie einen Knoten geteilt haben. Kehren Sie zum neuesten gemeinsamen Stall -Snapshot zurück. Und versuchen Sie ** nachzulegen, was danach angehängt ist. :)

Es wird besser in "Distributed Snapshots: Bestimmung globaler Zustände verteilter Systeme" beschrieben, K. Mani Chandy und Leslie Lamport

** Ich denke, es gibt ein Problem mit der Entscheidung, wer die Uhr verfolgt, wenn man versucht, das zu wiederholen, was passiert ist

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top