O failover automático do banco de dados no c # não funciona quando o servidor principal fica fisicamente offline

9

Estou configurando o failover automático de banco de dados em C # com o SQL Server 2008 e tenho uma 'alta segurança com espelho de failover automático' usando uma instalação de testemunha e minha cadeia de conexão se parece com

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

Durante o teste, quando eu desativo o serviço SQL Server no servidor principal, o failover automático funciona como um encanto, mas se eu colocar o servidor principal offline (desligando o servidor ou eliminando a placa de rede), o failover automático não funciona e meu site apenas atinge o tempo limite.

Encontrei este artigo em que o segundo último post sugere que é porque estamos usando pipes nomeados que não funcionam quando o principal fica offline, mas forçamos o TCP em nossa cadeia de conexão.

O que estou faltando para que esse failover automático de banco de dados funcione?

user62521
fonte
Isso precisa da tag [C #]? Não parece ser específico para C # de forma alguma.
Gabe

Respostas:

6

Depois de trabalhar com a MS por uma semana, descobrimos por que isso acontece.

Essencialmente, o aplicativo não está executando o failover porque precisa ter certeza de que o banco de dados falhou - e a conexão sql está atingindo o tempo limite antes que a conexão determine que o banco de dados falhou.

O processo para confirmar se o banco de dados falhou (com todas as configurações padrão do registro tcp) é:

  1. tente se comunicar com o diretor, veja que ele não é mais o diretor
  2. comunique-se com o failover para garantir que o failover esteja sendo o novo principal.

Quando o principal está inoperante, essa comunicação leva cerca de 21 segundos porque:

  1. tente se comunicar com o diretor, aguarde 3 segundos, tempo limite
  2. tente se comunicar com o diretor novamente, aguarde 6 segundos, tempo limite
  3. tente se comunicar com o diretor novamente, aguarde 12 segundos, tempo limite
  4. tente se comunicar com o parceiro de failover, verifique se ele falhou, então faça failover no aplicativo.

Portanto, se a sua conexão sql não estiver aguardando 21 segundos (provavelmente mais na realidade), o tempo limite será excedido antes de terminar esta dança e não sofrerá failover.

A solução é definir o tempo limite da sua cadeia de conexão para um valor grande; usamos 60 segundos apenas para garantir a segurança.

Felicidades

Trev
fonte
0

Gostaria de saber se as condições do failover automático não estão sendo atendidas no momento dos seus testes? Especificamente - se o banco de dados não estiver sincronizado com o espelho (verifique o estado de espelhamento de sys.database_mirroring) no momento da falha E / OU se a testemunha e o espelho não estiverem conectados naquele momento (teste por pings entre as funções participantes).

Você também pode ter uma situação em que seu Parceiro e o Espelho não estejam conectados, mas os bancos de dados do parceiro e do Espelho ainda estejam conectados à testemunha de forma independente. Nesse caso, a testemunha não vê nada de errado (e, portanto, nenhum failover). Mas você mencionou que desligou o servidor, portanto isso parece menos provável.

Ou você está dizendo que o failover eventualmente acontece, mas sua reconexão falha? Nesse caso, o tempo de detecção e failover varia dependendo de como o principal falhou e o tempo total para recuperar o banco de dados espelho.

Joe Sack
fonte