Balanceamento e alta disponibilidade com Bonding

Esta contribuição está participando do sorteio da Mochila Targus Matrix. Envie seu texto e participe você também, você contribui com outros usuários e ainda pode faturar uma mochila novinha em folha para o seu laptop. Saiba mais sobre como participar.

Sobre o Autor:

Willian Itiho Amano (WhiteTiger) – itihoitiho@gmail.com
www.whitetiger.com.br

==Introdução==

Este tutorial tem o objetivo de explicar como fazer o seu servidor trabalhar com alta disponibilidade e balanceamento de cargas fazendo múltiplas interfaces de rede responderem como se fosse uma. Utilizaremos aqui o módulo do kernel ”'”bonding””’.

Estarei utilizando neste artigo o Open Suse 10.1. Logo, se o seu for diferente deverá fazer os devidos ajustes.

==Modos de operação do Bonding==

O Bonding possúi diversos modos de operação mas vou apresentar aqui os dois principais

*balance-rr ou modo 0

Neste modo todas as interfaces estão ativas e fazem balanceamento de carga (load balance) trabalhando em velocidade igual a soma de suas velocidades separadas (duas placas de rede 10/100 trabalharão como uma de 200) e ainda faz alta disponibiliada, pois o serviço continua ativo mesmo se alguma dessas interfaces pararem por qualquer motivo (como cabo rompido).

*active-backup ou modo 1

Neste modo apenas a alta disponibilida é implementada. Não é feito o balancemento de carga pois uma placa fica como master e outra como slave. Se a marter parar de responder a slave assume.

==Módulo bonding==

Nas distribuições mais novas o módulo bonding já vem compilado como módulo do kernel, precisando apenas ser configurado carregado. Se a sua distribuição não possúi, vc pode recompilar o kernel e abilitar o módulo ”'”bonding””’.

Para verificar se a sua possúe utilize o seguinte comando:

# find /lib/modules/`uname -r`/ | grep bonding
/lib/modules/2.6.16.21-0.25-default/kernel/drivers/net/bonding
/lib/modules/2.6.16.21-0.25-default/kernel/drivers/net/bonding/bonding.ko

Se você conseguiu um resultado parecido o seu sistema já possúe o módulo bonding compilado.

Para carregarmos o módulo utilizamos a seguinte sintaxe:

# modprobe bonding

Fazendo desta forma não temos a opção de configurar o módulo e ele trabalhará com a configuração default (modo balance-rr) e não subirá na inicialização.

===Configurando o módulo bonding===

Iremos configurar o módulo do bonding e criaremos um alias para o mesmo. O alias é interessante em situações que vc deseja fazer mais de um bonding na mesma máquina como no caso de haver 4 interfaces de rede e desejar responder por 2 placas fazendo alta disponibiliadade.

No suse o arquivo que configura os módulos é o “/etc/modprobe.conf” que no final faz um include do arquivo “/etc/modprobe.conf.local”. Como este segundo arquivo é menor utilizaremos-opara melhor organizar a nossa configuração. Inclua neste arquivo as seguinte linhas:

alias bond0 bonding
options bond0 mode=0 miimon=100 downdelay=200 updelay=200

Troque o ”’mode=0”’ por ”’mode=1”’ caso deseje utilizar o modo active-backup.

Com essas opções o seu módulo já subirá na inicialização do sistema.

===Configurando multiplas interfaces bonding===

Se desejar configurar várias dispositivos bonding com diferentes opções de rede devemos alerar a inicialização dos módulos

Para criar vários dispositivos bonding com opções diferentes é neceessário iniciar o driver do bonding várias vezes. Para iniciar várias intancias do módulo para especificar nomes diferentes para cada instancia. Faremos da seguinte forma:

#bonding para a placa eth0 e eth1
alias bond0 bonding
options bond0 -o bond0 mode=0 miimon=100 downdelay=200 updelay=200

#bonding para a placa eth2 e eth3
alias bond1 bonding
options bond1 -o bond1 mode=1 miimon=100 downdelay=200 updelay=200

Veja que aqui temos diferentes tipos de bonding configurado. Podemos especificar quantas intancias quanto quiser.

==Interface virtual bond==

Criaremos aqui a interface bond0 (ou outro nome que utilizou no alías) e atribuiremos as configuraçõs de rede.

*Obs.: Não atribuiremos aqui o endereço físico da placa pois ele pegará a da primeira placa que subir mas pode ser atribuído com a mesma sintaxe do comando ifconfig.

Atribuiremos um ip e sua respectiva máscara (neste caso 255.255.255.0 ou /24) e subiremos a placa

# ip addr add 192.168.0.254/24 brd + dev bond0
# ip link set dev bond0 up

Caso fosse duas ou mais interfaces bonding faríamos assim:

# ip addr add 192.168.0.254/24 brd + dev bond0
# ip link set dev bond0 up
# ip addr add 10.1.0.254/24 brd + dev bond1
# ip link set dev bond1 up

==Configurando as interfaces físicas==

