2016-06-25 33 views
1

Ich habe eine verteilte Anwendung. In diesem startet ein Master-Knoten ein Mnesia-Schema mit 4 Tabellen. Einige von ihnen werden auf andere Knoten repliziert, andere nicht. Wenn ein Knoten spawnt, wird er am Master-Knoten registriert und dem Schema hinzugefügt, und die Daten werden auf diesen Knoten repliziert.Erlang sicherstellen Mnesia Schema-Replikation

Wie kann ich sicherstellen, dass meine Replikation abgeschlossen ist? Ich habe versucht, die folgenden:

Timeout=60000, 
TabList = [tab1, tab2, tab3, tab4], 
mnesia:wait_for_tables(TabList, Timeout). 

Es ist jedoch nicht 60 Sekunden dauert, nicht einmal 5 Sekunden, bis ich einen Fehler:

{{badmatch,{aborted,{no_exists,tab1}}} 

Offensichtlich funktioniert es nicht ..

Wenn ein neuer Knoten einem Cluster beitritt, führt ein RPC-Aufruf vom Master-Knoten die folgende Funktion auf dem neuen Knoten aus:

Wartet es auch, bis es auf ram_copies geschrieben wird?

Danke.

+0

Synchronisation und Replikation sind zwei verschiedene Dinge (die Replikation muss nicht mit irgend etwas synchronisiert werden, sondern kann auch asynchron sein). Interessiert es Sie wirklich, wenn die Replikation abgeschlossen ist? Oder interessiert Sie die Synchronisation aus Transaktionssicht (z. B. um DB-Transaktionen sicher durchzuführen)? – Michael

+0

Nun, mein Anwendungsfall ist eine verteilte Firewall. Wenn ein neuer Knoten dem Cluster beitritt, muss er wissen, welche Regeln gesetzt sind, um zu entscheiden, ob ein Paket bestehen kann oder nicht. Daher benötige ich zunächst alle Daten am neuen Knoten, bevor der Verkehr überprüft wird. – muehsi

+0

Wenn Ihr neuer Knoten dem Cluster beigetreten ist, kann er nicht auf die Daten in den Tabellen zugreifen, die Daten müssen nicht lokal kopiert werden. – Michael

Antwort

0

Wenn ein Knoten Ihrem mnesia-Cluster beitritt, ist er bereits synchronisiert, unabhängig davon, ob Kopien von Tabellen oder anderen Knoten vorhanden sind oder nicht.

Sie sollten sehen, dass ein neuer Knoten nach der Registrierung bei Ihrem Master und dem Hinzufügen zum Cluster bereits auf alle Ihre Tabellen zugreifen kann. Das Hinzufügen einer Kopie einer Tabelle ändert das nicht, unabhängig vom Status/der Stufe dieser Kopie.

Wenn Sie eine Kopie einer Tabelle auf Ihrem neuen Knoten hinzufügen, können Sie während und nach der Replikation weiterhin Transaktionen ausführen, und die Daten, die auf den von der Transaktion stammenden Knoten repliziert werden, haben keinen Einfluss auf die Korrektheit des Ergebnisses.

Also, wenn Sie nur mit der Synchronisation in Bezug auf die Einhaltung Ihrer Transaktionen ACID betroffen sind, dann mach dir keine Sorgen.

Wenn Sie besorgt sind, wenn Ihre Daten tatsächlich repliziert und sicher auf den anderen Knoten gespeichert werden, ist das eine andere Sache. In diesem Fall habe ich festgestellt, dass beim Ausführen mnesia:add_table_copy(Table, NewNode, disc_copies) blockiert und nur zurückgegeben, wenn NewNode die Daten in das Dateisystem kopiert hat.

Denken Sie daran, es sei denn, Sie mnesia:sync_transaction/3 die ganze Zeit ausführen, haben Sie keine Garantien über Daten tatsächlich auf einer CD, nachdem eine Transaktion trotzdem abgeschlossen ist.

+0

Ja, es geht um Replikation. Ich werde versuchen, wenn mnesia: add_table_copy (Tabelle, NewNode, ram_copies) auch funktioniert. Danke im Voraus. – muehsi