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õesNa 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.7Neste 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:80O penctl tem a sintaxe assim:
# penctl host:porta comandoum exemplo é a saída de status em html.
# penctl localhost:900 status > status.htmlou os servidores.
# penctl localhost:900 serversExistem 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 Portavamos 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 901agora 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.