Evitando tempos limite de DNS quando um servidor DNS falha

17

Temos um pequeno datacenter com cerca de cem hosts apontando para 3 servidores DNS internos (bind 9). Nosso problema ocorre quando um dos servidores DNS internos fica indisponível. Nesse ponto, todos os clientes que apontam para esse servidor começam a executar muito lentamente.

O problema parece ser que o resolvedor de estoque linux realmente não tem o conceito de "failover" para um servidor DNS diferente. Você pode ajustar o tempo limite e o número de tentativas que ele usa (e definir rodar para que funcione na lista), mas não importa quais configurações sejam usadas pelos nossos serviços, elas executam muito mais lentamente se um servidor DNS primário ficar indisponível. No momento, essa é uma das maiores fontes de interrupção de serviço para nós.

Minha resposta ideal seria algo como "RTFM: tweak /etc/resolv.conf assim ...", mas se essa é uma opção, não a vi.

Eu queria saber como outras pessoas lidaram com esse problema?

Eu posso ver três tipos possíveis de soluções:

  • Use linux-ha / pacemaker e ips de failover (para que os VIPs IP do DNS estejam "sempre" disponíveis). Infelizmente, não temos uma boa infraestrutura de esgrima, e sem o marcapasso de esgrima não funciona muito bem (na minha experiência, o Pacemaker reduz a disponibilidade sem esgrima).

  • Execute um servidor DNS local em cada nó e faça com que o resolv.conf aponte para localhost. Isso funcionaria, mas nos daria muito mais serviços para monitorar e gerenciar.

  • Execute um cache local em cada nó. As pessoas parecem considerar o nscd "quebrado", mas o dnrd parece ter o conjunto correto de recursos: marca os servidores DNS como ativo ou inativo e não usa servidores DNS "inativos".

Qualquer conversão parece funcionar apenas no nível de roteamento IP e depende das atualizações de rota para falha do servidor. A transmissão múltipla parecia ser uma resposta perfeita, mas o bind não suporta transmissão ou transmissão múltipla, e os documentos que pude encontrar parecem sugerir que o DNS multicast é mais voltado para a descoberta e configuração automática de serviços do que para a resolução regular de DNS .

Estou perdendo uma solução óbvia?

Neil Katin
fonte
2
Sugiro que, além de encontrar a solução que você está solicitando (com a qual não posso ajudá-lo), trabalhe no problema raiz real e corrija os problemas de confiabilidade no servidor DNS.
John Gardeniers
O principal problema é: por que esses servidores DNS são desativados com tanta frequência para fazer você se preocupar com isso? Considere replicar seu DNS com serviços especializados como o BuddyNS . Sua latência diminuirá drasticamente e o tempo de atividade não fará com que você se preocupe com os ajustes do /etc/resolv.conf.
Michele

Respostas:

15

Algumas opções. Ambos irão distribuir a carga do DNS entre seus servidores DNS.

  • Tente usar options rotateno resolv.conf. Isso minimizará o impacto do servidor primário estar inativo. Se um dos outros servidores estiver inativo, as ações serão mais lentas.
  • Use uma ordem de servidor de nomes diferente em clientes diferentes. Isso permitirá que alguns clientes sejam executados normalmente se o servidor DNS primário estiver inativo. Isso espalha o impacto de um servidor DNS fora de serviço.

Essas opções podem ser combinadas com options timeout:1 attempts:5. Aumente as tentativas se você diminuir o tempo limite para poder lidar com servidores externos lentos.

Dependendo da configuração do seu roteador, você poderá configurar os servidores DNS para assumir o endereço IP do servidor DNS primário quando estiver inativo. Isso pode ser combinado com as técnicas acima.

NOTA: Executo anos sem interrupções não programadas do DNS. Como outros observaram, eu trabalhava na solução dos problemas que causavam falhas nos servidores DNS. As etapas acima também ajudam com servidores DNS configurados incorretamente na especificação de servidores de nomes inacessíveis.

BillThor
fonte
4

Confira "man resolv.conf". Você pode adicionar uma opção de tempo limite ao resolv.conf. O padrão é 5, mas adicionar o seguinte ao resolv.conf deve reduzir para 1 segundo:

tempo limite das opções: 1

Niall Donegan
fonte
Após reler seu segundo parágrafo, tentei o acima em um VPS Centos e Debian. Depois de derrubar o DNS primário, o resolvedor executou exatamente como o esperado. Executando um tcpdump, eu podia até ver o resolvedor tentando o primeiro servidor e depois o seguinte. Que comportamento você está vendo?
Niall Donegan
1
Existem dois grandes casos de uso para resolver: processos de curta duração (como ferramentas de linha de comando) e processos de longa duração, e a mesma configuração do resolvedor deve funcionar para ambos. Para uma configuração de curta duração (consulta única), um curto tempo limite falha rapidamente. Mas se você estiver procurando um endereço externo que não resolva nesse período: você receberá um nome não encontrado, pois o resolvedor abandonará essa consulta se ela não voltar em um segundo. (fora da sala; mais no próximo comentário)
Neil Katin
Os processos de longo prazo tentarão novamente cada pesquisa, tempo limite e depois serão movidos para o próximo servidor. Mas não parece armazenar em cache a "morte" do servidor.
Neil Katin
3

