Atribuir vários IPs a 1 entrada no arquivo hosts

29

Eu tenho um servidor da web que se conecta a um banco de dados interno por meio de uma VPN. Existem 2 IPs (primário e secundário) no banco de dados do servidor da web. Como posso configurar meu arquivo / etc / hosts para que, se o IP primário não estiver disponível, o IP secundário seja usado?

Isso funcionaria para o meu arquivo hosts?

141.131.286.1   abc.efg.datastore.com   #primary

141.131.286.237 abc.efg.datastore.com   #secondary
Mike T
fonte

Respostas:

26

O arquivo hosts não fornece esse mecanismo. Se você listar dois IPs para o mesmo nome, somente o primeiro será usado. Portanto, não existem IPs primário e secundário.

Além disso, o arquivo hosts não manipula URLs. Ele apenas lida com nomes como os fornecidos na pergunta. Uma URL contém caminho completo e protocolo como http://host/path/to/resource.

Khaled
fonte
Título e nomeação editados na pergunta dos OPs para eliminar a confusão sobre URLs / hosts.
precisa saber é
14

Você não pode fornecer resiliência ou balanceamento de carga round robin por meio do /etc/hostsarquivo - ele não foi projetado para esse fim.

Em vez disso , suas opções são ... (em nenhuma ordem específica)

  1. Configure sua rede corretamente, para que as rotas mudem quando um link é descartado
  2. Use o balanceamento de carga round-robin DNS (não o A Good Idea TM ) usando um serviço gerenciado (por exemplo, loaddns.com ou dnsmadeeasy.com etc.)
  3. Use um balanceador de carga L3 local para o tráfego de saída (HAProxy?) Com os back-end definidos conforme necessário
  4. Construa a resiliência no seu próprio aplicativo da web
Ben Lessani - Sonassi
fonte
O balanceamento de carga de rodízio de DNS geralmente não é resiliente. Um é selecionado e outros não são tentados.
Antti Rytsölä Circles Consulte
Outra opção pode ser usar o netcat ou outro software para encaminhar a conexão para um IP. Em seguida, mude o encaminhamento se um IP for perdido.
Antti Rytsölä Circles Consulte
1
@anttiR DNS O RR sozinho não tem resiliência, mas é usado por um provedor de serviços DNS gerenciado. Editei minhas respostas e dei alguns exemplos para ficar mais claro.
Ben Lessani - Sonassi
Duvido que funcionaria muito bem com banco de dados. Eles têm a tendência de buscar um IP e cumpri-lo. Um site na Internet, por outro lado, funcionaria muito bem.
Antti Rytsölä Circles Consulte
Isso dependeria do resolvedor da máquina host. Se o resolvedor de DNS estiver definido como um serviço sem cache - ou pesquisar diretamente o banco de dados de registradores de DNS, ele funcionará. Mas como eu disse, não é uma boa ideia , é apenas uma ideia .
Ben Lessani - Sonassi 19/09/12
3

O / etc / hosts não suporta round robin, mas você pode escrever um script bash simples para substituir uma entrada marcada com um comentário #RoundRobin (ou qualquer outra tag que você deseja usar, basta refleti-la na linha grep do script) .

#!/bin/bash
fqdnips=( $(nslookup sub.domain.com|grep Address:|awk -F\  '{ print $2 }'|grep -v '#') )

new=`printf "${fqdnips[@]}"`
old=`grep "#RoundRobin" /etc/hosts|awk -F\  '{ print $1 }'`
sed -i "s/$old/$new/g" /etc/hosts

O script acima pega a saída do nslookup para sub.domain.com e a armazena em uma matriz. Em seguida, imprime o valor mais alto em $ new e pega o valor existente para a tag #RoundRobin atribuída em / etc / hosts ... por fim, executa uma substituição sed

A entrada do arquivo / etc / hosts ficaria assim

127.0.0.1        localhost
::1              localhost
11.12.13.14      sub.domain.com      #RoundRobin

Por fim, coloque esse script no crontab da raiz para executar a cada hora mais ou menos e agora você terá um round-robin / etc / host.

Isso é particularmente útil se você tiver uma página codificada que está obtendo alguns dados de uma API e a pesquisa DNS do servidor da API estiver causando muito tempo de espera na execução do script da página ... resultando em alto consumo de CPU para o que de outra forma parece ser uma página simples. Para evitar a dispendiosa pesquisa de DNS (principalmente se o seu site faz centenas deles por minuto para tráfego pesado), você deve usar o / etc / hosts para resolver o FQDN do servidor remoto da API. Isso reduzirá drasticamente o uso da CPU para extrair os dados da API e gerar a página.

