Documentos de Académico
Documentos de Profesional
Documentos de Cultura
ar
Introducción:
Balanceo de carga y alta disponibilidad en Ubuntu. Dado que hay poca información en
internet sobre este tema, decidí documentar una implementación.
Palabras clave: Cluster en Linux, Load balancing, High Availability, HA con LVS, Direct
Routing, Keepalived.
Mini-Howto:
Si conoce la teoría, este mini-howto ahorra tiempo.
________
| |
| client | (local o internet)
|________|
|
(GW)-------------+
| |
VIP |
| |
+--------+-------+ |
____|_____ ____|_____ |
| | | | |
| director | | director | |
| master | | backup | |
|__________| |__________| |
DIP1 DIP2 |
| | |
+--------+---------+ |
| |
+----------------+---------------+
RIP1,VIP RIP2,VIP RIP3,VIP
____________ ____________ ____________
| | | | | |
| realserver | | realserver | | realserver |
|____________| |____________| |____________|
Terminología:
Configuración
En los directores:
1-7
www.onsi.com.ar
Listo!. Si tiene más tiempo, puede leer la forma larga de hacer lo mismo.
2-7
www.onsi.com.ar
Descripción extensa:
Hasta el momento (primavera 2008) hay poca documentación sobre Linux Virtual Server
(LVS) en Ubuntu o Debian. La idea es la siguiente: implementar un cluster de
computadoras con balanceo de carga y alta disponibilidad. El sistema tendrá una sola IP,
llamada IP Virtual, en esta caso 192.168.6.240. El requerimiento inicial lo atiende el
director o balanceador de carga (192.168.6.2), pero redirecciona el paquete para que los
servicios sean atendidos por N servidores reales. Para que este director no se convierta en
un único punto de falla, creamos la alta disponibilidad con un director backup
(192.168.6.3).
Lleva mas tiempo leer este artículo que poner en funcionamiento el cluster.
Imagen de http://www.estrellateyarde.es/discover/cluster-lvs-keepalived-en-linux
Software:
El balanceo de carga se logra con LVS. La alta disponibilidad de varias formas: Heartbeat
con Ldirector, Piranha, Ultramonkey o Keepalived (hay mas formas). Usaremos Keepalived
porque permite manejar el cluster con una sola herramienta.
Empecemos por el balanceo de carga: LVS, ipvsadm y keepalived.
Linux Virtual Server (LVS) viene integrado en el kernel de Ubuntu 8.04, por lo que no
tenemos que recompilar. Sólo hay que instalar la herramienta ipvsadm para agregar
reglas de balanceo de carga. Más adelante, cuando configuremos la alta disponibilidad,
Keepalived instalará todo de un solo paso.
El problema ARP:
Una situación a resolver en esta configuración es el "Problema ARP". Como varios
servidores tienen la misma IP, si la publican ante un requerimiento ARP habrá una
competencia por el paquete, llamado "Race Condition". Para evitar eso, debemos
asegurarnos que el único que publica la dirección IP Virtual es el director, por lo que
debemos deshabilitar la publicación ARP en los servidores reales.
3-7
www.onsi.com.ar
Implementación
Suficiente teoría. Vamos a implementar el cluster: un web server. Asumiremos que los
servidores reales tienen Apache funcionando con el mismo sitio :), ya sea con un storage
centralizado, mirror a través de red (DRDB) o NFS. Ese tema no es parte de este artículo.
Los directores master y backup deben tener keepalived instalado y configurado, la IP
virtual configurada y habilitado el forwarding IP.
Los servidores reales deben tener el servicio andando :), la IP virtual configurada en lo:0,
deshabilitada la publicación ARP y configurada una ruta estática.
# nano /etc/keepalived/keepalived.conf
4. Arrancamos keepalived
# /etc/init.d/keepalived start
Starting Keepalived for LVS: [ OK ]
5. Comprobar la IP virtual:
# ip addr sh eth0
6. Comprobamos el cluster
# ipvsadm -L -n
4-7
www.onsi.com.ar
El primer comando agrega un servicio con ip virtual y puerto (-A) protocolo TCP (-t) y
algoritmo (-s) Weighted Round Robin.
El segundo agrega un server real al servicio (-a) con ip real (-r) y balanceo tipo direct
routing.
# nano /etc/network/if-up.d/lvs
Con lo siguiente:
#!/bin/sh
/sbin/ifconfig lo:0 192.168.6.240 netmask 255.255.255.255 broadcast 192.168.6.240
up
/sbin/route add -host 192.168.6.240 dev lo:0
Y lo hacemos ejecutable
Finalmente ejecutamos:
# sysctl -p
# /etc/init.d/keepalived stop
# /etc/init.d/apache2 stop
Comentarios:
Este archivo /etc/keepalived/keepalived.conf tiene 3 partes:
5-7
www.onsi.com.ar
global_defs {
notification_email {
root@dominio.com
}
notification_email_from root@dominio.com
smtp_server 127.0.0.1
smtp_connect_timeout 30
lvs_id LVS1
}
notification_email: quién recibe el email de alerta.
notification_email_from: remite del email de alerta.
lvs_id: identificador del director.
virtual_server: directivas de cada servidor virtual. Por ejemplo, para un servidor web en
la IP virtual 192.168.6.240, puerto 80:
virtual_server 192.168.6.240 80 {
delay_loop 15
lb_algo rr
lb_kind DR
persistence_timeout 50
protocol TCP
real_server 192.168.6.4 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
}
}
real_server 192.168.6.5 80 {
weight 2
TCP_CHECK {
connect_port 80
connect_timeout 3
}
}
}
Lo importante es:
lb_algo: algoritmo de balanceo de carga: rr|wrr|lc|wlc|lblc|sh|dh
lb_kind: tipo de balanceo: NAT|DR|TUN
real_server: servidor real perteneciente al pool.
weight: peso relativo del servidor para balancear la carga.
TCP_CHECK: método para chequear la disponibilidad del servidor.
Si tenemos más IPs virtuales o servicios agregamos otras secciones virtual_server: por
ejemplo, en la misma IP virtual 192.168.6.240 un servidor de correo en el puerto 25:
virtual_server 192.168.6.240 25 {
delay_loop 15
lb_algo wlc
lb_kind DR
persistence_timeout 50
protocol TCP
sorry_server 192.168.6.2 25
real_server 192.168.6.6 25 {
weight 1
TCP_CHECK {
connect_port 25
connect_timeout 3
}
6-7
www.onsi.com.ar
}
real_server 192.168.6.7 25 {
weight 2
TCP_CHECK {
connect_port 25
connect_timeout 3
}
}
}
vrrp_instance VI_1 {
state MASTER
interface eth0
lvs_sync_daemon_inteface eth0
virtual_router_id 51
priority 150
advert_int 1
smtp_alert
authentication {
auth_type PASS
auth_pass 1234
}
virtual_ipaddress {
192.168.6.240
}
}
Conclusión
Fin de la implementación LVS en Ubuntu.
7-7