Il failover automatico del database in c # non funziona quando il server principale passa fisicamente offline


9

Sto configurando il failover automatico del DB in C # con SQL Server 2008 e ho un 'alta sicurezza con il mirroring automatico di failover' usando un'impostazione di controllo e la mia stringa di connessione sembra

"Server=tcp:DC01; Failover Partner=tcp:DC02; database=dbname; uid=sewebsite;pwd=somerndpwd;Connect Timeout=10;Pooling=True;"

Durante il test, quando disattivo il servizio SQL Server sul server principale il failover automatico funziona come un incantesimo, ma se porto offline il server principale (spegnendo il server o uccidendo la scheda di rete) il failover automatico non funziona e il mio sito Web appena scaduto.

Ho trovato questo articolo in cui il secondo ultimo post suggerisce che è perché stiamo usando named pipe che non funzionano quando l'entità non è in linea, ma forziamo TCP nella nostra stringa di connessione.

Cosa mi manca per far funzionare questo failover automatico DB?


È necessario il tag [C #]? Non sembra essere specifico per C # in alcun modo.
Gabe,

Risposte:


6

Dopo aver lavorato con MS per una settimana, abbiamo capito perché questo accade.

Fondamentalmente, l'applicazione non esegue il failover perché deve essere sicuro che il database abbia eseguito il failover e che la connessione sql stia scadendo prima che la connessione abbia determinato che il db è stato sottoposto a failover.

Il processo per confermare il failover del database (con tutte le impostazioni predefinite del registro tcp) è di:

  1. prova a comunicare con il principale, vedi che non è più il principale
  2. comunicare con il failover per accertarsi che si sia verificato un failover e che ora sia il nuovo principal.

Quando il principale è inattivo, questa comunicazione impiega circa 21 secondi perché:

  1. prova a comunicare con il principale, attendi 3 secondi, timeout
  2. prova a comunicare di nuovo con il principale, attendi 6 secondi, timeout
  3. prova a comunicare di nuovo con il principale, attendi 12 secondi, timeout
  4. prova a comunicare con il partner di failover, verifica che sia stato eseguito il failover, quindi esegui il failover nell'applicazione.

Quindi, se la tua connessione sql non sta aspettando 21 secondi (probabilmente più nella realtà), allora andrà in timeout prima che finisca questa danza e non fallirà affatto.

La soluzione è impostare il timeout nella stringa di connessione su un valore elevato, utilizziamo 60 secondi solo per sicurezza.

Saluti


0

Mi chiedo se al momento dei test non sono soddisfatte le condizioni del failover automatico? In particolare - se il database non è sincronizzato con il mirror (controllare lo stato di mirroring da sys.database_mirroring) al momento dell'errore AND / OR se il testimone e il mirror non sono collegati in quel momento (test tramite ping tra i ruoli partecipanti).

Potresti anche avere una situazione in cui il tuo partner e il mirror non sono collegati tra loro - ma i database del partner e del mirror sono ancora connessi al testimone in modo indipendente. In tal caso il testimone non vede nulla di sbagliato (e quindi nessun failover). Ma hai detto di aver spento il server stesso, quindi sembra meno probabile.

O stai dicendo che il failover alla fine si verifica ma la tua riconnessione fallisce? In questo caso, il tempo di rilevamento e di failover varia in base al modo in cui il principale ha avuto esito negativo e al tempo totale di recupero del mirror db.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.