22.11  
Inicio
Principal
Inicio
Noticias
Artigos
Regras da Lista
Assinar a Lista
Histórico da Lista
Galeria de Imagens
Contador Usuários FUG
FUGs Estaduais
Downloads
Enquetes
FAQ
Resumo do Site
Links
Pesquisar
Contato
Sobre a FUG-BR
RSS
-
DOC-BR (FUG BR)
Introdução
Projeto DOC-BR
Handbook
FAQ Oficial
-
+ Noticias
Alertas de Seguranca
Alertas em Ports
BSD em Geral
DaemonNews (Ingles)
MyFreeBSD
Todas Categorias
-
Login
Nome de Usuário

Senha

Lembrar login
Esqueceu sua senha?
Sem conta? Crie uma


Balanceamento de carga e redundância para Servidores Web. PDF Imprimir E-mail
Por Daniel Bristot de Oliveira   
14/07/2006

Ilustracao VRRPRedundância é um termo muito discutido diariamente, pois constantemente vemos o aumento da complexidade dos serviços e o número de clientes, principalmente na Web. A dependência dos serviços web é cada vez maior, as páginas já não são mais estáticas, e hoje a maioria do processamento é feita no servidor, isto acaba sobrecarregado um servidor ao ponto de ele não ser mais capaz de responder a todas as requisições. Outro fator, as páginas dinâmicas muitas vezes guardam informações sobre clientes e seções, e isto é um problema para simples algoritmos de rond-robin onde os clientes são enviados para servidores aleatórios a cada conexão.

É possível resolvermos este problema com uma solução sobre o FreeBSD, com o auxílio de duas ferramentas, o Pen e o FreeVRRP.

O propósito deste artigo é mostrar como se fazer a redundância dos roteadores que irão ficar de "cara" para a internet, e o balanceamento de carga entre os nós internos da rede.

Neste artigo utilizaremos a estrutura abaixo:

HA.jpg

Vamos explicar a imagem acima. Os dois hosts, M e S irão ficar de cara para a Internet, eles tem duas interfaces de rede, uma para a rede 200.18.15.X, que possui IPs verdadeiros e outra para a rede 10.0.70.0, que possui endereços internos. Os dois roteadores serão iguais, em configuração, a diferença está que o M será o mestre, e possuirá o endereço 200.18.15.14 e 10.0.70.1, que é o endereço que os clientes irão se conectar, caso o servidor M cair, o servidor S irá pegar o seus endereços de IP e assumirá o seu lugar. Os dois servidores executarão o Pen que é um loader balancer e o FreeVRRP, que é uma implementação do protocolo VRRP(Virtual Router Redundancy Protocol). Os hosts M serão servidores WEB normais.

Vamos começar pelo Pen.

O que é o pen?

O pen é um "load balancer", ou um balanceador de carga, para serviços baseados em tcp. Ele permite que um roteador distribua serviços entre vários servidores, proporcionando alta disponibilidade e desempenho.

Ao contrário de vários balanceadores de carga, o pen não implementa simplesmente um algoritmo de circular (round-robin) para a distribuição de conexões, o pen mantém um registro sobre os clientes, em caso de uma re-conexão por parte de um cliente, a requisição será enviada para o mesmo servidor que foi utilizado anteriormente, isto permite que algumas aplicações que utilizam cache e variáveis trabalhem normalmente por trás do balanceador.

O Pen monitora freqüentemente o estado dos servidores para os quais ele irá desviar a carga, caso o servidor se torne indisponível, ele será retirado da lista de servidores e caso ele torne-se novamente disponível, ele será adicionado a fila de servidores.

O Pen também trás um daemon chamado penlogd, que serve para "pegar" os logs de servidores web, armazenado de forma centralizada os logs, fazendo assim possível uma real contabilidade de acessos a servidores web. Discutiremos o penlogd no final deste artigo. Outra ferramenta é o penctl, uma interface de configuração e monitoramento do Pen.

Instalando o Pen

O Pen está disponível para o FreeBSD via o Ports. O caminho para o ports é /usr/ports/net/pen.

Para instalar:

# cd /usr/ports/net/pen
# make install clean

Pronto ele está instalado.

Limites do Pen

o Pen limita a 256 conexões simultâneas, mas isto pode ser alterado na inicialização do pen. Porém o número máximo de conexões simultâneas depende do FDSETSIZE que é definido na compilação do pen, e o limite de conexões simultâneas é calculado assim: (FDSIZESET/2)-5, então, para podermos utiliza-lo com 512 conexões simultâneas, construa-o com o FDSIZESET=(512+5)*2=1034:

     # make WITH_FDSETSIZE=1034 install

pronto!

Utilizando o Pen

A sintax básica do pen é

            # pen EndereçoLocal:PortaLocal EndereçoServidor1:Porta:LimiteDeConexões EndereçoServidor1:Porta:LimiteDeConexões

Na pratica utilizaremos o pen assim:

           # pen 200.18.15.14:80 10.0.70.3:80:10 10.0.70.4:80:20 10.0.70.5:8080:10 10.0.70.6 10.0.70.7

