====== 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 on eth2