Balanceamento e alta disponibilidade com Bonding

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".

[ Hits: 110.293 ]

Por: Willian Itiho amano em 07/12/2006 | Blog: http://underlinux.com.br


Módulo bonding



Nas distribuições mais novas o módulo bonding já vem compilado como módulo do kernel, precisando apenas ser configurado e carregado. Se a sua distribuição não possui, você pode recompilar o kernel e habilitar o módulo "bonding".

Para verificar se a sua possui, 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á possui 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 você 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 disponibilidade.

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-o para 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 múltiplas interfaces bonding


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

Para criar vários dispositivos bonding com opções diferentes é necessário iniciar o driver do bonding várias vezes. Para iniciar várias instâncias do módulo para especificar nomes diferentes para cada instância 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 instâncias quiser.

Página anterior     Próxima página

Páginas do artigo
   1. Introdução
   2. Módulo bonding
   3. Interface virtual bond
   4. Testes, automatização e referências
Outros artigos deste autor

Montando um servidor Linux com sshfs no SuSE

Clonando HDs via rede com G4U (Ghost for UNIX)

Sistema de backup com dar

Software livre, interoperabilidade, padronização e usuários leigos

Gravando com cdrecord

Leitura recomendada

Como instalar o Linux (Debian) no Libretto 50CT

Trazendo toda a usabilidade do GNOME 2 para o GNOME 3 do Ubuntu 11.10

Nagios - Instalação e configuração

Instalando MRTG + rrdtool no Slackware 12.0

Configuração manual dos ponteiros do mouse

  
Comentários
[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?

[2] Comentário enviado por White_Tiger em 07/12/2006 - 17:28h

Caro flavio. Ele não fará não. Este método eh para fazer balanceamento do mesmo link entre duas placas.

[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)?

[ ]'s

[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.

[6] Comentário enviado por shocker em 10/12/2006 - 14:31h

Tiger, parabéns pelo artigo. Muito bem explicado e de simples entendimento e linguagem! Continue contribuindo com a comunidade.

Um abraço.

[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.

[9] Comentário enviado por Edy em 11/12/2006 - 15:02h

Excelente artigo. Já precisei disso uma vez e não soube como implementar. Agora ficou fácil.

[10] Comentário enviado por luiscarlos em 11/12/2006 - 21:17h

Obrigado White_Tiger pela resposta, me ajudou muito, obrigado mesmo. Continue assim que a comunidade agradece.

[11] Comentário enviado por bestmix em 12/12/2006 - 13:15h

boa véio mandou bem , seguinte voce como fazer altadisponibilidade em dois servidores , eles trabalhariam espelhados.

[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....

vlwww

[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)

[16] Comentário enviado por White_Tiger em 19/12/2006 - 11:56h

Achei uma sitação sobre esse mesmo problema mas a página tava em japonês (ou chines sei lah), então não ajuda nada.

[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"

[18] Comentário enviado por rduarte em 03/02/2007 - 09:51h

gostaria de saber se ele funciona com samba tente implementar aqui mais na funcionou o samba

[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.

Poste ae qual o seu problema.

[20] Comentário enviado por segundow em 15/02/2007 - 11:38h

Ótimo artigo White_Tiger. Funcinou quase que perfeitamente. A minha internet não funciona quando eu ativo o bonding. Pode me ajudar?
Abraços

[21] Comentário enviado por White_Tiger em 15/02/2007 - 11:44h

Caro segundow, pelo jeito não funcionou perfeitamente.

A internet não funcionar eh muito vago.

Depende da sua extrutura. Pode ser erro na configuração, erro no dns, ip, mascara, gateway, rotas extras.

De uma explicação da sua extrutura ae para ver se eu consigo ajudar.

[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:

segundo_222@hotmail.com

[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.

[24] Comentário enviado por segundow em 16/02/2007 - 15:28h

Resolvido.... muito obrigado...

abraços

[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

Espero ter ajudado.


abraços


Segundow

[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

[27] Comentário enviado por oberdan.soares em 18/04/2008 - 17:03h

Boa Tarde, estou com problema quando vou usar o bonding em modo 1... que seria o backup:

eth0 - 192.168.200.1 -> rede interna
eth1 - 192.168.0.2 -> gvt - link principal
eth2 - 192.168.1.2 -> brt

adicionei no /etc/modules.conf.local

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

dei os comandos:

ip addr add 192.168.0.2/24 brd + dev bond0
ip link set dev bond0 up
ifenslave bond0 eth1 eth2

digitei os comandos sem problema... mas a eth1 e a eth2 ficou com o ip 192.168.0.2...

deixei os 2 modem.. com o ip 192.168.0.1

estava sem nenhuma rota configurada, adicionei a rota

route add default gw 192.168.0.1

do meu micro pinga

mas perde pacote pra cara*** quando tiro um dos cabos de rede, o ping funciona filé... oq pode estar errado nessa configuracao?

[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.

Uso o ubuntu 9.04 desktop

Obrigado!

[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?

[32] Comentário enviado por batista em 28/07/2012 - 01:32h


Bom artigo. Agora quem usa Mandriva nas versoes 2010 e 2011 pode fazer uso desta tecnica seguindo este link http://www.mandrivabrasil.org/site/forum/index.php?topic=13203.0
Fiz as configuraçoes conforme esta no link e funcionou de primeira.



Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts