Concrete Logo
Hamburger button

Balanceamento de carga usando Amazon ELB

  • Blog
  • 11 de Outubro de 2012
Share

Neste blog volta e meia compartilhamos algum conhecimento sobre Amazon AWS. Afinal nos orgulhamos de ser o primeiro parceiro oficial da Amazon AWS no Brasil.

Abaixo estão links para alguns posts sobre Amazon AWS:

Então aí vai mais um desta série que aliás já tem mais outro no forno.

 

Load Balancing

Segundo a Wikipedia, balanceamento de carga ou load balancing, é uma técnica de distribuir a carga por vários computadores ou por um cluster de computadores, por vários links de rede, por várias CPUs, por várias unidades de disco ou por vários outros recursos. E a Wikipedia ainda acrescenta: pode aumentar a confiabilidade através da redundância.

Se você já usou e configurou um balanceador via software, pode ser que tenha usado o LVS, Linux Virtual Server. Ele funciona assim:

Linux Virtual Server

Como se vê na figura, o balanceador de carga é um ponto único que redistribui o tráfego usando alguma técnica como NAT, IP tunneling ou roteamento direto.

Você pode saber mais em Linux Virtual Server Tutorial. É um tutorial antigo. A última revisão é de março de 2004 mas serve para mostrar o que é.

Com algum trabalho extra o ponto único da figura pode ser configurado para ser paralelizado com algum outro servidor que assuma seu lugar em caso de falha.

Com mais trabalho extra ainda é possível monitorar o servidor que está no ar. Provavelmente usando um serviço tipo heartbeat que de tempos em tempos perguntará se o servidor está vivo. De preferência utilizar uma outra alternativa de conexão com o servidor slave para escapar de uma eventual falha na conexão da rede interna entre eles.

E é claro que se falhar, dificilmente você poderá resolver sem ir ver pessoalmente, problema típico de quem não usa cloud computing.

 

Amazon Elastic Load Balancing

O Amazon Elastic Load balancing (ELB) é para o Amazon AWS, tudo o que está na definição da Wikipedia. Distribui o tráfego que chega nas zonas de disponibilidade e nas instâncias Amazon EC2 dentro destas zonas.

Não é um hardware ou um software dedicado. É um serviço que redistribui as cargas e ainda checa as instâncias evitando rotear para alguma instância com problema. Não é fácil fazer isto com LVS.

Como serviço, pode escalar automaticamente dependendo do tráfego que chega usando os mecanismos da AWS sem que a gente precise fazer um monte de maracutaia que necessitaria fazer caso nós mesmos administrássemos o load balancer (como por exemplo um LVS).

E como serviço, não é referenciado por um endereço IP e sim por um nome de domínio totalmente qualificado. Esta questão de usar nome ao invés de IP tem implicações explicadas no fim deste texto.

O serviço pode ser configurado para usar o conceito de “sticky sessions”. Significa configurar o balanceador de carga para anexar uma sessão de usuário a uma instância específica, isto no caso da sessão ficar na memória local da tal instância (dica: não guarde sessões no file system, se precisar, guarde na base de dados).

Ao usar “sticky sessions”, todas as requisições oriundas de um usuário durante a sessão, serão roteadas para a mesma instância.

O ELB suporta 2 mecanismos de “sticky sessions”:

    – load balancer-generated HTTP cookies, que permitem sessões com ciclo de vida baseadas no browser e
    – application-generated HTTP cookies, que permitem sessões com ciclo de vida específica da aplicação.

 

Botando para funcionar o Amazon Elastic Load Balancing

 

Passo a passo para fazer um teste com o ELB

