Alta disponibilidade em rede com Ubuntu 11.10 Server (GNU/Linux)

Dessa vez vou explicar sobre alta disponibilidade de rede Linux utilizando o driver bonding que permite agregar multiplas interfaces de rede em uma única interface virtual.

Como algumas (poucas) pessoas devem saber, estou fazendo um estágio na Eletrobrás.

É realmente satisfatório ver alguns aspectos tecnológicos de um local onde de fato se tem a preocupação com a disponibilidade dos equipamentos.

Recentemente acompanhei a instalação de um servidor com Linux, e notei que havia um bonding configurado. Alguns dias depois, em conversa com um amigo meu chamado Lucas Castro, ele sugeriu que eu fizesse um post no Blog sobre o assunto, e aqui estamos nós.

Antes de tudo, precisamos saber que o Bonding é um driver para GNU/Linux, que, como mensionei anteriormente, permite agregarmos interfaces de redes em uma única interface de rede virtual, assim podemos ter duas ou mais placas de rede respondendo como se fossem uma só.

Existem algumas formas de se configurar o bonding, dentre as opções, podemos escolher se as interfaces de rede estarão operando simultaneamente – oferecendo também um balanceamento da carga entre as placas – ou se uma interface apenas irá operar se outra vier a falhar.

Para fazer meus testes utilizei uma instalação do Ubuntu 11.10 Server em uma máquina virtual usando VirtualBox.

Antes de configurar o bonding, é preciso instalar o utilitário ifenslave, um programa de nível de usuário que permite agregar ou desagregar interfaces à interface virtual do bonding. Para instalar basta executar o seguinte comando:

sudo apt-get install ifenslave-2.6

Uma vez instalado o ifenslave, podemos configurar o linux para que o módulo bonding seja carregado automaticamente na inicialização do sistema. Para isso, vamos criar o arquivo /etc/modprobe.d/bonding, eu criei deiretamente com o vim, como mostra o comando a seguir:

sudo vim /etc/modprobe.d/bonding.conf

Neste aquivo é preciso colocar o seguinte conteúdo (o conteúdo deste arquivo pode mudar de acordo com as características de agregação de interfaces que você necessita):

alias bond0 bonding
options bonding mode=0 miimon=100

A primeira linha serve para carregar o módulo, criando a interface de rede virutal bound0.

A segunda linha, informa que o modo de bonding será o modo 0 (mode=0) e a frequencia em milisegundo que o link será monitorado será 100 (miimon=100).

A seguir, tem uma tabela com os possiveis modos de operação do bonding.

modo nome descrição
0 balance-rr Balanceamento entre as interfaces usando o algorítimo Round-robin. Transmite os pacotes, em uma ordem sequencial, da primeira à última placa de rede agregada ao bonding que estiver disponível.
Este modo provê o balanceamento da carga e tolerancia à falhas.
1 active-backup Apenas uma das interfaces agregadas ao bonding fica ativa. Outra interface se torna ativa se, e somente se, a interface atualmente ativa vier a falhar.
O endereço MAC da interface bonding fica visível externamente em apenas uma placa de rede, para evitar confusão no switch.
Este modo provê tolerancia à falhas.
2 balance-xor Balanceamento usando o algorítimo Xor, com o MAC da placa de rede de destino do pacote, para selecionar a interface de rede que será utilizada. O bonding ultilizará sempre a mesma placa de rede para cada endereço MAC de destino.
Este modo provê o balanceamento da carga e tolerancia à falhas.
3 broadcast Transmissão dos pacotes utilizando o conceito de broadcast. Os pacotes são transmitidos em todas as interfaces agregadas ao bonding.
Este  modo provê tolerancia à falhas.
4 802.3ad Agregação de links dinamicamente. Criação de grupos de agregações que possuem a mesma velocidade e definições de comunicação (duplex). Transmite e recebe dados em todas as interfaces do grupo.
Prerequisitos:
1. Suporte ao Ethtool para obeter as informações de velocidade e definições de comunicação (duplex) de cada placa de rede.
2. Switch com suporte aos padrões IEEE 802.3ad e agregação dinâmica de links.
5 balance-tlb Balanceamento de carga de transmissão adaptativa. Não requer switch com características especificas. O tráfego de saída é distribuido de acordo com a capacidade e o uso atual de cada placa de rede agregada ao bonding. O tráfego de entrada é recebido pela placa de rede atualmente em uso. Se a placa de rede que está recebendo dados vier a falhar, outra placa de rede assume seu MAC, e passa a receber os dados em seu lugar.
Prerequisitos:
1. Suporte ao Ethtool para obeter as informações de velocidade de cada placa de rede.
6 balance-alb Balanceamento de carga adaptativo para transmissão e recebimento de informações para o protocolo IPV4. Não requer switch com características especificas. O balanceamento da carga é feito utilizando negociações ARP interceptadas pelo driver bonding.
Prerequisitos:
1. Suporte ao Ethtool para obeter as informações de velocidade de cada placa de rede.
2. Driver de rede com suporte à alteração do endereço MAC da placa com a mesma em uso.

