Algumas considerações.
Como no começo eu passei 3 máquinas para trabalho e vocês notaram que nós fizemos um cluster de 2 máquinas, então elas passaram de 2 para 1 correto?
Exemplo:
Quando o cliente vai solicitar o serviço do Apache ele não pede para o servidor debian1 ou debian2, ele pede para o cluster que tem o IP 192.168.0.3.
Então como que vamos fazer o balanceamento de somente uma máquina?
Não tem como.
Então para este exemplo precisamos de no mínimo 3 máquinas ou uma máquina e 2 clusters para fazermos o balanceamento.
Ou pegue mais uma máquina fora as duas do cluster, pare o Heartbeat dos servidores para podermos utilizar as máquinas sem o cluster para vermos como que tudo funciona, é bem simples.
Vamos configurar primeiro o arquivo
/etc/sysctl.conf da máquina que vai trabalhar como servidor de LVS e acrescente a seguinte linha no final do arquivo.
# vim /etc/sysctl.conf
[...]
net.ipv4.ip_forward = 1
Utilize o seguinte comando para salvar as alterações no arquivo:
# sysctl -p
Vamos instalar os pacotes no servidor LVS.
# aptitude install ldirectord-2 -y
Pode confirmar a instalação dos pacotes sugeridos.
Agora vamos configurar os clientes.
É a mesma configuração para os 2 clientes.
Edite o arquivo /etc/sysctl.conf e adicione as linhas como no exemplo:
# vim /etc/sysctl.conf
[...]
#Habilita a opção de ignorar ARP
net.ipv4.conf.all.arp_ignore = 1
#Ignora requisição de ARP se a requisição for feita para interface lo ou qualquer interface virtual (eth0:x)
net.ipv4.conf.eth0.arp_ignore = 1
#Habilita a opção de anuncio de ARP.
net.ipv4.conf.all.arp_announce = 2
#Evitar o anuncio do endereço de origem no cache da tabela de ARP de destino.
#indesejado para interface lo e virtuais
net.ipv4.conf.eth0.arp_announce = 2
Vamos salvar as nossas alterações.
# sysctl -p
Agora vamos voltar para o servidor e vamos configurá-lo para fazer o balanceamento.
# vim /etc/ha.d/conf/ldirectord.cf
#Arquivo de configuração principal do LVS.
#/etc/ha.d/conf/ldirectord.cf
#tempo em segundos, ate declarar que o servidor caiu.
checktimeout=2
#Tempo em segundos de checagem entre os servidores.
checkinterval=4
#Recarregar o serviço automaticamente caso o arquivo de configuração seja alterado.
autoreload=yes
#Arquivo dos logs do Ldirectord
logfile="/var/log/ldirectord.log"
#email valido para envio de informações de erro do subsistema
emailalert="ti@lan.com.br"
#Tempo em segundos para repetir a mensagem de alerta por email
emailalertfreq=3600
#definir como yes, quando um servidor real cair ele não será eliminado da lista do subsistema
quiescent=yes
#Definição dos servidor LVS.
#Interface virtual compartilhada e porta do servido.
#Nota. Cada diretiva, a partir da virtual, deve iniciar com e não com espaços
virtual=192.168.0.4:80
fallback=127.0.0.1:80 #Endereço de resposta caso todos falhem
real=192.168.0.1:80 gate #servidor real e porta. roteamento direto
real=192.168.0.2:80 gate #servidor real e porta. roteamento direto
service=http #Serviço para balanceamento.
request=".testpage" #arquivo de requisição para teste.
receive="test page" #conteúdo do arquivo, resposta a receber
scheduler=wlc #algoritmo de monitoramento.
protocol=tcp #Protocolo utilizado
checktype=negotiate #negocia a requisição e a resposta
Agora temos que criar o arquivo .testpage, que será o arquivo que o lvs iria fazer um get e conferir para ver se o servidor está ativo e o conteúdo o arquivo tem que ser test page.
Vamos criar o arquivo:
# vim /var/www/.testpage
test page
O nosso arquivo agora está criado e com o conteúdo que definimos no lvs, vamos seguir.
Obs.: Algoritmos de monitoramento podem ser encontrados no manual do ipvsadm(8). O algoritmo wlc é o padrão, ele envia mais serviços ao servidor que possui menor carga e/ou o que for mais robusto.
Agora vamos configurar os servidores de serviço.
Crie uma placa de loopback virtual com o endereço IP 192.168.0.4/255.255.255.255 em cada um dos servidores de serviço. Para que isso? Se você estiver usando o LVS, então os pacotes que chegam ao servidor-real possuem o IP de destino definidos para o servidor LVS. Então o servidor-real precisa de um meio de aceitar este tráfego como local. Uma forma é adicionar uma interface no dispositivo de loopback e escondê-la, assim ela não responderá as requisições ARP.
A máscara deve ser 255.255.255.255 porque a interface de loopback irá responder aos pacotes para _todos_ os hosts em qualquer interface configurada. Assim 192.168.0.4 com máscara de rede 255.255.255.0 fará com que a máquina aceite pacotes de _todos_ os endereços na faixa 192.168.0.0 - 10.10.10.255, o que na verdade não é o que você quer. Então vamos configurar.
# ifconfig lo:0 192.168.0.4 netmask 255.255.255.255
Pronto, agora podemos iniciar o LVS e testar.
# /etc/init.d/ldirectord stop
# /etc/init.d/ldirectord start
Se ocorrer algum erro, olhe nos arquivos de log para tentar identificar algum erro no arquivo de configuração, olhe sempre no arquivo de log do ldirectord e no syslog.
Agora para testar modifique a página inicial do Apache de cada servidor de serviço para podermos diferenciar os dois exemplos:
Digite o IP de cada servidor no arquivo index.html em /var/www/index.html.
# vim /var/www/index.html
[...]
<h1>Servidor 10.10.10.251</h1>
E faça o mesmo no segundo servidor.
Depois de tudo modificado acesse o servidor 192.168.0.4 no navegador. Note que ele está acessando um dos dois servidores e não o servidor local. Pressione F5 para dar um refresh na página e note que já está acessando o outro servidor.
Para mais informações sobre o LVS, leiam a documentação do LVS que no começo do artigo eu mencionei.
Para visualizar no servidor de LVS como que estão os serviços, digite o seguinte comando:
# ipvsadm
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.0.4 wlc
-> 192.168.0.1 route 1 0 0
-> 192.168.0.2 route 1 0 0
Na visualização temos que o Forward define o tipo de balanceamento, neste caso, roteamento direto. Weitht define se o servidor real está acessível (1) ou não (0). ActiveConn e InActconn definem, respectivamente, as conexões ativas e os pacotes que estão entrando em conexão com o serviço.
Procurem mais documentações a respeito deste assunto que é bem bacana para balanceamento de carga.