Balanceamento de carga e alta disponibilidade com Bonding Driver e Iproute2

Tem muita coisa sobre o assunto mas tanto o Bonding Driver quanto o Iproute 2 se mostram um tanto incompletos para a tarefa, então juntei ambos em uma solução muito simples e eficaz como reza o preceito da Escola Russa.

[ Hits: 83.555 ]

Por: Carlos Affonso Henriques. em 18/07/2011


Implementando o Bonding



Primeiramente verifique se o Bonding Driver está compilado como módulo em seu sistema, com o comando:

# modprobe -l | grep bonding

A saída deverá ser:

kernel/drivers/net/bonding/bonding.ko

Caso o módulo não esteja presente será preciso recompilar o Kernel e marcando-o como módulo, pois isso facilita e muito a passagem de parâmetros ao módulo durante seu carregamento, se compila-lo como built-in, isso precisará ser feito via sysfs. Não mencionarei detalhes acerca de compilação do Kernel por fugir ao objetivo do artigo.

Agora vamos configurar o bonding com o comando:

# modprobe bonding mode=balance-rr miimon=1000 arp_ip_target=xxx.xxx.xxx.xxx,yyy.yyy.yyy.yyy

Onde xxx.xxx.xxx.xxx,yyy.yyy.yyy.yyy são os endereços IP dos roteadores. O parâmetro miimon é especificado em milisegundos e verifica o estado dos links com requisições ARP e o parâmetro mode define qual será o modo de operação do bonding, em nosso caso empreguei o round-robin.

Mais detalhes sobre estes tópicos e outros podem ser verificados na documentação do Bonding Driver nos fontes do Kernel, o path é /usr/src/linux/Documentation/networking/bonding.txt. Neste mesmo diretório encontramos o fonte do ifenslave o utilitário que manipula o bond que deverá ser compilado com o seguinte comando:

# gcc -Wall -O -I/usr/src/linux/include ifenslave.c -o ifenslave

Agora copiaremos o binário executável para um diretório que esteja no PATH:

# cp /usr/src/linux/Documentation/networking/ifenslave /usr/sbin/

Agora vamos especificar o endereço MAC do bonding:

# ifconfig bond0 hw ether 00:12:ab:30:ae:9b

Como eu tive problemas com os roteadores do cliente, conforme mencionado acima, fiz diferente. Especifiquei primeiramente o MAC das interfaces de rede físicas pois o bonding pegara o endereço da primeira interface a ser adicionada. Podem estranhar eu haver atribuído o mesmo MAC para ambas as interfaces mas isso tem um propósito, como os roteadores apresentavam restrições ARP, se no futuro eu precisar trocar ou inverter a ordem das interfaces de rede simplifica e muito a tarefa:

# ifconfig eth1 hw ether 00:12:ab:30:ae:9b
# ifconfig eth2 hw ether 00:12:ab:30:ae:9b

Agora vamos levantar as interfaces de rede e o bonding. Atentem que a ordem é importante, o bond0 deve ser levantado primeiro e depois disso as interfaces físicas, que devem estar em modo promíscuo mas apenas elas e não o bonding.

# ifconfig bond0 up
# ifconfig eth2 up promisc
# ifconfig eth1 up promisc

Agregamos as interfaces ao bonding:

# ifenslave bond0 eth1 eth2

Atribuiremos os endereços IPs de ambas as operadoras ao bonding:

# ip addr add xxx.xxx.xxx.xxA/30 brd + dev bond0
# ip addr add yyy.yyy.yyy.yyyA/28 brd + dev bond0

Pronto! Agora temos um bonding totalmente funcional, falta agora apenas implementar o roteamento avançado onde inclusive dimensionaremos o peso de cada um dos links visto que são de velocidades diferentes.
Página anterior     Próxima página

Páginas do artigo
   1. Limitações, Problemas e Necessidades
   2. Implementando o Bonding
   3. O Roteamento Avançado
Outros artigos deste autor

Autenticando Documento com Blockchain e Ethereum

O que é ForceCommand

L7-filter (funcionando) no Slackware 10.2

Access Point com cartão Atheros em Slackware 12.0

Docker: Uma abordagem didática para tempos obscuros

Leitura recomendada

Instalando Apache 1.3.33 com suporte a PHP no Slackware

Virtual Host e Virtual Host Mod_Proxy

Como mostrar a música atual do seu player na sua mensagem pessoal do aMSN

Instalação do WordPress no CentOS 7

Novo EyeOS - Sistema Operacional de Computação nas Nuvens

  
Comentários
[1] Comentário enviado por vagnerfonseca em 19/07/2011 - 01:09h

Excelente artigo,

Gostei de sua idéia, pensei em algo parecida há um tempo atrás e não consegui implementar. Mas você conseguiu juntar muito bem os links.

