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".
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:
# vim /etc/init.d/bond
#!/bin/bash
case "$1" in
start)
#Derruba as configurações que foram configuradas anteriormente das placas de rede
ifdown eth0
ifdown eth1
#Configura a interface bond0
ip addr add 192.168.0.254/24 brd + dev bond0
#Sobe a interface
ip link set dev bond0 up
#Atribue as interfaces físicas eth0 e eth1 na interface lógica bond0
ifenslave bond0 eth0 eth1
;;
stop)
#Derruba a interface lógica e consequentemente as interfaces físicas
ip link set dev bond0 down
;;
*)
#Se não for start nem Stop ele monstra aviso na tela
echo "Use: $0 {start|stop|}"
exit 1
;;
esac
Dê 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 dessas 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 seguinte maneira:
[1] Comentário enviado por flaviocc em 07/12/2006 - 16:55h
Muito interessante este seu artigo,
vou fazer alguns testes aki,
mas me diga, se eu tiver 2 conexões adsl (ppp0 e ppp1), ambas de 512k
posso colocar um bounding 0 e ficar com uma conexão de 1M?
ele irá balancear os dois links?
[3] Comentário enviado por jaca69 em 07/12/2006 - 20:03h
Como é realizado o balancemento de carga em cada placa? Isto é automático? O tráfego em cada placa é sempre o mesmo, ou seja se tenho uma aplicação que exige de meu servidor um taxa de 33 Mbps cada placa ficará com 16,5 Mbps?
[4] Comentário enviado por agk em 08/12/2006 - 14:38h
Muito bom o artigo, parabéns.
Agora só uma dúvida sobre esse bonding, o funcionamento dele é algo parecido com a função Link Aggregate da IEEE 802.3ad (agregação de links) que estão disponíveis em alguns equipamentos de rede (switches por exemplo)?
[5] Comentário enviado por White_Tiger em 09/12/2006 - 18:16h
agk, a idéia eh exatamente esse esse só que o link aggregate eh apenas entre equipamentos de rede. No caso de servidores (linux) ele chama bonding. Se não me engano em máquinas hpux chama-se trunk.
[7] Comentário enviado por luiscarlos em 10/12/2006 - 20:56h
Gostei muito do seu artigo, é algo novo aki no VOL, adoro isso, mas tenho uma pergunta bem simples, como é a ligação fisica de um link em duas placas de rede, imagino assim
porta0---->eth0
internet -->modem/roteador ----> pc
porta1---->eth1
ou talvez com a ajuda de um switch ou hub entre o modem/roteador e o pc?
[8] Comentário enviado por White_Tiger em 10/12/2006 - 22:25h
O sistema de bonding é para ligar com um switch, dae caso ocorra de uma porta queimar ou algum problema no cabo, o sistema ainda fica ativo. Você pode utilizar um modem dos que possuem um switch interno como 2 ou 4 portas.
O bonding faz balanceamento de carga entre duas placas de rede para o mesmo destino e alta disponibilidade. Não chega a fazer balanceamento de links.
Algumas coisas ficaram confusas neste meu tutorial então eu gostaria de poder altera-lo mas a vivaolinux não permite isso. Eu vou dar uma alterada no que está hospedado na underlinux em: http://under-linux.org/wiki/index.php/Tutoriais/Redes/Bonding e acredito que as dúvidas ficarão sanadas.
[12] Comentário enviado por peterpan em 19/12/2006 - 09:22h
Bom artigo. Mais ocorre o seguinte, quando subo o bond0 ocorre a mensagem "failed to get speed/duplex from eth0", fazendo o teste quando é retirado o cabo eth0 , a eth1 perde pacotes por um tempo quando coloco o cabo novamente demora cerca de um minuto para subir a placa, já quando tiro o eth1 e coloco novamente ela sobe instantaneamente. O bonding está operando em modo 0, o que pode estar acontecendo com a eth0, .?.,
[13] Comentário enviado por White_Tiger em 19/12/2006 - 09:48h
O que me parece eh que o bonding não está conseguindo pegar as configurações certas da sua eth0. Talvez esta esteja com algum problema. São placas diferentes? Tente trocar a eth0 por outra placa e posta o que aconteceu.
[14] Comentário enviado por peterpan em 19/12/2006 - 11:14h
São placas diferentes, troquei a 3com que estava na eth0 por outra 3com e continuou o mesmo problema, demorava cerca de 20 segundo para subir a placa, mais com teste em outra placa , uma Accton agora, o bonding pega as configurações instantaneamente, ta funcionando com uma Accton na eth0 e uma Realtek na eth1. Sera que existe alguma incompatibilidade com algum tipo de placa.?. ou deve ser o Debian aqui que esta com drivers errados....
[15] Comentário enviado por White_Tiger em 19/12/2006 - 11:53h
Quanto ao bonding não acredito que seja incompatibilidade. O que pode estar acontecendo é um erro no módulo da placa.
Eu fiquei curioso e fui procurar. Achei inclusive citação de um cara que fez um cluster com 32 nós, usando em cada um 2 ou 3 placas 3com em bonding. Pode ser que o módulo que ele use seja diferente do que você usa (depende do modelo da placa). Pode ser também que a sua placa não suporta esse tipo de acesso como setar o speed/duplex. Existem caso assim.
Tente colocar duas placas 3com e me fala o que acontece. (detalhe. Eu tive um problema sério com placas iguais no meu servidor. Ele ficava trocando a cada boot a ordem das placas, então é interessante fazer o módulo bonding subir logo no início do boot, ou seja, nas primeiras linhas do /etc/modprobe.conf)
[17] Comentário enviado por White_Tiger em 19/12/2006 - 12:06h
Achei a solução. O problema é que a sua placa é giga neh? O bonding está tentando setar a velocidade 100/full. Oq vc pode fazer? Atualize o bonding (vai ter que compilar o kernel) e a mensagem passará a ser "speed assumed to be"
[19] Comentário enviado por White_Tiger em 03/02/2007 - 14:25h
rduarte, não há nenhum empecílio quanto ao uso com samba (eu já vi fazerem), até pq aos sistemas isso não faz a menor diferença. Isso está a nível de sistema operacional (kernel) e todos os serviços rodam em cima sem a menor diferença.
[22] Comentário enviado por segundow em 16/02/2007 - 14:25h
Olá White_Tiger. Então, eu esqueci de mencionar. Eu uso o Slackware. Nele nós temos um script (/etc/rc.d/rc.inet1) que inicializa as placas de rede e a interface de loopback. Esse script utiliza o comando ifconfig para fazer as atribuições de endereços às interfaces de rede. Pelo o que eu percebi utilizei o comando route para atribuir os endereços às interfaces para poder usar a técnica de bonding. Segui todos os seus passos e funcionou tudo certinho, e como havia dito antes, a internet não. Eu acredito que seja porque não indiquei o gateway no script do bonding. Relembrando que no /etc/rc.d/rc.inet1 eu informo o gateway.
Segue aqui o script que você disponibilizou para ativar o bonding, com as devidas alterações para que ele funcione no Slackware:
#!/bin/bash
case "$1" in
start)
#Derruba as configurações que foram configuradas anteriormente das placas de rede
ifconfig eth0 down
ifconfig eth1 down
#Configura a interface bond0
ip -f inet addr add 10.1.0.70/16 brd + dev bond0
#Sobe a interface
ip link set dev bond0 up
#Atribue as interfaces físicas eth0 e eth1 na interface lógica bond0
ifenslave bond0 eth0 eth1
;;
stop)
#Derruba a interface lógica e consequentemente as interfaces físicas
ip link set dev bond0 down
;;
*)
#Se não for start nem Stop ele monstra aviso na tela
echo "Use: $0 {start|stop|}"
exit 1
;;
esac
Espero não ter sido muito confuso. Qualquer coisa me adicione no MSN para nós conversarmos:
[23] Comentário enviado por White_Tiger em 16/02/2007 - 14:48h
Cara, veja o seguinte. Eu estou sem slack aqui para testar mas vamos lah.
Posta a sua listagem de rotas (comando "route")
Vc consegue pingar em alguma outra máquina da rede 10.1.0.74/16?
O que eu acho que está acontecendo é que você não tem rota default para o gateway da sua rede. Por padrão ele só vai adicionar a rota para esta rede então adicione a seguinte linha logo abaixo do "ifenslave bond0 eth0 eth1": route add default gw <ip_do_gateway>
Faça o teste rodando o script. Se não der certo posta o resultado do seu ifconfig e do comando route.
[25] Comentário enviado por segundow em 23/07/2007 - 16:47h
Olá todos do VOL. Tentanto usar o bonding no slack 12.0 (kernel 2.6.21.5) tive problemas com as interfaces de rede eth0 e eth1 (usando as duas placas para fazer o bonding). Quando eu tentava desativar o bonding com o script que postei acima, por algum motivo as duas interfaces (eth0 e eth1) continuavam "amarradas" ao bonding. Por que isso acontecia? Porque logo no começo do script atribuimos as interfaces físicas (eth0 e eth1) a interface lógica (bond0). Resolvi isso adicionando uma linha no script. Essa nova linha é um comando que desliga as interfaces do bonding. A grosso modo o bonding é desativado, mas quando tentamos novamente ativá-lo é acusado o seguinte erro:
RTNETLINK answers: File exists
Illegal operation: The specified slave interface 'eth0' is already a slave
Master 'bond0', Slave 'eth0': Error: Enslave failed
Illegal operation: The specified slave interface 'eth1' is already a slave
Master 'bond0', Slave 'eth1': Error: Enslave failed
SIOCADDRT: Arquivo existe
[26] Comentário enviado por segundow em 23/07/2007 - 16:49h
esqueci de postar o script....
aí vai:
#!/bin/bash
case "$1" in
start)
#Derruba as configurações que foram configuradas anteriormente das placas de rede
ifconfig eth0 down
ifconfig eth1 down
#Configura a interface bond0
ip -f inet addr add 10.1.0.70/255.255.0.0 brd + dev bond0
#Sobe a interface
ip link set dev bond0 up
#Atribue as interfaces físicas eth0 e eth1 na interface lógica bond0
ifenslave bond0 eth0 eth1
# Atribui o Gateway
route add default gw 10.1.0.1
;;
stop)
#Derruba as interfaces físicas e consequentemente a interface lógica
# mudança realizada por Naudy Fernando Ceni II (Segundo) em 23/07/2007
# quando tentava desativar o bond0 com o kernel 2.6.21.5 no slack dava pau.
# é necessário antes desativar as interfaces físicas e depois a lógica
ifenslave -d bond0 eth0 eth1
ip link set dev bond0 down
;;
*)
#Se não for start nem Stop ele monstra aviso na tela
echo "Use: $0 {start|stop|}"
exit 1
;;
esac
[28] Comentário enviado por alphamax em 05/05/2008 - 11:34h
opá!!! então WT, esse esquema não serve para fazer dois links de internet ficarem redundante? e sim para fazer redundância entre duas placas de redes, tipo... um server que trabalha com fluxo de dados muito intenso, isso vai ajudar esse trafego ficar mais "INTELIGENTE" pelo fato de estar sendo distribuído pro duas placas de redes?
dês de já valew, gostei da sua dica.
[29] Comentário enviado por sonnykde2008 em 02/06/2008 - 22:09h
caro colega estou testando o seu artigo,mas estou tendo problemas
após criar a interface virtual bond0 ,eu não consigo adicionar as interfaces fisicas á ela ,o comando ifenslave não é reconhecido pelo sistema,uso debian etch 4.0 ,teria algum comando equivalente para minha distro
[30] Comentário enviado por nox6000 em 29/08/2009 - 21:03h
Muito Bacana o Artigo, Parabéns!!!
Eu sou um usuário de nivel intermetidario em linux.
Gostaria de saber se há como utilizar este metodo abordado para utilizar dois links do velox não pra somar a velocidade de conexão e sim para que eu possa utilizar dois modens onde as interfaces eth0 e eth1 fiquem com o dois modens.
E a eth2 fique responsavel pra liberar o sinal pra rede.
já configurei o squid para controlar o acesso externo e o pppoeconf para realizar a autenticação e já consigo fazer meu servidor conectar com um modem e liberar o sinal para a rede, mas gostaria de saber se tem como atraves desse metodo abordado pelo artigo eu compartilhar as duas conexões.
[31] Comentário enviado por tosko em 03/04/2010 - 19:36h
me exmpliquem uma coisa, se eu tiver um server com 3 placas etheret, na eth1 e eth2 cada uma ligada em um link adsl de 1mbps (ambos da mesma operadora e provedor, sendo que a autenticação é feita no modem mesmo), e eu fizer o bonding na eth1 e eth2 e sair com a conexão na eth0 (192.168.0./24) ele aumentara a velocidade da conexão? como funcionara? ou ele só fara a redundancia, tipo, quando um cair o outro assume, como funcionara?