FUG-BR / Grupo Brasileiro de Usuarios de FreeBSD - Balanceamento de carga e redundncia para Servidores Web.
 
08.07  
Inicio arrow Artigos arrow Balanceamento de carga e redundncia para Servidores Web.
Principal
Inicio
Noticias
Artigos
Regras da Lista
Assinar a Lista
Histrico da Lista
Forum
Keyserver
PC-BSD: Artigos
PC-BSD: Notcias
Galeria de Imagens
Contador Usurios FUG
FUGs Estaduais
Downloads
Enquetes
FAQ
Resumo do Site
Links
Pesquisar
Contato
Sobre a FUG-BR
RSS / Twitter
-
DOC-BR (FUG BR)
Introduo
Projeto DOC-BR
Handbook
FAQ Oficial
-
+ Noticias
Alertas de Seguranca
Alertas em Ports
BSD em Geral
DaemonNews (Ingles)
MyFreeBSD
Todas Categorias
-
Login
Nome de Usurio

Senha

Lembrar login
Esqueceu sua senha?
Sem conta? Crie uma


Balanceamento de carga e redundncia 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.

Comentrios
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 endereo 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 endereo 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 informaes aqui no site e achei muito proveitosas. Meu nome Jair, fiz tc.telecom. no CEFET- PR, Tec.Sistemas de Informao na OPET-PT e agora estou fazendo ps em Redes e Telecom. na Unicenp. Em uma das materias tenho fazer um seminrio sobre "balanceamento de cargas". Gostaria de verificar se existe possibilidade de voc me indicar materiais para pesquisa. 
 
Abrao
System Engineer
Por Marcelo Moreira Martins em 14/11/2006 20:28:04
Parabns 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 soluo adotada. 
 
Att 
Marcelo
vOHmOvMbAlGBYwJqdS
Por Hazuki em 27/11/2012 14:00:40
Your tihnnikg matches mine - great minds think alike!
Por Francisco Silveira em 19/12/2012 13:14:49
Ol Daniel, voc ainda tem a imagem HA.jpg ? Ela no est aparecendo mais no artigo. 
 
* Ser que suas instrues ainda valem para FreeBSD 9? 
 
Grande abrao 
Francisco
Log do apache
Por Thiago M. Figueiredo em 05/03/2013 16:34:42
Opa Daniel, 
O pen funciona muito bem, s que estou tendo dificuldade com os logs no apache preciso. Tenho uma duvida sobre o penlog. 
Em qual servidor devo colocar o penlog rodando? 
 
Muito obrigado


Comente!*
Nome:
E-mail
Homepage
Ttulo:
Comentrio:

Cdigo:* Code

ltima Atualizao ( 12/08/2006 )
 
< Anterior   Prximo >
FUG-BR - Espalhando BSD
Dicas Rpidas:
 






Wallpapers
Sua Opiniao
Online:
Ns temos 20 visitantes online


Devil Store - Sua loja BSD
FreeBSD Brasil LTDA

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