Neste caso estamos desviando o tráfego do ip 200.18.15.14 na porta 80, para 10.0.70.3 na porta 80 com um limite de 10 conexões simultâneas, e para 10.0.70.4 com o limite de 20 conexões simultâneas, para 10.0.70.5 na porta 8080 sem limite de conexões simultâneas, e para 10.0.70.6 e 10.0.70.7 sem limite de conexões e na mesma porta do ip do pen, no caso a 80.

NOTA: Como o padrão, somente o usuário root pode escutar conexões com portas abaixo de 1024.

O pen não é um simples load balancer, ele deixa o rastro dos clientes, porém isto as veses é desnecessário, e pode ser ignorado com a opção -r do no pen.

Quando um servidor sair do ar, ele será retirado da lista de servidores disponíveis, porém quando ele voltar, ele será colocado novamente na lista, para isto o pen verifica periodicamente os servidores.

O pen pode utilizar um arquivo de configuração, que é indicado com a flag -f Arquivo, o formato do arquivo são os comandos do penctl, para ver todas as opções veja man 1 penctl.

Para depuração, utilize o pen em modo debug, ele suporta debug para a syslog ou para a saída padrão, para a syslog utilize a flag -d, por padrão o log ficará em /var/log/debug.log. Para a saída padrão utilize as flags -fd, e o pen irá rodar em primeiro plano e em debug.

Algumas Flags do Pen

-x N   Número máximo de conexões simultâneas

-W     Usa "peso" para seleção de servidor.

-S N   Número máximo servidores (default 16).

-c N    Numero máximo de clientes (default 2048).

-h       Usa um hash no endereço de IP do cliente para seleção inicial do servidor. Isso faz mais previsível onde o cliente vai ser conectado

-j dir   Executa em um ambiente chroot

-p file  Escreve o número do PID do pen para o arquivo.

-w file  Arquivo para reportagem de estatus no formato HTML

O penctl

O penctl é uma interface de comunicação com o pen; quase tudo que pode ser feito com o penctl pode ser feita através do comando de inicialização do pen, porém o penctl trás algumas informações de status. Para utilizar o penctl você deve definir a porta em que ele escutará as conexões. Esta porta é adicionada com o parâmetro -C do pen, por exemplo, para escutar na porta 900 faça.

# pen -C 900 80 10.0.60.2:80 10.0.60.3:80

O penctl tem a sintaxe assim:

  # penctl host:porta comando

um exemplo é a saída de status em html.

  # penctl localhost:900 status > status.html

ou os servidores.

  # penctl localhost:900 servers

Existem vários comandos, para vê-los, veja man 1 penctl.

O penlogd

O penlogd é um agregador de log, ele serve para centralizar os logs dos servidores em um só lugar, isto é muito util para contabilidade do sistema. Ele escuta em conexões em uma porta udp e reescreve o endereços do servidor para o endereço que o pen está escutando.

A sintax do penlogd é:

    # penlogd -l arquivoDeLog -p ArquivoPid Porta

vamos utilizar como exemplo a porta 901, o arquivo de log /var/log/access.log, arquivo de pid /var/log/penlogd.pid.

    # penlogd -l /var/log/access.log -p /var/log/penlogd.pid 901

agora devemos configurar os servidores para mandar os logs para o pen, vamos utilizar o apache como exemplo, para isto configure os logs do apache assim:

CustomLog "|/usr/local/bin/penlog SevidorPenlogd 901" common

agora já temos todos os logs centralizados, e podemos utilizar o awstats ou o webalizer para análise de logs.

NOTA: Proteja as portas do penctl e do penlogd com um firewall.

Pronto temos o pen configurado.

Agora vamos configurar a redundância entre os balanceadores de carga.

O que é o FreeVRRPd?

O FreeVRRPd é um daemon compatível com a RFC2338 que traz detalhes sobre o Virtual Router Redundancy Protocol, que é um protocolo de monitoramento dinâmico de rede, onde o principal objetivo é fazer roteadores redundantes a prova de falha. O FreeVRRPd funciona apenas em redes IPv4. Abaixo veja algumas funcionalidades do FreeVRRP

Compatível com FreeBSD, NetBSD e OpenBSD.
Suporte a múltiplos VRID
O Master(Servidor Primário) anuncia seu estado enviando pacotes em multcast via BPF
Muda as de rota em IP em 3 segundos
Envia requisições ARP para limpar a cache ARP de todos os hosts
Eleição entre diferentes servidores escravos com diferentes propriedades.
O mesmo host pode ser Escravo e mestre na mesma hora para diferentes VRID
Os escravos automaticamente deixam seu estado se o mestre voltar
Suporte a autenticação em texto puro, como descrito na RFC2338
Suporte a mascara de rede para endereços de IP virtual.

Como o FreeVRRPd Funciona

O FreeVRRPd é um protocolo de redundância de roteadores. Exemplificando o que ele faz é, existem dois roteadores, um mestre e um escravo, o mestre possui um endereço de IP, e os clientes se comunicam com o mestre, caso o mestre venha a falha, cair, ou algo que faça a interface de rede se desconectar, o roteador escravo assumirá os endereços do Mestre, assim, o problema será resolvido de forma trasnparente aos usuários. Se o roteador mestre voltar, o escravo abandonará os endereços do mestre.

