Domanda

Ho applicazioni in cluster che richiedono che uno dei nodi sia designato come master. I nodi del cluster sono tracciati in una tabella con le colonne nodeID , isMaster , lastTimestamp .

Ogni nodo nel cluster proverà a diventare un master ogni X secondi. Il nodo può diventare un maestro solo se

  • non ci sono altri nodi master
  • il lastTimestamp sul nodo master corrente è più vecchio di 2*X

Quando una delle condizioni di cui sopra è soddisfatta

  • isMaster dell'attuale nodo principale deve essere cancellato
  • isMaster del nuovo nodo principale deve essere impostato
  • il lastTimestamp del nuovo nodo principale deve essere impostato sul timestamp "adesso".

Che cos'è l'istruzione singola (portatile) per ottenere quanto sopra senza la possibilità che due o più nodi diventino il master?

È stato utile?

Soluzione

Questo tipo di coordinamento non è normalmente gestito dal DBMS stesso, piuttosto che dalle applicazioni in esecuzione sul DBMS? Anch'io posso immaginare modi per farlo nel DBMS che conosco, ma senza sapere di più sul tuo sistema (presumibilmente utilizza dischi condivisi, quindi tutti i nodi vedono gli stessi dati; ci sono presumibilmente protocolli di blocco che impediscono l'accesso simultaneo ai dati; è un processo utente sul nodo principale che aggiorna periodicamente lastTimestamp), sarà difficile aiutare molto. E, come ha sottolineato Jamie Love, il DBMS dovrebbe consentire a più processi di coordinare l'accesso ai record pertinenti, il record principale rilevante è l'attuale record principale.

[ Modificato : forse stavo leggendo troppo in esso.

La singola istruzione UPDATE deve eseguire aggiornamenti differenziali su due righe della tabella e deve fallire se è possibile solo uno dei due aggiornamenti. Cioè, deve sia modificare il master corrente in modo che non sia master, sia cambiare il proprio record in modo che sia il master. Un problema è come il DBMS impone il vincolo "solo una riga può essere il master". Supponiamo che funzioni e la dichiarazione nel suo insieme fallirà se c'è un problema - come dovrebbe. Perché le persone omettono così spesso il nome della tabella, anche quando forniscono i nomi delle colonne? Vabbè, il nome della tabella è di seguito ClusterControl . Ogni nodo deve conoscere il proprio NodeID in qualche modo; Ho usato {MyNodeID} per indicare dove appare nell'SQL.

È necessario un aggiornamento separato dell'heartbeat:

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

Il "cogliere lo stato principale" l'aggiornamento potrebbe essere:

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'
          );

La teoria alla base dell'aggiornamento "cogliere lo stato principale" è (clausola SET):

  • il campo lastTimestamp per il nuovo master è impostato sul timestamp corrente, ma il vecchio master rimane invariato.
  • il campo isMaster viene modificato in 'Y' per il nuovo master e in 'N' per il vecchio master.

La teoria alla base della clausola WHERE è:

  • Modifica il record per il nodo corrente solo se non è il master corrente o il record per il nodo master corrente quando questo nodo non è il nodo corrente e il timestamp è superiore a 120 secondi (" 2 * X " in la domanda) vecchia.

Poiché esiste un vincolo (forse mitico) in atto per garantire che solo una riga abbia il flag "Y", ciò dovrebbe fallire come richiesto quando il master è aggiornato.

SQL non testato!

]

Altri suggerimenti

Posso immaginare una soluzione per un database Oracle ma non sono sicuro che sia portatile. Perché deve essere una singola istruzione SQL portatile? La maggior parte dei database consente il blocco delle tabelle e le transazioni, che consentono di eseguire questo tipo di operazioni in più istruzioni.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top