Parabéns, espero que faça muitos outros assim.

[2] Comentário enviado por tiekookeit em 19/07/2011 - 08:30h

fo dás ti co!

[3] Comentário enviado por m4sk4r4 em 19/07/2011 - 10:46h

Carlos,

Gostei muito do seu artigo.
Hoje eu tenho um ambiente com o iproute2, onde tenho dois links de operadoras de diferentes, em um eu deixo o acesso a internet e serviço de hospedagem e outro eu deixo só pra sair email, faço as marcações via iptables e uso iproute2 para direcionar a saída. Só que quando um dois links cai, para não ficar sem os serviços utilizados por aquele link que caiu eu tenho que rodar um script para direcionar todos os serviços parao outro link que esta ativo, ou seja, existe um processo mecânico, e o que me parece que eu possa melhorar o meu ambiente através desse seu artigo, onde ficaria transparente o estado down de cada link.

É pergunta é, o bonding + iproute2 consegui verificar a disponibilidade do link, caso algum venha a falhar, ele pare de enviar pacotes para aquele link até que o mesmo seja restaurado?

Parabéns pelo artigo!!!

Abraço,

[4] Comentário enviado por capitainkurn em 19/07/2011 - 12:51h

m4sk4r4! Se você simplesmente desconectar um cabo de rede o próprio bonding se encarega de desviar o tráfego pela interface remanescente em poucos segundos, mas se o problema for por exemplo no gateway da operadora, a recuperação é mais demorada visto que o iproute 2 enviará um pacote por um link, na ausência de resposta ele o reenviará pelo link seguinte. Ele terá também que reescrever o cache de rotas com novas entradas. No geral basta que os clientes abram novas sessões de seus programas clientes para reestabelecer o funcionamento normal.

[5] Comentário enviado por removido em 20/07/2011 - 19:49h

Ja trabalho com iproute; agora com Bonding ficara show!!!

Muito bom mesmo!!!
Parabéns!!!

[6] Comentário enviado por tosko em 20/07/2011 - 23:26h

cara muito bem bolado esta solução sua, caiu na hora certa pra mim aqui no vol pois preciso implementar 3 servidores aqui na cidade e ambos tem 2 links.

atualmente eu faço assim, marco os pacotes e direciono 80 443 para um link (de preferencia o maior) e o resto para o outro link, aqui no server onde trabalho que é um servidor de arquivos muito acessado pelo pessoal da produção artistica eu fiz um bonding em duas placas de rede gigabit para a rede local, ou seja, dois clientes conseguem copiar simultaneament a 1gbp/s cada, totalizando os 2 gigabits.
lendo seu artigo me surgiu algumas duvidas:
1 - com este modelo vc não tera problemas com sites https? pois teoricamente os pacotes sairam aleatoriamente um por um link e outro por outro né?
2 - eu consigo fazer isto com links adsl's de mesma operadora normalmente? ou tem que ser links dedicados?
3 - porque vc preferiu adotar este padrão de juntar os links e entercalar os pacotes ao inves de separar por tipo de pacote?
4 - nesta implementação vc utilizou algum sistema de controle de banda? teve algum problema devido o gateway ser uma interface bond?

[7] Comentário enviado por removido em 21/07/2011 - 23:25h

Muito bom teu artigo !


Abraço.

[8] Comentário enviado por gabrielramos em 25/07/2011 - 17:47h

Isso da pau!!!

[9] Comentário enviado por tosko em 27/07/2011 - 22:27h

autor poderia responder minhas perguntas?

[10] Comentário enviado por capitainkurn em 01/08/2011 - 01:02h

respondendo ao Tosko:

1 - Não o https funciona sem problema algum, o único problema que pode ocorrer independentemente do balanceamento de links são aplicativos semelhantes ao conectividade social da Caixa Econômica, ou de biometria do Detran-RJ que tem o costume de empregar https em portas fora de padrão ( não 443 ) mas isso é por causa do proxy e não do balanceamento.

2 - Sim, no entanto os modems devem estar roteados cada um em uma rede diferente é claro. O bonding não manipula pppoe corretamente eu tentei fazer algo nesse sentido mas não tive resultados satisfatórios.

3 - Mencionei isso no artigo. Mas dependendo do perfil dos usuários da rede isso até pode ser empregado. Aliás eu sempre adotei esta técnica.

4 - Sim, no caso específico que escreví o artigo CBQ mas os controles de banda para download são aplicados na interface de rede que dá para a rede interna. Se for um controle de banda de upload pode ser empregado no bonding sem problemas.

[11] Comentário enviado por renato_pacheco em 03/08/2011 - 10:22h

Parabéns! Achei muito fera essa implementação...

[12] Comentário enviado por giliardbf em 10/08/2011 - 09:20h

Parabéns pelo artigo!