Instalando FreeVRRPd

O FreeVRRP está disponível via ports no diretório /usr/ports/net/freevrrpd, para instala-lo faça o seguinte:

# cd /usr/ports/net/freevrrpd
# make install

Pronto ele está instalado sem mais perguntas.

Configurando o FreeVRRPd

O FreeVRRPd trás somente o arquivo de exemplo de configuração em /usr/local/etc/freevrrpd.conf.sample, o arquivo de configuração que ele irá ler é /usr/local/etc/freevrrpd.conf, então copie ou faça um arquivo novo, como desejar.

O meu arquivo de configuração ficou como o abaixo:

        #Frente para a internet
[VRID]
serverid = 1
interface = fxp0
priority = 255
addr = 200.18.15.14
password = vrid1
vridsdep = 2

#Frente para os servidores
[VRID]
serverid = 2
interface = fxp1
priority = 255
addr = 10.0.70.1
password = vrid2
vridsdep = 1

Vamos intender as opções:

[VRID]      Cria uma nova identificação, como se fosse uma nova seção de configuração.
serverid   Identificador da seção
interface  Interface em que ele atuará
priority      A prioridade da seção, se for 255 ele é mestre, se for menor ele é escravo, se existirem dois escravos, o de maior prioridade assumirá.
addr          Endereço de IP/Mascara de rede
password Senha para comunicação entre os roteadores
vridsdep   Dependência, a seção qual o endereço depende, no caso acima, se o id 1 desativar o id 2 também será desativado, e vice-versa.

Existem mais algumas opções para o arquivo de configuração, para ver todas, veja freevrrpd(8).

Em nosso exemplo, instalamos o FreeVRRPd nos dois balanceadores de carga, e utilizamos o mesmo arquivo de configuração, só alteramos os prioridades, 255 para o mestre e 100 para o escravo.

Para iniciar o vrrpd vá para o diretório /usr/local/etc/rc.d/ e copie o arquivo freevrrpd.sh.sample para freevrrpd.sh, ele é um script de inicialização que aceita os comandos start e stop, e não precisa de nenhuma variável no rc.conf.


Mais uma excelente contribuição de Daniel Bristot de Oliveira.

Comentários
CARP
Por Augusto em 17/07/2006 12:33:24
Legal Daniel, muito bom, eu nao conhecia esse pen. Se futuramente voce puder fazer um artigo sobre CARP e tracar alguns comparativos com VRRP seria bem legal.
Carp
Por Este endereço de e-mail está sendo protegido de spam, você precisa de Javascript habilitado para vê-lo em 17/07/2006 14:02:28
Muito Obrigado Augusto, o teste do carp já está no meu To Do List.
Legal Daniel
Por Augusto em 17/07/2006 17:16:53
Muito bom, fico feliz em saber que esta na lista. Seus artigos sao geralmente bem claros, continue nos brindando com eles. 
 
Vlw
Balanceamento
Por Este endereço de e-mail está sendo protegido de spam, você precisa de Javascript habilitado para vê-lo em 11/08/2006 13:13:45
Daniel, 
li sua informações aqui no site e achei muito proveitosas. Meu nome é Jair, fiz téc.telecom. no CEFET- PR, Tec.Sistemas de Informação na OPET-PT e agora estou fazendo pós em Redes e Telecom. na Unicenp. Em uma das materias tenho fazer um seminário sobre "balanceamento de cargas". Gostaria de verificar se existe possibilidade de você me indicar materiais para pesquisa. 
 
Abraço
System Engineer
Por Marcelo Moreira Martins em 14/11/2006 20:28:04
Parabéns Daniel, 
Gostaria de saber se você já realizou balanceamento de carga com servidores web em https e com assinaturas digitais ssl v3.0 x509 ? se positivo qual a solução adotada. 
 
Att 
Marcelo


Comente!*
Nome:
E-mail
Homepage
Título:
Comentário:

Código:* Code

Última Atualização ( 12/08/2006 )
 
< Anterior   Próximo >
FUG-BR - Espalhando BSD
Dicas Rápidas:

Após sincronizar o Ports, para atualizar seu INDEX de aplicações se você tiver portupgrade instalado, digite:

portsdb -Uu 

Se não tiver portupgrade:

cd /usr/ports/
make fetchindex

 




Wallpapers
FreeBSD Security Advisories
  • FreeBSD-SA-08:10.nd6
  • FreeBSD-SA-08:09.icmp6
  • FreeBSD-SA-08:08.nmount
  • FreeBSD-SA-08:07.amd64
  • FreeBSD-SA-08:06.bind
  • FreeBSD-SA-08:05.openssh
  • FreeBSD-SA-08:04.ipsec
  • FreeBSD-SA-08:03.sendfile
  • FreeBSD-SA-08:02.libc

  • Online:
    Nós temos 17 visitantes online


    Devil Store - Sua loja BSD
    FreeBSD Brasil LTDA

    FUG-BR: Desde 1999, espalhando BSD pelo Brasil.