Precisamos de algumas funcionalidades mais avançadas do que o ELB fornece (principalmente a inspeção L7), mas não é óbvio como lidar com coisas como batimentos cardíacos e alta disponibilidade com algo como haproxy usando EC2. Há uma alta probabilidade de precisarmos de 3 ou mais nós haproxy no cluster, portanto, uma simples pulsação entre dois nós não funcionará.
Parece que ter uma camada de pulsação na frente dos nós haproxy seria o caminho a seguir, possivelmente usando o IPVS, mas manipular as alterações de configuração conforme o cluster do EC2 muda (via alterações intencionais, como expansão ou não intencional, como a perda de um Nó EC2) parece não trivial.
De preferência, a solução abrangeria pelo menos duas zonas de disponibilidade.
Em resposta a perguntas frequentes: Não, as sessões não são complicadas. E sim, precisaremos de SSL, mas isso poderia, em teoria, ser totalmente tratado por outra configuração - somos capazes de direcionar o tráfego SSL para um local diferente do tráfego não SSL.
fonte
Respostas:
OK, nunca criei uma solução de balanceamento de carga da AWS com tráfego nos níveis do SmugMug, mas apenas pensando na teoria e nos serviços da AWS, algumas idéias vêm à mente.
A questão original está faltando algumas coisas que tendem a impactar o design do balanceamento de carga:
Estou respondendo da perspectiva de como manter a própria camada de balanceamento de carga altamente disponível. A manutenção da HA dos servidores de aplicativos acaba de ser feita com as verificações de integridade incorporadas aos seus balanceadores de carga L7.
OK, algumas idéias que devem funcionar:
1) "O caminho da AWS":
Benefícios / ideia: Os balanceadores de carga L7 podem ser bastante simples AMI EC2, todos clonados na mesma AMI e usando a mesma configuração. Assim, as ferramentas da Amazon podem lidar com todas as necessidades de alta disponibilidade: O ELB monitora os balanceadores de carga L7. Se um L7 LB morrer ou deixar de responder, o ELB e o Cloudwatch juntos geram uma nova instância automaticamente e a trazem para o pool ELB.
2) "O DNS round robin com maneira de monitoramento:"
Benefícios / ideia: os agentes de usuário compatíveis devem alternar automaticamente para outro endereço IP, se um não responder. Portanto, no caso de uma falha, apenas 1/3 dos usuários devem ser afetados e a maioria deles não deve notar nada, pois o UA falha silenciosamente em outro IP. E sua caixa de monitoramento externo notará que um EIP não responde e corrige a situação em alguns minutos.
3) DNS RR para pares de servidores HA:
Basicamente, essa é a sugestão de Don de simples pulsação entre um par de servidores, mas simplificada para vários endereços IP.
Benefícios / ideia: no ambiente totalmente virtualizado da AWS, na verdade, não é tão fácil argumentar sobre os serviços L4 e os modos de failover. Ao simplificar para um par de servidores idênticos, mantendo apenas 1 endereço IP ativo, fica mais fácil raciocinar e testar.
Conclusão: Novamente, eu realmente não tentei nada disso na produção. Apenas pelo meu pressentimento, a opção 1 com o ELB no modo L4 e as instâncias EC2 autogerenciadas como L7 LBs parecem mais alinhadas com o espírito da plataforma da AWS, e onde é mais provável que a Amazon invista e expanda mais tarde. Essa provavelmente seria minha primeira escolha.
fonte
Se você não estiver fazendo sessões complicadas ou se estiver usando o estilo tomcat / apache (acrescente o ID do nó ao sessionid, em vez de armazenar o estado no LB), eu usaria o ELB na frente de um grupo de haproxies. O ELB possui um controle de saúde embutido, para que você possa monitorar os haproxies e remover quaisquer que estejam fora da piscina. Muito menos configuração do que o failover de pulsação.
Quanto a propagar mudanças, não tenho uma ótima resposta. O Puppet é ótimo para configuração inicial e implementação de alterações, mas para adicionar / remover nós, você tende a querer uma resposta mais rápida do que o intervalo de pesquisa de 30 minutos.
fonte
Eu não o usei, mas já vi muitas pessoas mencionarem o uso de fantoches para lidar com esse tipo de problema no EC2
fonte