Domanda

Ho installato due database Microsoft SQL 2005 in uno scenario di failover. Le stringhe di connessione dell'applicazione hanno il "Partner di failover" specificato nella stringa di connessione.

Quando il database attualmente attivo esegue il failover sul database slave, c'è un breve periodo di tempo in cui un utente può ottenere un SqlClient.SqlException con il messaggio "Una connessione esistente è stata forzatamente chiusa dall'host remoto".

Ciò è dovuto principalmente alla velocità con cui i database falliscono o c'è qualcos'altro che può essere fatto per prevenire questi errori?

È stato utile?

Soluzione

Hai ragione: ha a che fare con il tempo necessario al failover dei database.

La sequenza temporale del failover del mirroring sincrono è simile a questa:

  1. Il server primario A si spegne e chiude tutte le connessioni. Da questo punto in poi, qualsiasi client che tenta di connettersi al server A verrà chiuso forzatamente.
  2. Il server primario A si assicura che i suoi log siano completamente sincronizzati con il server secondario B.
  3. Viene avviato il servizio SQL del server B.
  4. Il servizio SQL del server B inizia ad accettare le connessioni e a quel punto i client possono riconnettersi.

Non importa quanto siano veloci i tuoi server, ci sarà un breve periodo (almeno un secondo) in cui le connessioni bombarderanno. Come ha detto Steven Lowe, devi intercettare quell'eccezione, attendere e riprovare. Tieni presente che sarà più complesso se l'app invia più query di seguito come parte di una transazione più ampia: la transazione potrebbe non riuscire.

Altri suggerimenti

avvertenza: l'opzione 'partner di failover' non era disponibile alcuni anni fa (o almeno non ne ero a conoscenza!) quindi la seguente soluzione potrebbe essere obsoleta

abbiamo dovuto intercettare le eccezioni di connessione persa (diversi gusti), attendere alcuni secondi e riprovare. Ciò ha reso necessario un wrapper per tutte le operazioni del database per automatizzare la logica di attesa e riprovare, che non ha richiesto molto lavoro e si è rivelata abbastanza conveniente; lo sforzo è consistito nell'esaminare i codici di errore e i tipi di eccezione e nel formulare una tabella decisionale sulla possibilità di riprovare in sicurezza o meno.

Ciò è dovuto al fatto che l'applicazione sta tentando di utilizzare una connessione esistente nel pool di connessioni. Solo dopo che si è verificato questo errore il pool di applicazioni viene cancellato e le nuove connessioni utilizzano la casella di failover.

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