Eu sempre usei o Round-Robin DNS, com TTL longo, como balanceador de carga. Funciona muito bem para serviços HTTP / HTTPS com navegadores .
Eu realmente me estresso com os navegadores, já que a maioria dos navegadores implementa algum tipo de "nova tentativa em outro IP", mas não sei como outras bibliotecas ou softwares lidariam com a solução de múltiplos IP.
Quando o navegador não obtém resposta de um servidor, ele automaticamente chama o próximo IP e o mantém (até ficar inoperante ... e depois tenta outro).
Em 2007, fiz o seguinte teste:
- adicione um iframe no meu site, apontando para uma entrada Round-Robin, como
http://roundrobin.test:10080/ping.php
- a página era servida por 3 soquetes PHP, escutando em três IPs diferentes, todos na porta 10080 (não podia me dar ao luxo de testar na porta 80, pois meu site estava sendo executado nela)
- havia um soquete (digamos A ) para verificar se o navegador poderia se conectar à porta 10080 (quantas empresas permitem apenas portas padrão)
- outros dois soquetes (digamos B e C ) podem ser ativados ou desativados em tempo real.
Deixei correr uma hora, tinha muitos dados. Os resultados foram que, para 99,5% dos acessos no soquete A , tive um atingido no soquete B ou C (não desabilitei os dois ao mesmo tempo, é claro). Os navegadores eram: iPhone, Chrome, Opera, MSIE 6/7/8, BlackBerry, Firefox 3 / 3.5 ... Então, mesmo navegadores não tão compatíveis estavam lidando direito!
Até hoje, eu nunca o testei novamente, mas talvez eu configure um novo teste um dia ou libere o código no github para que outros possam testá-lo.
Nota importante: mesmo que seja trabalhando a maior parte do tempo, ele não remove o fato de que alguns pedidos irá falhar. Também o uso para solicitações POST, pois meu aplicativo retornará uma mensagem de erro caso não funcione, para que o usuário possa enviar os dados novamente e, provavelmente, o navegador usará outro IP nesse caso e o salvamento funcionará . E para conteúdo estático, está funcionando muito bem.
Portanto, se você estiver trabalhando com navegadores, use o DNS Round-Robin, seja para conteúdo estático ou dinâmico, você ficará bem. Os servidores também podem ficar inativos no meio de uma transação e, mesmo com o melhor balanceador de carga, você não pode lidar com esse caso. Para conteúdo dinâmico, você precisa sincronizar suas sessões / banco de dados / arquivos; caso contrário, não será capaz de lidar com isso (mas isso também ocorre com um balanceador de carga real).
Nota adicional: você pode testar o comportamento em seu próprio IP usando iptables
. Por exemplo, antes de sua regra de firewall para tráfego HTTP, adicione:
iptables -A INPUT -p tcp --dport 80 --source 12.34.56.78 -j REJECT
(onde 12.34.56.78
está obviamente o seu IP)
Não use DROP
, pois ela deixa a porta filtrada e seu navegador aguardará o tempo limite. Portanto, agora, você pode ativar ou desativar um servidor ou outro. O teste mais óbvio é desabilitar o servidor A, carregar a página, habilitar o servidor A e desabilitar o servidor B. Quando você carregar a página novamente, verá uma pequena espera no navegador e, em seguida, será carregada no servidor A de novo. No Chrome, você pode confirmar o IP do servidor observando a solicitação no painel de rede. Na General
guia Headers
, você verá um cabeçalho falso chamado Remote Address:
. Este é o IP de onde você obteve uma resposta.
Portanto, se você precisar entrar no modo de manutenção em um servidor, basta desativar o tráfego HTTP / HTTPS com uma iptables
REJECT
regra, todas as solicitações serão encaminhadas para outros servidores (com uma pequena espera, quase imperceptível para os usuários).