Satalink
fonte
O cache do DNS não aliviaria seu caso de centenas de pesquisas por minuto?
Xalorous
Eu não controlo o servidor DNS, isso é algo que posso configurar no servidor web CentOS?
Satalink 12/01
0

Sim, funcionaria.

No entanto, o mecanismo de busca simplesmente segue a lista até encontrar uma correspondência.

Portanto, embora a resposta para a pergunta escrita seja SIM, será um desafio. Mas nada insuperável.

Tente o seguinte: Cada um desses endereços IP realmente precisa ter nomes diferentes.

SDsolar
fonte
1
Não, não vai funcionar. A segunda ocorrência de um valor em / etc / hosts nunca seria usada. E se ele renomeia o segundo endereço IP com um nome de host diferente, agora ele precisa fazer algo em seu aplicativo para fazer o balanceamento de carga. Isso vai custar caro, quando DNS ou DNS + Load Balancer é a resposta certa.
Xalorous
0

Uma maneira fácil de fazer isso acontecer seria usar apenas um serviço DNS público, como o AWS Route53. Você pode inserir vários endereços IP por registro A com prioridade

abc.efg.datastore.com

10 141.131.286.1  
20 141.131.286.237 

Enquanto nenhum certificado estiver envolvido, isso funcionará e não será nem contra quaisquer normas ou práticas recomendadas.

O NSLookup ou outras consultas de domínio retornarão os dois endereços. Seu aplicativo precisa ser capaz de lidar com isso. E sim, o domínio precisa ser registrado publicamente, não apenas um nome de host local.

bortrano
fonte
Os navegadores serão capazes de lidar com isso, se 10 não estiver disponível, ele fará o fallback em 20. Isso certamente depende do aplicativo e também deve ser o ponto em que você verifica a disponibilidade - se você quiser dar um jeito na configuração de algo mais complicado e caro com balanceamento de carga.
bortran
Aos registros não têm um campo prioritário. Alguns serviços DNS autorizados têm ponderação de registros, mas isso é feito incluindo ou excluindo probabilisticamente os registros.
Matt Nordhoff
0

Fácil de configurar, siga as instruções:

  1. instalar dnsmasq
  2. edite o /etc/resolv.conf e defina "nameserver 127.0.0.1" como o primeiro DNS
  3. adicione DNS normal como alternativa (google one por exemplo) "nameserver 8.8.8.8" como uma segunda linha
  4. verifique se dois registros necessários estão no seu arquivo / etc / hosts
  5. agora verifique com um host de comando abc.efg.datastore.com

    que deve responder dois registros com RR-DNS para que, se um nó da lista estiver inativo - seu aplicativo será conectado a outro
Ihor Kolodyuk
fonte
1
A pilha de IP verifica automaticamente o arquivo hosts antes de consultar o DNS. Acredito que faça parte da definição de IP, mas sei que o Windows e o Linux seguem esse padrão. Ele não precisa do dnsmasq e, se alterar o /etc/resolv.conf dessa maneira, ele perderá a conexão com o servidor DNS real.
Xalorous
não é verdade, ele pode colocar várias linhas no resolv.conf para que a próxima linha seja "nameserver 8.8.8.8", por exemplo, + nscd para armazenar em cache os registros existentes, essa abordagem resolve exatamente o problema descrito
Ihor Kolodyuk
Não foi isso que você disse para ele fazer. Você disse a ele para configurar o servidor de nomes para fazer um loopback. Você NÃO disse adicionar loopback como servidor de nomes. Mas se o host não estiver executando o nome, ou mesmo se estiver e não estiver ouvindo no loopback, as consultas DNS para esse endereço não serão respondidas. Simplesmente adicionar os endereços ao arquivo hosts permitirá que eles sejam resolvidos, mas se eles tiverem o mesmo nome de host, apenas o primeiro será usado e voltaremos ao início. A resposta está na configuração de um host virtual no DNS com aliases ponderados ou na frente do banco de dados com um balanceador de carga.
Xalorous
Foi exatamente o que eu disse a ele, o dnsmasq está agindo como um proxy de servidor de nomes. Essa abordagem funciona.
Ihor Kolodyuk