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