[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