Table of Contents
LVS
Linux Virtual Server load balancer layer 4
Escenario
^ IP ^ NIC ^ Nota ^ | 10.0.0.25 | eth2 | Director. Es el balanceador de carga | | 10.0.0.4 | eth2 | Real Server 1 | | 10.0.0.5 | eth3 | Real Server 2 | | 10.0.0.16 | Da igual | Cliente |
Queremos:
10.0.0.16 → 10.0.0.25 → 10.0.0.4 o 10.0.0.5
Nota: todas las maquinas estan en la misma red
Instalación y configuración inicial en el director (balanceador de carga)
1. En el director (balanceador de carga)
sudo aptituda update; sudo aptitude install ipvsadm
2. Le asignamos la IP virtual al director (10.0.0.201):
sudo ifconfig eth2:0 10.0.0.201 netmask 255.255.0.0 broadcast 10.0.255.255
Notas:
-El comando tiene en cuenta la interfaz (eth) adecuada
-Esa IP sera asignada posteriormente a los real servers
3. Crear el servicio, por ejemplo TCP 11111, con la IP virtual del paso 2:
sudo ipvsadm -A -t 10.0.0.201:11111 -s rr
4. Anyadimos real servers al servicio:
sudo ipvsadm -a -t 10.0.0.201:11111 -r 10.0.0.5:11111 sudo ipvsadm -a -t 10.0.0.201:11111 -r 10.0.0.4:11111
Configuración de los real servers
IMPORTANTE: los Real servers tienen que ignorar las peticiones ARP en las interfaces de red:
http://kb.linuxvirtualserver.org/wiki/Using_arp_announce/arp_ignore_to_disable_ARP
TODO: Hay que ver que consecuencias tiene eso a nivel de resolucion de nombres etc…
1. Ignoramos las peticiones ARP:
sudo vim.tiny /etc/sysctl.conf
Y le anyadimos las siguientes lineas (ajustar interfaz eth):
net.ipv4.conf.eth2.arp_ignore = 1 net.ipv4.conf.eth2.arp_announce = 2
2. Aplicar los cambios:
sudo sysctl -p net.ipv4.conf.eth2.arp_ignore = 1 net.ipv4.conf.eth2.arp_announce = 2
3. Le asignamos la misma IP virtual del director (10.0.0.201) a la interfaz lo:
sudo ifconfig lo:0 10.0.0.201 netmask 255.255.255.255
4. Poner a escuchar en el puerto TCP 11111:
nc -l -p 11111
Probar
1. Desde el cliente (10.0.0.16):
telnet 10.0.0.201 11111
Teclear algo ('aaaaa'), debe aparecer en uno de los dos real servers (10.0.0.4 o 10.0.5)
2. En el cliente donde aparezcan las letras ('aaaaa') cancelar la escucha en el puerto TCP 11111:
CTRL+c
3. Desde el cliente (10.0.0.16):
telnet 10.0.0.201 11111
Teclear algo ('aaaaa'), debe aparecer en el otro real server (10.0.0.4 o 10.0.5)
Errores
Si el paso 3 falla, hacer un flush de la tabla arp del cliente (10.0.0.16):
1. Resolver la IP virtual:
nslookup 10.0.0.201
En mi caso:
balancer2.dev.jj.com
2. Hacer el flush de esa direccion:
sudo arp -nd balancer2.dev.jj.com
3. Comprobar:
sudo arp -a | grep balancer2.dev.jj.com
balancer2.dev.jj.com (10.0.0.201) at <incomplete> on eth2