Estou tentando entender o conceito de balanceamento de carga para garantir disponibilidade e redundância para manter os usuários felizes quando as coisas dão errado, em vez de balancear a carga com o objetivo de oferecer velocidade empolgante a milhões de usuários.
Estamos com um orçamento apertado e tentando nos ater às coisas em que há muito conhecimento disponível, portanto, rodar o Apache no Ubuntu VPS parece ser a estratégia até que algum mecanismo de pesquisa famoso nos adquira ( incluindo a ironia de sábado, observe ).
Pelo menos para mim, é uma selva completa de diferentes soluções disponíveis. Os apaches próprios mod_proxy e HAproxy são dois que encontramos em uma rápida pesquisa no google, mas com uma experiência nula de balanceamento de carga, não tenho idéia do que seria apropriado para a nossa situação ou do que cuidaríamos ao escolher uma solução para resolver nosso problema. preocupações de disponibilidade.
Qual é a melhor opção para nós? O que devemos fazer para obter alta disponibilidade enquanto permanecemos dentro de nossos orçamentos?
fonte
Respostas:
A solução que eu uso e pode ser facilmente implementada com o VPS é a seguinte:
Este arco tem as seguintes vantagens, na minha opinião tendenciosa:
No seu caso, ter VPSs separados fisicamente é uma boa idéia, mas dificulta o compartilhamento de ip. O objetivo é ter um sistema redundante e resistente a falhas, e algumas configurações para o balanceamento de carga / HA acabam prejudicando a adição de um único ponto de falha (como um único balanceador de carga para receber todo o tráfego).
Também sei que você perguntou sobre o apache, mas naqueles dias temos ferramentas específicas mais adequadas ao trabalho (como nginx e verniz). Deixe o apache para executar os aplicativos no back-end e atenda-o usando outras ferramentas (não que o apache não possa executar um bom balanceamento de carga ou proxy reverso, é apenas uma questão de transferir diferentes partes do trabalho para mais serviços, para que cada parte possa se sair bem é compartilhar).
fonte
HAproxy é uma boa solução. A configuração é bastante simples.
Você precisará de outra instância do VPS para se sentar na frente de pelo menos outros 2 VPS. Portanto, para balanceamento de carga / failover, você precisa de no mínimo 3 VPS
Algumas coisas em que pensar também é:
Terminação SSL. Se você usar HTTPS: // essa conexão deve terminar no balanceador de carga, por trás do balanceador de carga, ele passará todo o tráfego por uma conexão não criptografada.
Armazenamento de arquivo. Se um usuário enviar uma imagem para onde ela vai? Apenas fica em uma máquina? Você precisa, de alguma maneira, compartilhar arquivos instantaneamente entre máquinas - você pode usar o serviço S3 da Amazon para armazenar todos os seus arquivos estáticos ou pode ter outro VPS que funcione como servidor de arquivos, mas eu recomendaria o S3 por ser redundante e incrivelmente barato.
informações da sessão. cada máquina em sua configuração do balanceador de carga precisa acessar as informações da sessão do usuário, porque você nunca sabe em qual máquina ele será atingido.
db - você tem um servidor db separado? se você tiver apenas uma máquina agora, como garantirá que sua nova máquina tenha acesso ao servidor db - e se for um servidor VPS db separado, quão redundante é isso. Não necessariamente faz sentido ter front-ends da Web de alta disponibilidade e um único ponto de falha com um servidor db, agora você precisa considerar a replicação db e a promoção de escravos também.
Então, eu estou no seu lugar, esse é o problema de um site que faz algumas centenas de acessos por dia para uma operação real. Fica complexo rapidamente. Espero que isso lhe dê um pouco de pensamento :)
fonte
Meu voto é para o Linux Virtual Server como o balanceador de carga. Isso torna o diretor do LVS um ponto único de falha e também um gargalo, mas
O custo pode ser reduzido mantendo o primeiro diretor na mesma máquina que o primeiro nó LVS e o segundo diretor na mesma máquina que o segundo nó LVS. O terceiro e os nós subsequentes são nós puros, sem implicações de LVS ou HA.
Isso também deixa você livre para executar qualquer software de servidor da web que desejar, pois o redirecionamento ocorre abaixo da camada do aplicativo.
fonte
E essa cadeia?
round robin dns> haproxy em ambas as máquinas> nginx para separar arquivos estáticos> apache
Possivelmente também use ucarp ou batimentos cardíacos para garantir que a haproxia sempre responda. O Stunnel ficaria na frente do haproxy se você também precisar de SSL
fonte
Você pode considerar o uso de um software de cluster adequado. RedHat's (ou CentOS) Cluster Suite ou Oracle's ClusterWare . Eles podem ser usados para configurar clusters ativo-passivos e para reiniciar serviços e falhar entre nós quando houver problemas sérios. Isto é essencialmente o que você está procurando.
Todas essas soluções de cluster estão incluídas nas respectivas licenças do sistema operacional, portanto, você provavelmente terá um custo baixo. Eles exigem algum tipo de armazenamento compartilhado - uma montagem NFS ou disco físico acessado pelos dois nós com um sistema de arquivos em cluster. Um exemplo deste último seria discos SAN com acesso a vários hosts permitido, formatados com OCFS2 ou GFS . Eu acredito que você pode usar discos compartilhados do VMWare para isso.
O software de cluster é usado para definir 'serviços' que são executados em nós o tempo todo ou apenas quando esse nó está 'ativo'. Os nós se comunicam por meio de pulsações e também monitoram esses serviços. Eles podem reiniciá-los se perceberem falhas e reiniciar se não puderem ser corrigidos.
Você basicamente configuraria um único endereço IP 'compartilhado' para o qual o tráfego seria direcionado. Em seguida, o apache e quaisquer outros serviços necessários também podem ser definidos e apenas executados no servidor ativo. O disco compartilhado seria usado para todo o seu conteúdo da web, arquivos carregados e diretórios de configuração do apache. (com httpd.conf, etc)
Na minha experiência, isso funciona incrivelmente bem.
--Christopher Karel
fonte
O balanceamento ideal de carga pode ser muito caro e complicado. O balanceamento de carga básico deve garantir apenas que cada servidor esteja atendendo aproximadamente o mesmo número de ocorrências a qualquer momento.
O método mais simples de balanceamento de carga é fornecer vários registros A no DNS. Por padrão, o endereço IP será configurado em um método round robin. Isso fará com que os usuários sejam distribuídos de maneira relativamente uniforme entre os servidores. Isso funciona bem para sites sem estado. Um método um pouco mais complexo é necessário quando você tem um site com estado.
Para lidar com requisitos com estado, você pode usar redirecionamentos. Atribua a cada servidor da Web um endereço alternativo, como www1, www2, www3, etc. Redirecione a conexão www inicial para o endereço alternativo do host. Você pode acabar tendo problemas com os favoritos dessa maneira, mas eles devem estar uniformemente dispersos pelos servidores.
Como alternativa, o uso de um caminho diferente para indicar qual servidor está lidando com a sessão com estado permitiria as sessões de proxy que trocaram o host para o servidor original. Isso pode ser um problema quando a sessão de um servidor com falha chega ao servidor que assumiu o controle do servidor com falha. No entanto, exceto o software de clustering, o estado estará ausente de qualquer maneira. Devido ao cache do navegador, você pode não ter muitas sessões alterando os servidores.
O failover pode ser tratado configurando o servidor para assumir o endereço IP de um servidor com falha. Isso minimizará o tempo de inatividade se um servidor falhar. Sem o software de cluster, as sessões com estado serão perdidas se um servidor falhar.
Sem failover, os usuários sofrerão um atraso até que o navegador faça o failover para o próximo endereço IP.
O uso de serviços Restful em vez de sessões com estado deve eliminar os problemas de cluster no front-end. Problemas de cluster no lado do armazenamento ainda se aplicam.
Mesmo com os balanceadores de carga na frente dos servidores, você provavelmente terá DNS de rodízio na frente deles. Isso garantirá que todos os seus balanceadores de carga sejam utilizados. Eles adicionarão outra camada ao seu design, com complexidade adicional e outro ponto de falha. No entanto, eles podem fornecer alguns recursos de segurança.
A melhor solução dependerá dos requisitos relevantes.
A implementação de servidores de imagem para exibir conteúdo como imagens, arquivos CSS e outro conteúdo estático pode facilitar a carga nos servidores de aplicativos.
fonte
Eu geralmente uso um par de máquinas OpenBSD idênticas:
O OpenBSD é leve, estável e bastante seguro - Perfeito para serviços de rede.
Para começar, recomendo uma configuração de layer3. Evita a instalação do firewall de complicações (PF). Aqui está um exemplo de arquivo /etc/relayd.conf que mostra a configuração de um balanceador de carga de retransmissão simples com monitoramento dos servidores web de back-end:
fonte
Você deu ec2 com cloudfoundry ou talvez Elastic beanstalk ou apenas um simples e antigo escalonamento automático da AWS um pensamento. Eu tenho usado isso e ele escala muito bem e ser elástico pode aumentar / diminuir sem qualquer intervenção humana.
Dado que você diz que não tem experiência com o balanceamento de carga, eu sugeriria essas opções, pois elas exigem um mínimo de "fritura" do cérebro para começar a funcionar.
Pode ser uma melhor utilização do seu tempo.
fonte
pound
até bem recentemente quando, acredito, eles implementaram o nginx. Observe que o nginx pode ser implementado para substituir o Apache, ou apenas como um front-end para o Apache.