O próximo passo é dizer ao driver quais interfaces de redes físicas (neste caso eth0 e eth1) irão fazer parte deste TEAM, constituindo a interface lógica bond0.

ifenslave bond0 eth0 eth1

Novamente se fossem duas iterfaces bonding ficaria assim:

ifenslave bond0 eth0 eth1
ifenslave bond1 eth2 eth3

==Testes==

Neste ponto o bonding já deve estar funcionando. Você pode testar mandando a máquina pingar em algum canto (seu roteador por exemplo) com os dois cabos de rede. Faça o teste de tirar um cabo e veja se parou de pingar. Coloque novamente e tire o outro. Verifique se parou de pingar. Se não parou está correto.

==Automatizando o processo==

As configurações funcionaram perfeitamente mas e se seu servidor reiniciar? Logicamente ele não vai funcionar. O que faremos? Simples. Colocaremos um script que faça estes comandos para nós. Este script estará em /etc/inid.d/ com o nome de bond:

#!/bin/bash
#
# Script criado para subir as placas de rede eth0 e eth1
# em bonding mode=0 (alta disponibilidade e load balance)
# Este Script é colocado em /etc/inid.d/bond
#
# É também criado um link para este em:
# /etc/inid.d/rc2.d/wbond
# /etc/inid.d/rc3.d/wbond
# /etc/inid.d/rc5.d/wbond
# O nome do link wbond é para ele ser iniciado depois de todos os processos
# Na verdade só é necessário que rode depois do script de rede
#
# É também criado o link em /bin/bond para que o comando “bond” fique no PATH
#
# Data de criação: 24/11/2006
# Última Alteração: 29/11/2006
# Autor: Willian Itiho Amano – WhiteTiger (willian@underlinux.com.br)
#
#
#

#Faz um include para utilizar o comando que mostra quando a opção terminou corretamente ou com falha
. /etc/rc.status

#IP que o bonding vai reponder
IP_BONDING=”xxx.xxx.xxx.xxx”

#mascara que o bonding utilizará
MASC_Bonding=”24″

#IP da placa extra
IP_EXTRA=xxx.xxx.xxx.xxx

#Mascara da placa extra
MASC_EXTRA=”255.255.255.255″

case “$1” in
start*)
echo “Iniciando as placas de rede em modo bonding”
#Derruba todas as placas
ifconfig eth0 down
ifconfig eth1 down
ifconfig eth2 down
ifconfig bond0 down

#Derruba todos os módulos das placas de rede
rmmod e1000
rmmod tg3

#Sobe os módulos na odem certa eth0 e eth1 são as onboard
modprobe tg3
modprobe e1000

#Configura a placa off
ifconfig eth2 $IP_EXTRA netmask $MASC_EXTRA

#configura a rota default (gateway)
route add default gw 200.142.11.129

#Espera que o módulo das placas estarem preparados para receber as configurações do bonding (Não. Elas não estarão prontas automaticamente após o levantamento do módulo). Tempo de 5 segundos.
sleep 5

#Atribue as configurações de rede do bond0
ip addr add $IP_BONDING/$MASC_Bonding brd + dev bond0

#Sobe a interface bond0
ip link set dev bond0 up

#Atribue as interfaces eth0 e eth1 como slave de bond0
ifenslave bond0 eth0 eth1
rc_status -v
;;
stop)
echo “Derrubando as placas de rede em modo bonding”

#Esse comando derruba a interface bonding e consequentemente a eth0 e eth1.
ip link set dev bond0 down

#Não é necessário derrubar os módulos e as configurações das placas de rede pois os scripts de finalização do linux se encarrega disso.
rc_status -v
;;
restart)
$0 stop
$0 start
;;
status)
#Checa o status do bonding pois o ifconfig não apresenta corretamente as configurações
cat /proc/net/bonding/bond0
;;
*)
#Se o cara não entrar com start, stop ou status mostra essa mensagem
echo “Utilize $0 {start|stop|restart|status}”
esac

De permissão de execução ao arquivo:

#chmod a+x /etc/init.d/bond

Agora temos de configurar para iniciar nos diversos init (2, 3 e 5). Para isto temos de colocar um link simbólico nas respectivas pastas rc2.d, rc3.d e rc5.d que encontram-se dentro de /etc/inid.d.

Os arquivos desas pastas são iniciadas por ordem alfabética então colocaremos o script do bond por último mudando o nome do link simbólico da sequinte maneira:

# ln – /etc/inid.d/bond /etc/inid.d/rc2.d/wbond
# ln – /etc/inid.d/bond /etc/inid.d/rc3.d/wbond
# ln – /etc/inid.d/bond /etc/inid.d/rc5.d/wbond

==Referências==

*http://linux-net.osdl.org/index.php/Bonding
*http://www.vivaolinux.com.br/artigos/verArtigo.php?codigo=4564&
*http://www.redhat.com/docs/manuals/enterprise/RHEL-4-Manual/ref-guide/s1-networkscripts-interfaces.html
*http://www.gentoo.org/doc/pt_br/handbook/handbook-x86.xml?part=4&chap=3