[MASOCH-L] ** Resolvido ** FreeBSD - redundancia - mesmo IP em 2 placas de rede

Marcelo Coelho marcelo at tpn.com.br
Wed Apr 13 15:24:34 -03 2005


Pessoal,

Encontrei uma solução. Criei um script em Perl que testa as interfaces a
cada 3 segundos.

Se a interface principal ficar fora por 3 vezes seguidas, eu ativo a
interface de backup. Caso a interface principal volte e responda
corretamente por 3 vezes seguidas, eu volto para a interface principal.

O mais interessante é que fiz testes com FTP, mesmo desplugando o cabo da
rede, o upload e download que eu fazia não era interrompido (ele apenas
parava por alguns segundos), continuava normalmente assim que a outra placa
era ativada, sem cortar a conexão ou corromper o arquivo.

Vou colocar algumas besteiras a mais, como o aviso por e-mail assim que ele
trocar de interface.

Segue abaixo o script, caso estejam interessados.

-- 
Marcelo Coelho
marcelo at tpn.com.br

-----------------------------

#!/usr/local/bin/perl

#
# Script: check_interfaces.pl
# Author: Marcelo Coelho
# E-mail: marcelo at tpn.com.br
#

# DEBUG - 0 = desativado, 1 = ativado
$debug = 1;

# Parâmetro do ifconfig, exatamente como no /etc/rc.conf
$inet = "inet 192.168.1.1 netmask 255.255.255.0";

# Interface principal
$master = "xl1";

# Interface backup
$backup = "xl2";

# 0 = master, 1 = backup
$active = 0;

# Controle
$erro = 0;
$ok = 0;

while (1 == 1) {

 # Se a interface Master está ok
 if ($debug) {
  print "active: ";
  if ($active == 1) { print "[ backup ] "; } else { print "[ master ] "; }
  print " checking: [ master ]... (ok = $ok, erro = $erro)\n";
 }

 # Começa dormindo...
 sleep 3;

 if (check_interface($master)) {
  $erro = 0;
  if ($active == 1) {
   $ok++;
   if ($ok >= 3) {
    # Mudando para interface master
    print "voltando para master... (ok = $ok, erro = $erro)\n" if ($debug);
    $x = `ifconfig $backup down`;
    $x = `ifconfig $master $inet`;
    $x = `ifconfig $master up`;
    $active = 0;
   }
  }
 } else {
  $ok = 0;
  if ($active == 0) {
   $erro++;
   if ($erro >= 3) {
    # Mudando para interface backup
    print "mudando para backup... (ok = $ok, erro = $erro)\n" if ($debug);
    $x = `ifconfig $master down`;
    $x = `ifconfig $backup $inet`;
    $x = `ifconfig $backup up`;
    $active = 1;
   }
  }
 }
}

exit;

##########################################

sub check_interface {

 local($ret) = 0;
 local($int) = @_;

 open(IFCONFIG,"ifconfig $int |");
 while (<IFCONFIG>) {
  chop;
  if (/\s+status\:/) {
   if (/active$/) {
    $ret = 1;
   }
  }
 }
 close(IFCONFIG);

 return($ret);

}




More information about the masoch-l mailing list