Como pode ser constatado no arquivo de configuração que eu fiz, para este artigo estou usado o modo 0 (balance-rr).

Para que não seja necessário reinicar o sistema, subi o modulo com o utilitário modprobe:

modprobe bonding mode=0 miimon=100

Antes de configurar as interfaces de rede do bonding, vou explicar para vocês configuração da rede que estou usando no meu ambiente de testes.

Como mensionei anteriormente, estou usando uma máquina virutal com VirtualBox, nessa máquinas virtual, tenho duas interfaces de rede, ambas configuradas como nat, sendo assim, do meu sistema hospedeiro, não posso pingar a máquina virutal, então para testar o bonding, irei utilizar uma outra máquina virtual com o Windows XP que tem uma interface de rede também configurada como nat.

Esta virtualização simula um ambiente onde eu teria esta estações virtualizadas com todas as interfaces de rede ligadas à um switch, recebendo os IP’s via dhcp. No caso as duas interfaces de rede da máquina com o Ubuntu e uma interface de rede da máquina com o Windows XP.

Voltando à configuração do bonding…

Para configurar a interface bond0, editei o arquivo /etc/network/interfaces com o vim:

sudo vim /etc/network/interfaces

E adicionar o as configurações da placa de rede bond0.

Observe que eu comentei as configurações para interface eth0.

Caso você venha a configurar um, não se esqueça de remover ou comentar as configurações das interfaces de rede eth0 e eth1 caso elas existam.

O meu arquivo de configuração ficou assim:

auto lo
iface lo inet loopback

# auto eth0
# iface eth0 inet dhcp

auto bond0
iface bond0 inet dhcp
bond-slaves eth0 eth0

Até mesmo para quem tem pouco de entendimento de configuração de rede em ambientes Debian,Ubuntu,Gnu/Linux o arquivo é auto explicativo.

Depois de configurar o arquivo, reiniciei as interfaces de rede para ver o bonding em operação:

/etc/init.d/networking restart

As informações do bonding podem ser acompanhadas atraves do arquivo /proc/net/bonding/bond0.

Para tal operação, eu costumo utilizar o coamando watch da seguite forma:

watch cat /proc/net/bonding/bond0

Agora só nos resta testar. Para fazer o teste vou usar a máquina virtual com o Windows XP para pingar a máquina virtual com o Ubuntu Server que tem o bonding configurado, vou simular o desligamento do cabo de uma das placas de rede por vez e efetuar o ping. :D. Veja o vídeo com os testes.

É isso ae, mais um post no Blog, espero que possa ser útil para alguém.
Abraços e até o próximo post!

4 pensou em “Alta disponibilidade em rede com Ubuntu 11.10 Server (GNU/Linux)

    • Olá André, neste tipo de configuração as duas interfaces funcionam como se fossem uma só, sendo assim, você não precisarar configurar rota alguma para nenhuma das duas interfaces. Você precisará configurar a rede apenas para a ainterface bond0.

  1. Amigão, gostaria de saber se a técnia de bonding serve somente para o caso de alta disponibilidade ou se, operando em mode=5, posso fazer alta disponibilidade. recuperação a falhas e agregação de banda de LINKS ADSL?
    É possível agregar dois links ADSL numa interface bond0 sendo que as interfaces agregadas estão ligadas diretamente as DOIS MODEM ADSL de operadores distintas?

    Grato

    • Opa Cleiton, acredito que para o que você precisa não daria de utilizar o boding. Teria que ser realizado um balanceamento de carga, utilizando rotas e o iptables, Pelo menos é o que eu acredito. 😀

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.