Software de cluster, como batimentos cardíacos ou marcapasso / corosync, é seu amigo aqui. Como exemplo, configuramos o marcapasso / corosync da seguinte maneira:

  • Emparelhe cada servidor com outro
  • Por par tem 2 dns vips, geralmente um em cada
  • Se a ligação ou o servidor falhar, o vip será movido para o outro servidor em milissegundos

As horas de produção são 24x7, mas acreditamos firmemente que deve ser possível que todos os servidores falhem sem afetar os clientes. opção rodar é apenas uma solução alternativa, eu não faria isso.

Dennis Kaarsemaker
fonte
3

Execute um servidor DNS local em cada nó e faça com que o resolv.conf aponte para localhost. Isso funcionaria, mas nos daria muito mais serviços para monitorar e gerenciar.

FWIW, esta é a única solução viável que encontrei para esse problema. Você precisa restringir o servidor para escutar apenas no host local, mas ele eliminou completamente os usuários que notaram falhas no DNS em nosso ambiente.

Um efeito colateral interessante é que, se o servidor localhost for desativado por algum motivo, as bibliotecas de resolvedores padrão parecerão manipular o failover para o próximo servidor muito mais rapidamente do que no caso padrão.

Fazemos isso há cerca de 3 anos e não vi um único problema que possa estar relacionado à falha / indisponibilidade de um servidor DNS em execução no localhost.

Fred, o Cão Maravilha Mágico
fonte
2

Se um servidor de nomes estiver inativo para manutenção, é um procedimento normal reduzir antecipadamente os tempos limites no SOA para esse domínio, para que, quando a manutenção ocorra, as alterações sejam alteradas (como remover registros NS antes da manutenção e colocá-los novamente após a manutenção ) propagar rapidamente. Observe que essa é uma abordagem do lado do servidor - alterar os resolvedores é uma abordagem do cliente e ... a menos que você possa conversar com todos e cada um de seus clientes e levá-los a fazer esse ajuste na máquina ... pode não ser a abordagem correta. Bem, acho que você disse apenas uma centena de clientes em um data center usando servidores DNS internos, mas você realmente deseja alterar a configuração de uma centena de clientes quando pode apenas mudar a zona?

Eu dizia a você quais valores na SOA ajustar, mas estava navegando na Web para descobrir essas informações exatas quando deparei com essa pergunta.

Brenda J. Butler
fonte
3
Esta resposta refere-se apenas ao DNS autoritativo. A pergunta era sobre pesquisas DNS recursivas feitas pelo software cliente.
Andrew B
1

Talvez você possa colocar seus servidores DNS atrás de um balanceador de carga? Aparentemente, o LVS pode equilibrar o UDP. Obviamente, torne seu LB altamente disponível para que não seja um único ponto de falha.

rxvt
fonte
0

Sei que isso pode parecer trivial, mas que tal criar uma infraestrutura de DNS mais estável e resiliente como uma solução permanente para o problema.

joeqwerty
fonte
Temos uma infra-estrutura de DNS bastante resiliente. Mas 2 ou 3 vezes por ano, temos uma interrupção porque um servidor DNS fica inativo (ou é reiniciado, ou possui uma atualização do sistema operacional ou o que for).
Neil Katin
1
Bem ... reinicializações e atualizações devem ser agendadas para horas fora da produção. Quanto ao resto, parece que você está fazendo um grande negócio com algo que acontece algumas vezes por ano. A infra-estrutura adicional, tempo, dinheiro e despesas gerais de gerenciamento valem a pena por um problema que ocorre com uma aparência aparentemente pouco frequente?
joeqwerty
8
O que acontece quando o seu horário de produção é 24x7? O DNS deve falhar no segundo / terceiro / x servidor E armazenar em cache a falha do outro servidor por um período. O tempo limite padrão de 5 segundos é suficiente para interromper os serviços, dependendo da carga.
Ryaner 29/04
0

Uma solução mais centrada na rede seria usar dois servidores DNS com o mesmo roteamento IP (dedicado) e Anycast . (Eu não notei essa resposta neste tópico até agora, mas é isso que é usado aqui.)

Desde que ambos estejam ativos, o servidor mais próximo é usado. Se um cair, o tráfego para esse IP será roteado para o outro nó até que ele apareça novamente. Isso faz especialmente sentido se você tiver dois ou mais locais ou data centers.

Axel Beckert
fonte