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.145 ]

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


O Roteamento Avançado



Primeiramente vamos definir as tabelas de roteamento no arquivo /etc/iproute2/rt_tables:

#
# reserved values
#
255     local
254     main
253     default
0       unspec
#
# local
#
#1      inr.ruhep
252     operadora0
251     operadora1

As chamaremos de operadora0 e operadora1, afinal o VOL não ganha um tostão delas para fazer propaganda! Rsssss.

Agora vamos acrescentar as rotas na tabela de roteamento:

Primeiro, limpar qualquer rota existente no cache: # ip route flush cache; ip route flush cached

Finalmente acrescentar as rotas, para operadora0:

# ip route add default via xxx.xxx.xxx.xxx dev bond0 table operadora0
# ip route add xxx.xxx.xxx.xxA via xxx.xxx.xxx.xxx table operadora0
# ip rule add from xxx.xxx.xxx.xxA table operadora0

Para operadora1:

# ip route add default via yyy.yyy.yyy.yyy dev bond0 table operadora1
# ip route add yyy.yyy.yyy.yyA via xxx.xxx.xxx.xxx table operadora1
# ip rule add from yyy.yyy.yyy.yyA table operadora1

E finalmente vamos definir as rotas default:

# ip route add default scope global nexthop via xxx.xxx.xxx.xxx dev bond0 weight 67 nexthop via yyy.yyy.yyy.yyy dev bond0 weight 33

Onde xxx.xxx.xxx.xxx e yyy.yyy.yyy.yyy são os endereços dos roteadores e xxx.xxx.xxx.xxA e yyy.yyy.yyy.yyA são os endereços do host.

Os pesos:

Notaram os parâmetros weight 67 e weight 33 acima? Pois é! Ocorre o seguinte:

Temos dois links de velocidades diferentes o primeiro de 2Mbit/s e segundo de 4Mbit/s logicamente a soma de ambos dá 6Mbit/s, então fazemos a seguinte conta, 2 + 4 = 6 (4 / 6)*100 = 66,66% aredondamos para 67, 100 - 67 = 33.

Resumindo o link de 2Mbit/s corresponde a 33% da soma de ambos e o de 4Mbit/s é 67% da soma de ambos. Se ambos fossem da mesma velocidade bastaríamos especificar o peso de cada um como igual a 1.

E agora limparemos o cache de rotas novamente!

# ip route flush cache; ip route flush cached

Para a redundância funcionar corretamente o bonding requer que todas as interfaces agregadas e os roteadores das operadoras estejam conectados em um mesmo switch.

Um ótimo trabalho a todos.
Página anterior    

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

Debian sem Systemd

TrueCrypt Forever

Gateway autenticado com Apache, Iptables e CGI em shell

Autenticando Documento com Blockchain e Ethereum

SSH Connection With non-NIST Russian Cipher and Distro for Military Use

Leitura recomendada

Apache 2 + mod_perl 2.0.1

Instalando o Apache + PHP + MySQL no Slackware

Apache em chroot + MySQL + PHP + mod_security + mod_evasive + vsftpd + Fail2ban + Debian Squeeze

Texto puro - BitTorrent

Arch Linux - Conexão 3G VIVO com modem Nokia CS-10

  
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