Estou procurando uma maneira de configurar o Apache como alta disponibilidade. A ideia é ter um cluster de mais de 2 servidores Apache atendendo aos mesmos sites. Posso configurar o endereço IP de cada servidor com DNS round-robin para que cada solicitação seja enviada aleatoriamente para um dos servidores no cluster (ainda não estou muito preocupado com o balanceamento de carga, embora isso possa acontecer jogar mais tarde).
Já o tenho configurado e funcionando com vários servidores Apache VM (espalhados por vários servidores físicos) atendendo sites e DNS round-robin, e isso funciona bem. O banco de dados SQL é configurado usando MariaDB em um cluster de alta disponibilidade, os dados da web (HTML, JS, scripts PHP, imagens, outros ativos) são armazenados no LizardFS e as sessões também são armazenadas em um local compartilhado. Tudo isso funciona bem até que um dos servidores do cluster fique inacessível por qualquer motivo. Então, uma porcentagem das solicitações (aproximadamente o número de servidores inativos dividido pelo número total de servidores no cluster) fica sem resposta. Aqui estão as opções que considerei:
Atualizações automáticas de DNS
Tenha algum processo que monitore a funcionalidade dos servidores web e remova quaisquer servidores inativos do DNS. Isso tem dois problemas:
Primeiro, embora possamos definir nosso TTL para um número muito baixo (como 5 segundos), ouvi dizer que alguns servidores DNS imporão um TTL mínimo superior ao nosso. E alguns navegadores (nomeadamente o Chrome) armazenarão DNS em cache por pelo menos 60 segundos, independentemente das configurações de TTL. Portanto, embora sejamos bons, alguns clientes podem não conseguir acessar os sites por algum tempo no caso de uma atualização de DNS.
Em segundo lugar, o programa que monitora a funcionalidade do cluster
e atualiza os registros DNS torna-se um novo ponto único de falha. Poderemos
contornar isso tendo mais de um monitor espalhado por vários
sistemas, porque se ambos detectarem um problema e fizerem as mesmas alterações de DNS, isso não deverá causar problemas.
uCarp/pulsação
Torne virtuais os endereços IP que são acessados e no DNS round-robin e faça com que eles sejam reatribuídos aos servidores ativos a partir dos servidores inativos, caso um servidor fique inativo. Por exemplo, o VIP do servidor1 é 192.168.0.101 e o VIP do servidor2 é 192.168.0.102. Se o servidor1 cair, 192.168.1.102 se tornará um IP adicional no servidor2. Isso tem dois problemas:
Primeiro, que eu saiba, o uCarp/Heartbeat monitora seus pares especificamente quanto à inacessibilidade, por exemplo, se o par não puder receber ping. Quando isso acontece, ele assume o IP do peer inativo. Isso é um problema porque há mais motivos pelos quais um servidor web pode não ser capaz de atender solicitações além de estar inacessível na rede. O Apache pode ter travado, pode existir um erro de configuração ou algum outro motivo. Eu gostaria que os critérios fossem "o servidor não está servindo as páginas conforme necessário" em vez de "o servidor não é pingável". Acho que não posso definir isso no uCarp/Heartbeat.
Em segundo lugar, isso não funciona em data centers, porque cada conjunto de servidores nos data centers possui diferentes blocos de endereços IP. Não posso ter um IP virtual flutuante entre data centers. O requisito para funcionar em data centers (sim, meu sistema de arquivos distribuído e cluster de banco de dados estão disponíveis em data centers) não é obrigatório, mas seria uma boa vantagem.
Pergunta
Então, alguma ideia sobre como lidar com isso? Basicamente, o Santo Graal da alta disponibilidade: nenhum ponto único de falha (seja no servidor, no balanceador de carga ou no data center) e praticamente nenhum tempo de inatividade no caso de uma troca.
Responder1
Quando quero HA e compartilhamento de carga, uso keepalived e configuro com dois VIPs. Por padrão, VIP1 é atribuído ao servidor1 e VIP2 é atribuído ao servidor2. Quando qualquer servidor está inativo, o outro servidor recebe os dois VIPs.
Keepalived cuidará do HA observando o outro servidor. Se um servidor não estiver acessível ou alguma interface estiver inativa, ele muda para FAULT
o estado. VIP será levado por outro servidor. Para monitorar seu serviço, você pode usar track_script
a opção.
Se quiser adicionar outro cluster em outro data center, você pode adicionar mais dois servidores e fazer a mesma configuração. Agora, você pode carregar o tráfego compartilhado entre data centers usando round-robin de DNS. Nenhuma atualização de DNS é necessária neste caso.