Uma dúvida: Porque o bonding não funcionaria corretamente se as interfaces agregadas estivessem conectadas diretamente aos roteadores das operadoras? eth1 no roteador da operadora1 e eth2 no roteador da operadora2.

Valeu.

[13] Comentário enviado por capitainkurn em 14/08/2011 - 09:43h

Para ser sincero não mergulhei nestas possibilidades, me atei somente a documentação do Bonding driver. Em princípio nem mesmo cojitei o seu uso minha idéia era de usar uma única interface de rede visto que slots PCI nas atuais motherboards de custo mais baixo são cada vez mais raros. Mas os resultados não foram satisfatórios, não sei determinar se foi por causa do driver da interface de rede que era uma 3com 3C905 ou mesmo seu hardware ou ainda alguma restrição em um dos roteadores. Sugiro que faça seus próprios ensaios e escreva um artigo ou dica relatando suas experiências.

[14] Comentário enviado por leandruco em 14/12/2011 - 10:09h

Muito bom o artigo porem tive um problema
Assim que desliguei um roteador, a conexão parou deixei dando um ping e depois de alguns erros ela voltou.
Porem a maquina que está como cliente ou seja utilizando o fw para sair para internet não consegue navegar.
Mesmo o fw navegando normalmente.

Quando liguei o outro roteador ele voltar a navegar, mas saindo com o ip da outra operado que eu não tinha desligado.

Muito estranho ou estou vacilando em alguma coisa?

[15] Comentário enviado por trsantana em 27/12/2011 - 02:24h

capitainkurn,

gostaria de saber como usar o seu artigo para a seguinte implementação:
Tenho três máquinas virtualizadas no VmWare Esxi onde são um iptables e dois squids. A minha intenção é usar o iptables como balanceamento de carga e alta disponibilidade para os dois squids.
Mas como fazer isto, pois na hora de colocar o MAC para as interfaces, e elas em modo promisculo e tambem agregação das interfaces ao bonding visto que cada maquina so tem uma interface de rede!!
Ficarei muito agradecido se você capitainkun ou algum colega que esteja lendo este topico pudesse me ajudar a solucionar este desafio.
Desde já obrigado.

[16] Comentário enviado por capitainkurn em 15/03/2012 - 13:34h

Se entendí sua pergunta você tem uma máquina hospedeira com apenas duas interfaces (uma para a rede interna e outra para o roteadores) e essa hospedeira roda duas máquinas virtuais empregando squid. Eu tenho isso em produção uma com Slackware 31.1 rodando o MyAuth Gateway do Patrick e uma entre ela e os roteadores. Mas nesse caso não empreguei o bonding fiz o balanceamento através apenas do iproute2 o que aliais foi minha primeira opção antes de empregar o método descrito no artigo.

[17] Comentário enviado por capitainkurn em 15/03/2012 - 13:38h

leandruco com 85% de certeza Rsssss... pois 100% só metendo a mão mesmo....

O que você tem é um cache de rotas....

basta dar um "ip route flush cache"

Eu também obsrvei este problema antes, mas aí o artigo já estava no ar e ficou assim mesmo.


[18] Comentário enviado por weltonpba em 02/07/2012 - 09:49h

Capitainkurn
Belíssimo artigo, estou tentando implantar Bonding Driver aqui na empresa, pois estou com 2 links de internet, a pergunta pode ser idiota mas fiquei com uma duvida, Você usou quantas placas de rede no servidor? 2 ou 3? uma para cada link e mais 1 para bond0? ou bond0 e virtual e so usa 2 placas?

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

Otimo 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
Testei e esta funcionando muito bem....


[20] Comentário enviado por nunesdutra em 07/04/2016 - 15:37h

Como funcionaria para as regras de saída??

[21] Comentário enviado por Birulis em 15/06/2016 - 13:35h

Po muito show o artigo. Oba por compartilhar.

Duvida: Segue o meu cenário.
Concentro meus links em um HUB. Deste HUB tenho um cabo de rede vindo direto ate o meu linux que seria meu ip publico. Para a utilização do link segundaria foi configurado uma interface virtual. Logo então, quando preciso virar o link preciso fazer o processo mecânico, derrubando a rota para para link primário e adicionando a rota do meu link secundário.

Como utilizo a mesma interface, é possível a utilização do Boding Driiver?

[22] Comentário enviado por Krusth em 02/12/2016 - 14:08h

Exatamente oque eu estava procurando, configurei o bonding pra pega dhcp, pega ip certinho, aparece os registros no log, ele mudando as interfaces, mas quando muda de interface fico sem conexão, ai se reinicio os serviços de rede volta, ou ifdown bond0; ifup bond0
ai pega ip da outra interface e consigo navegar.

Alguma ideia de q pode ser?
usei como tuto http://www.tecmint.com/network-nic-bonding-teaming-in-debian-linux/


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts