dimecres, 8 de juliol del 2009

Balanceig de càrrega entre 2 (o més) routers

En molts casos, les connexions a Internet poden ser poc fiables o bé no proporcionar prou ample de banda. Una forma d'incrementar la fiabilitat i l'ample de banda és distribuir la càrrega (el balanceig de càrrega) a través de múltiples connexions. És convenient també disposar de sistemes tolerants a errors que siguin transparent a l'administrador.

El balanceig de càrrega no incrementa la velocitat per a una única connexió sinó que és efectiu quan es realitzen a través de múltiples connexions.

La proposta de balanceig de càrrega que es proposa consta de 2 scripts (load-balance i load-balance.control.sh):

1- L'script load-balance:

L'script que es mostra a continuació cal copiar-lo al directori /etc/init.d

cp load-balance /etc/init.d/load-balance

i s'habilita per tal que s'iniciï en el moment de posar en marxa la màquina:

insserv /etc/init.d/load-balance

L'script presuposa que l'ordinador disposa de 2 ethernets (eth0 i eth1) amb les IPs següent: 192.168.0.33 i 192.168.1.33 (es poden adaptar a les necessitats de cada centre). A banda, l'script presuposa que els routers ADSL tenen com a IP: 192.168.0.1 i 192.168.1.1. Tots aquests valors s'han de modificar per tal que s'ajustin a les característiques del centre.

SCRIPT load-balance:


#!/bin/bash
#
# El propósito de este script es:
#
# - Agregar una IP para monitorizar cada router
# - Inicializar las tablas corresponientes a los routers (deben haberse
# definido en /etc/iproute2/rt_tables previamente). Cada tabla tendrá la
# ruta necesaria para alcanzar al router y la ruta por defecto
# - Agregar reglas para utilizar la tabla correspondiente en función
# de la dirección de origen del paquete (una de las IPs del primer punto)
# - Fijar como ruta por defecto una ruta multihop utilizando todos los
# routers
### BEGIN INIT INFO
# Provides: load_balance
# Required-Start: $network
# Required-Stop: $network
# Default-Start: 3 5
# Default-Stop: 0 1 2 6
# Short-Description: Balancejador de Càrrega entre 2 ADSLs
# Description: Arrencar el Balancejador de Càrrega
entre 2 ADSLs
### END INIT INFO

# CONTINGUT /etc/iproute2/rt_tables
#1 XTEC
#2 EXT1
#../.. EXT
#N EXTN

RT_TABLES=/etc/iproute2/rt_tables

NUM_ADSL=`cat $RT_TABLES | grep -e XTEC -e EXT | wc -l`
if [ ! $NUM_ADSL -ge 2 ]; then
echo "1 XTEC" >> $RT_TABLES
echo "2 EXT1" >> $RT_TABLES
echo "3 EXT2" >> $RT_TABLES
echo "4 EXT3" >> $RT_TABLES
echo "5 EXT4" >> $RT_TABLES
# Per protegir duplicats
cat $RT_TABLES | uniq > $RT_TABLES.tmp
mv $RT_TABLES.tmp $RT_TABLES
fi

# IPs para monitorizar routers
ifconfig eth0 192.168.0.33 up
ifconfig eth1 192.168.1.33 up

# Inicializamos las tablas para los dos enlaces
ip route add 192.168.0.0/24 dev eth0 table XTEC
ip route add default via 192.168.0.1 table XTEC

ip route add 192.168.1.0/24 dev eth1 table EXT1
ip route add default via 192.168.1.1 table EXT1

# Reglas para la selección de tablas
ip rule add from 192.168.0.33 table XTEC
ip rule add from 192.168.1.33 table EXT1

# Regla por defecto
ip route replace default scope global nexthop via 192.168.0.1 weight 1
nexthop via 192.168.1.1 weight 1

sleep 2

nohup /etc/sysconfig/network/load-balance.control.sh & > /dev/null 2>&1


2- L'script load-balance.control.sh:

Aquest script es copia al directori /etc/sysconfig/network:

cp load-balance.control.sh /etc/sysconfig/network/load-balance.control.sh

i els seus permisos han de ser 700 (chmod 700 load-balance.control.sh)

El funcionament de l'script es basa en la utilització d'una IP objectiu que és la que es fa servir per comprovar la connectivitat a Internet, en aquest cas la IP és la: 213.176.161.13 que correspon al servidor www.xtec.cat.


SCRIPT load-balance.control.sh:

#!/bin/bash
#
# Autor: Victor Carceler
#
# Licencia: GPLv3 o posterior
#
# Función:
#
# Monitorizar el estado de los diferentes enlaces y dar de baja/alta
# routers en la ruta por defecto de forma dinámica

PROGNAME=`basename $0`

TESTIP=213.176.161.13
PINGTIMEOUT=2

GATEWAY_PING_SRC=(192.168.0.33 192.168.1.33)
GATEWAY_LIST=(192.168.0.1 192.168.1.1)
GATEWAY_WEIGHT_LIST=(1 1)

SLEEP=5

N_GATEWAYS=`echo ${GATEWAY_LIST[@]} | wc -w`
N_GATEWAYS=`expr $N_GATEWAYS - 1`

last_hopes=""

while true
do
hopes=""
for x in `seq 0 1 $N_GATEWAYS`
do
ping -W $PINGTIMEOUT -I ${GATEWAY_PING_SRC[$x]} -c 1 $TESTIP >/dev/null 2>/dev/null
        RETVAL=$?

if [ $RETVAL -eq 0 ]
then
hopes="$hopes nexthop via ${GATEWAY_LIST[$x]} weight
${GATEWAY_WEIGHT_LIST[$x]}"
fi
done

if [ "$last_hopes" != "$hopes" ]
then
logger "$PROGNAME: Cambiamos la ruta por defecto a: $hopes"

logger "$PROGNAME: Valor anterior: $last_hopes"

logger "$PROGNAME: ip route replace default scope global $hopes"
ip route replace default scope global $hopes
last_hopes=$hopes
fi

sleep $SLEEP
done

logger "$PROGNAME: ip route replace default scope global $hopes"
ip route replace default scope global $hopes
last_hopes=$hopes
fi

sleep $SLEEP
done

Cap comentari:

Publica un comentari a l'entrada