O failover automático do banco de dados em c # não funciona quando o servidor principal fica fisicamente off-line

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 o espelhamento de failover automático' usando uma configuração de testemunha e minha cadeia de conexão é semelhante a

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

Durante o teste, quando desativo o serviço do SQL Server no servidor principal, o failover automático funciona como um recurso, mas se eu desligar o servidor principal (desligando o servidor ou eliminando a placa de rede), o failover automático não trabalho e meu site apenas expira.

Eu encontrei este artigo onde o segundo o ú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 string de conexão.

O que estou perdendo para fazer esse failover do DB funcionar?

    
por user62521 20.03.2011 / 19:40

2 respostas

6

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

Essencialmente, o aplicativo não está falhando porque precisa ter certeza de que o banco de dados falhou - e a conexão sql está expirando antes que a conexão tenha determinado que o banco de dados falhou.

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

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

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

  1. tente se comunicar com o diretor, espere 3 segundos, tempo limite
  2. tente se comunicar com o diretor novamente, espere 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 foi reprovado e, por isso, faça failover no aplicativo.

Então, se sua conexão sql não estiver esperando por 21 segundos (provavelmente mais na realidade), o tempo limite será atingido antes de terminar essa dança e não haverá falha alguma.

A solução é definir o tempo limite na sua string de conexão como um valor alto. Usamos 60 segundos apenas para garantir a segurança.

Felicidades

    
por 28.03.2011 / 20:15
0

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

Você também pode ter uma situação em que seu Parceiro e Espelho não estejam conectados um ao outro, mas os bancos de dados de parceiros e espelhos ainda estão conectados à testemunha de forma independente. Nesse caso, a testemunha não vê nada de errado (e, portanto, nenhum failover). Mas você mencionou que você desligou o servidor, então 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 do tempo total para recuperar o db espelho.

    
por 21.03.2011 / 16:14