Vamos usar o console AWS. Você poderia usar as outras interfaces disponíveis, ver Get Set Up with Elastic Load Balancing Interfaces para saber sobre interface de linha de comando CLI, Query API, SOAP API ou como interagir através dos SDKs. Nenhuma destas outras opções será abordada neste post.

    0 – Pré requisito:

      Possuir instâncias AWS e um login de acesso ao console Amazon AWS.

     

    1 – Criar um novo load balancer

      a) – No lado esquerdo do console AWS há um link “Load balancers”
       
      01

       
      b) – Clicar no link para criar um novo load balancer
       
      Criar um novo load balancer

     

    2 – Definir o nome do load balancer

       
      Balanceador externo

      Nesta tela a opção “create LB Inside” escolherá se o balanceador de cargas atua direto no EC2 ou no seu VPC, Amazon Virtual Private Cloud. O VPC permite aproveitar uma seção privada e isolada da nuvem da AWS onde você pode executar recursos AWS em uma rede virtual definida por você mesmo.

     

    3 – Definir o tipo (interno ou externo) do load balancer

      Caso marque “create LB Inside” = VPC, terá uma opção adicional de utilizar este balanceador de cargas apenas internamente. Significa que poderá ser acessado apenas através de seus servidores dentro do seu VPC.

      O ELB usando VPC trabalha de modo similar e usa o mesmo conjunto de features caso fosse configurado com o EC2. As diferenças estão nos procedimentos de associação com as instâncias. Ver detalhes na documentação oficial em Deploying Elastic Load Balancing in Amazon VPC.

      Balanceador interno

      Usar ELB internamente com VPC é indicado caso tenha um balanceamento de cargas que necessite apenas acesso interno em sua rede ou quando precisa possibilitar o acesso direto ao ELB para reduzir saltos de rede buscando um endereço da mesma rede e não da internet.

     

    4 – Configurar o listener

      Antes de começar a usar o ELB, é preciso configurar os listeners do load balancer. O listener é um processo que recebe as requisições do cliente.

      Como aparece nas 2 figuras anteriores, é configurado com um protocolo e um número de porta para as conexões de front-end (cliente para o load balancer) e de back-end (load balancer para a instância de back-end).

      Por default, o load balancer começa configurado para usar o protocolo HTTP protocol com porta 80 tanto para a conexão de front-end como para a de back-end. Isto pode ser alterado.

      A configuração do listener permite escolher entre os protocolos HTTP, HTTPS, SSL e TCP para especificar individualmente o protocolo para as conexões de front-end e de back-end.

        – Se escolher os protocolos HTTPS/SSL para as conexões de front-end, a conexão de the back-end para instância pode ser em texto puro ou HTTPS/SSL. Você poderá inserir o seu certificado direto no ELB ao invés de instalá-lo em seu servidor de aplicação. Vantagens:

          – Facilita a administração pois é um ponto único para controle;

          – As requisições não serão retransmitidas ao seu servidor de aplicação;

          – O trabalho de criptografia e decriptografia dos dados será de responsabilidade do ELB e não mais do seu servidor de aplicação diminuindo assim a carga de processamento.

        – Se escolher HTTP para a conexão de front-end, a conexão de the back-end para instância pode ser em HTTP or HTTPS.

        – Se escolher TCP poderá balancear a carga de qualquer porta TCP de sua escolha (dentre o range 25, 80, 443 ou 1024 a 65535).

       
      Com os valores definidos pressione “Continue”

     

    5 – Configurar a checagem de status do host cliente

      Na imagem vemos que o protocolo de testes que pode ser qualquer um dos protocolos anteriormente descritos.
       
      05-520x374

      A porta de checagem poderá ser uma porta diferente das portas balanceadas.

      A página é acessada a partir da URL ENDEREÇO_IP:PORTA/CAMINHO

      Nas opções avançadas podemos definir o timeout para a aplicação indicada. Dará erro quando a espera por resposta ultrapassar o valor dado e então começará a contagem do parametro Unhealthy Threshold

      O Unhealthy Threshold é quantidade de erros aceitável até que um servidor seja dados como indisponível e retirado do balanceamento.

      O Healthy Threshold é a quantidade de status OK que o servidor terá que retornar até que seja dados como disponível no balanceamento de cargas.

       
      Com os valores definidos pressione “Continue”

     

    6 – Adicionar os servidores que participam desse balanceamento de cargas.

       
      06-520x346

      Caso esteja utilizando um VPC será necessário incluir as redes que utilizam internet gateway como saída.

       
      Com os valores definidos pressione “Continue”

     

    7 – Concluir a criação

       
      07-520x365

       
      Se tudo está OK, basta clicar em “Create”

 

Conclusão

Criado o seu ELB AWS poderá vê-lo disponível já com o fechamento da janela de criação. Verá as informações sobre o seu ELB com um clique sobre ele.
 
08-520x284

A informação DNS Name “load-balancer-1768794412.us-east-1.elb.amazonaws.com” é o endereço externo do meu ELB e poderá ser acessado na porta configurada. Posso então criar uma entrada CNAME no meu servidor DNS apontando para este endereço.

 

Para não dizer que tudo são flores

Na verdade são sim mas é preciso ficar atento a algumas coisinhas:

Caso queira dar acesso ao seu site via o domínio raiz (sem o www), vai precisar de um trabalhinho a mais. Para isto você tem as seguintes opções:

    – Caso você utilize o Route 53: Crie uma nova entrada do tipo “A” para o seu domínio existente, selecionando a opção “alias” e selecione o seu load balancer na lista.

    – Caso não utilize o Route 53: Você poderá inserir um ElasticIP em uma instância EC2 participante do balanceamento e criar uma entrada “A” no seu servidor DNS apontando para este IP, ou poderá ainda utilizando um Rewrite de URLs para enviar as requisições para seu balanceador.

 
Outro pequeno inconveniente de usar um serviço como o ELB que não tem um IP específico é que o robot do Google gastará um pouco mais de tempo para fazer o crawler no seu site. Veja mais em Amazon Elastic Load Balancing & SEO Considerations

 

É isso, aguardem porque temos mais dicas sobre Amazon AWS para compartilhar.