Wiki Linkat

Balanceig de càrrega entre 2 ADSL

De Wiki Linkat

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

Image:Load balance.jpg


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
# Autor: Victor Carceler
#
# Licencia: GPL v3 o posterior
#
# 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 Balanceador de Carga
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
#
# IP1: IP associada a eth0
# IP2: IP associada a eth1
# GTW1: Porta de sortida 1 associada a l'eth0
# GTW2: Porta de sortida 1 associada a l'eth1
# XARXA1: Subxarxa 1 associada a l'eth0
# XARXA2: Subxarxa 1 associada a l'eth1
#
IP1=192.168.0.33
IP2=192.168.1.33
GTW1=192.168.0.1
GTW2=192.168.1.1
XARXA1=192.168.0.0
XARXA2=192.168.1.0

# IPs para monitorizar routers
ifconfig eth0 $IP1 up
ifconfig eth1 $IP2 up

# Inicializamos las tablas para los dos enlaces
ip route add $XARXA1/24 dev eth0 table XTEC
ip route add default via $GTW1 table XTEC

ip route add $XARXA2/24 dev eth1 table EXT1
ip route add default via $GTW2 table EXT1

# Reglas para la selección de tablas
ip rule add from $IP1 table XTEC
ip rule add from $IP2 table EXT1

# Regla por defecto
ip route replace default scope global nexthop via $GTW1 weight 1 nexthop via $GTW2 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: IP objectiu que s'utilitza per saber si han caigut els gateways
#         213.176.161.13 es la IP associada a: www.xtec.cat
#
TESTIP=213.176.161.13
PINGTIMEOUT=20

#
# IPs i portes de sortida del balancejador
#
IP1=192.168.0.33
IP2=192.168.1.33
GTW1=192.168.0.1
GTW2=192.168.1.1

GATEWAY_PING_SRC=($IP1 $IP2)
GATEWAY_LIST=($GTW1 $GTW2)
GATEWAY_WEIGHT_LIST=(1 1)

SLEEP=60

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