Frage

Ich habe Anwendungen geclustert, die einen der Knoten erfordert als Master werden. Die Clusterknoten werden in einer Tabelle verfolgt mit nodeID , iSMaster , Lasttimestamp Spalten.

Jeder Knoten im Cluster wird versuchen, einen Meister zu werden alle X Sekunden. Knoten kann nur ein Meister, wenn entweder

  • gibt es keinen anderen Master-Knoten
  • Lasttimestamp auf aktuellen Master-Knoten ist älter von 2 * X

Wenn eine der obigen Bedingungen erfüllt ist

  • das aktuelle Master-Knotens iSMaster sollte gelöscht werden
  • das neue Master-Knotens iSMaster sollte eingestellt werden
  • der neue Master-Knotens Lasttimestamp sollte auf 'jetzt' Zeitstempel gesetzt werden.

Was ist die einzige (portable) SQL-Anweisung, die oben ohne die Möglichkeit, zwei oder mehr Knoten immer der Meister?

zu erreichen
War es hilfreich?

Lösung

Ist das nicht diese Art der Koordination normalerweise durch die DBMS selbst behandelt, anstatt von Anwendungen, die auf dem DBMS laufen? Ich kann auch Möglichkeiten ins Auge fassen es in dem DBMS zu tun mit ich kenne, aber ohne mehr über Ihr System zu wissen (es vermutlich gemeinsam genutzten Festplatten verwendet, so dass alle Knoten sehen Sie die gleichen Daten, es vermutlich Protokolle sind Sperren, die den gleichzeitigen Zugriff verhindern auf die Daten, es ist ein Benutzer-Prozess auf dem Master-Knoten ist, der die Lasttimestamp) in regelmäßigen Abständen aktualisiert, wird es schwer zu helfen, viel sein. Und, wie Jamie Liebe wies darauf hin, sollten die DBMS mehrere Prozesse ermöglichen den Zugriff auf die entsprechenden Datensätze zu koordinieren -. Die wichtigsten relevanten Datensatz Datensatz der aktuelle Master zu sein

[ Edited . Vielleicht zu viel hinein Ich lese

Die einzige Anweisung UPDATE hat Differential-Updates auf zwei Zeilen der Tabelle zu tun, und muss scheitern, wenn nur einer der beiden Updates möglich ist. Das heißt, dass es sowohl die aktuelle Master-Nicht-Master sein, ändern und auch seinen eigenen Rekord ändern, so dass es der Master ist. Eine Frage ist, wie sich das DBMS erzwingen die Einschränkung ‚nur eine Zeile kann der Master sein.‘ Nehmen wir an, das funktioniert und die Aussage als Ganzes wird scheitern, wenn ein Problem gibt es - wie es sollte. Warum auslassen Menschen so oft die Tabellennamen, auch wenn sie die Spaltennamen zur Verfügung stellen? Na ja, der Name der Tabelle ist im Folgenden ClusterControl . Jeder Knoten muss seine eigene NodeID irgendwie wissen; Ich habe verwendet {MyNodeID}, um anzuzeigen, wo die in der SQL angezeigt wird.

Sie benötigen einen eigenen Herzschlag Update:

 UPDATE ClusterControl
     SET lastTimestamp = CURRENT_TIMESTAMP
     WHERE NodeID = {MyNodeID};

Der "ergreifen Master-Status" update könnte sein:

UPDATE ClusterControl
    SET lastTimestamp = (CASE
                         WHEN NodeID = {MyNodeID} THEN CURRENT_TIMESTAMP
                         ELSE lastTimestamp END),
        isMaster      = (CASE
                         WHEN NodeID = {MyNodeId} THEN 'Y'
                         ELSE 'N' END)
    WHERE (NodeID  = {MyNodeID} AND isMaster = 'N') OR
          (NodeID != {MyNodeID} AND
           lastTimestamp < CURRENT_TIMESTAMP - INTERVAL '120' SECOND AND
           isMaster = 'Y'
          );

Die Theorie hinter dem Update 'ergreifen Master-Status' ist (SET-Klausel):

  • das Feld Lasttimestamp für den neuen Master ist mit dem aktuellen Zeitstempel gesetzt, aber der alte Meister ist unverändert.
  • wird das iSMaster Feld auf ‚Y‘ für den neuen Master geändert und auf ‚N‘ für den Altmeister.

Die Theorie hinter der WHERE-Klausel lautet:

  • Nur den Datensatz für den aktuellen Knoten ändern, wenn es nicht der aktuelle Master oder der Datensatz für den aktuellen Master-Knoten ist, wenn dieser Knoten nicht der aktuelle Knoten und der Zeitstempel ist mehr als 120 Sekunden ( „2 * X“ in dem Frage) alt.

Da es ein (möglicherweise mythisches) ist constraint vorhanden, um sicherzustellen, dass nur eine Zeile, um den ‚Y‘ Flag hat, sollen diese nach Bedarf fehlschlagen, wenn der Master auf dem neuesten Stand.

Ungeprüfte SQL!

]

Andere Tipps

Ich kann eine Lösung für eine Oracle-Datenbank vorstellen, aber ich bin nicht sicher, ob es tragbar sein würde. Warum braucht dies eine einzige portable SQL-Anweisung zu sein? Die meisten Datenbanktabellensperren ermöglichen und Transaktionen, mit denen Sie diese Art der Sache in mehreren Anweisungen tun.

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