Balanceo de carga · 6 min read · Oct 08, 2025
El Clúster Web Perfecto Balanceado y de Alta Disponibilidad Con 2 Servidores Ejecutando Xen En Ubuntu 8.04 Hardy Heron - Página 6
12. Configurando los balanceadores de carga (lb1, lb2)
12.1 Habilitar IPVS En Los Balanceadores De Carga
Primero debemos habilitar IPVS en nuestros balanceadores de carga. IPVS (IP Virtual Server) implementa balanceo de carga en la capa de transporte dentro del núcleo de Linux, conocido como conmutación de Capa-4.
echo ip_vs_dh >> /etc/modules
echo ip_vs_ftp >> /etc/modules
echo ip_vs >> /etc/modules
echo ip_vs_lblc >> /etc/modules
echo ip_vs_lblcr >> /etc/modules
echo ip_vs_lc >> /etc/modules
echo ip_vs_nq >> /etc/modules
echo ip_vs_rr >> /etc/modules
echo ip_vs_sed >> /etc/modules
echo ip_vs_sh >> /etc/modules
echo ip_vs_wlc >> /etc/modules
echo ip_vs_wrr >> /etc/modules
Luego hacemos esto:
modprobe ip_vs_dh
modprobe ip_vs_ftp
modprobe ip_vs
modprobe ip_vs_lblc
modprobe ip_vs_lblcr
modprobe ip_vs_lc
modprobe ip_vs_nq
modprobe ip_vs_rr
modprobe ip_vs_sed
modprobe ip_vs_sh
modprobe ip_vs_wlc
modprobe ip_vs_wrr
12.2 Instalar Ultra Monkey (paquetes) En Los Balanceadores De Carga
Instalar Ultra Monkey (paquetes) en los balanceadores de carga haciendo lo siguiente:
apt-get install ipvsadm ldirectord heartbeat
12.3 Habilitar Reenvío De Paquetes En Los Balanceadores De Carga
Los balanceadores de carga deben ser capaces de enrutar el tráfico a los nodos de Apache. Por lo tanto, debemos habilitar el reenvío de paquetes en los balanceadores de carga. Agregue las siguientes líneas a /etc/sysctl.conf:
vi /etc/sysctl.conf
# Habilita el reenvío de paquetes
net.ipv4.ip_forward = 1Luego haga esto:
sysctl -p
12.4 Configurar heartbeat Y ldirectord
Ahora tenemos que crear tres archivos de configuración para heartbeat (¡cuidado con los espacios y tabulaciones si editas en algunos editores de texto, ldirectord es muy exigente!) :
en lb1 y lb2
vi /etc/ha.d/ha.cf
logfacility local0
bcast eth0 # Linux
mcast eth0 225.0.0.1 694 1 0
auto_failback on
node lb1.example.com
node lb2.example.com
respawn hacluster /usr/lib/heartbeat/ipfail
apiauth ipfail gid=haclient uid=haclusterImportante: Como nombres de nodo debemos usar la salida de ambos:
uname -n
vi /etc/ha.d/haresources
lb1.example.com \
ldirectord::ldirectord.cf \
LVSSyncDaemonSwap::master \
IPaddr2::192.168.1.106/24/eth0/192.168.1.255 \
IPaddr2::192.168.1.107/24/eth0/192.168.1.255Las IPs 192.168.1.106 y 107 se utilizarán más tarde para los sitios web (example.com y yoursite.com).
Este archivo debe ser el mismo en ambos nodos, ¡no importa si comienzas a crear el archivo en lb1 o lb2!
vi /etc/ha.d/authkeys
auth 3 3 md5 somerandomstring somerandomstring es una contraseña que los dos demonios de heartbeat en lb1 y lb2 utilizan para autenticarse entre sí. Usa tu propia cadena aquí. Tienes la opción entre tres mecanismos de autenticación. Yo uso md5 ya que creo que es el más seguro.
/etc/ha.d/authkeys debe ser legible solo por root, por lo tanto hacemos esto:
chmod 600 /etc/ha.d/authkeys
ldirectord es el balanceador de carga real. Vamos a configurar nuestros dos balanceadores de carga (lb1.example.com y lb2.example.com) en una configuración activa/pasiva, lo que significa que tenemos un balanceador de carga activo, y el otro es un respaldo en caliente y se vuelve activo si el activo falla. Para que funcione, debemos crear el archivo de configuración de ldirectord /etc/ha.d/ldirectord.cf que nuevamente debe ser idéntico en lb1 y lb2.
vi /etc/ha.d/ldirectord.cf
checktimeout=5
checkinterval=5
autoreload=no
logfile="/var/log/ldirectord.log"
quiescent=no
#fork=yes
#PARA SMTP
virtual=192.168.1.106:25
real=192.168.1.104:25 gate
fallback=192.168.1.105:25 gate
service=none
scheduler=wlc
protocol=tcp
checktype=connect
virtual=192.168.1.107:25
real=192.168.1.104:25 gate
fallback=192.168.1.105:25 gate
service=none
scheduler=wlc
protocol=tcp
checktype=connect
#PARA DNS - CONECTAR NO FUNCIONA, DEBE SER PARCHEADO PERO PING ESTÁ BIEN
virtual=192.168.1.106:53
real=192.168.1.104:53 gate
fallback=192.168.1.105:53 gate
service=none
scheduler=wlc
checktype=ping
protocol=udp
virtual=192.168.1.106:53
real=192.168.1.104:53 gate
fallback=192.168.1.105:53 gate
service=dns
scheduler=wlc
checktype=ping
protocol=tcp
#PARA HTTP
virtual=192.168.1.106:80
real=192.168.1.104:80 gate
real=192.168.1.105:80 gate
service=http
request="ldirectord.php"
receive="Conectado a MySQL"
scheduler=wlc
protocol=tcp
checktype=negotiate
persistent=28800
virtual=192.168.1.107:80
real=192.168.1.104:80 gate
real=192.168.1.105:80 gate
service=http
request="ldirectord.php"
receive="Conectado a MySQL"
scheduler=wlc
protocol=tcp
checktype=negotiate
persistent=28800
#PARA WEBMAIL
virtual=192.168.1.106:81
real=192.168.1.104:81 gate
fallback=192.168.1.105:81 gate
service=http
request="ldirectord.php"
receive="Conectado a MySQL"
scheduler=wlc
protocol=tcp
checktype=negotiate
virtual=192.168.1.107:81
real=192.168.1.104:81 gate
fallback=192.168.1.105:81 gate
service=http
request="ldirectord.php"
receive="Conectado a MySQL"
scheduler=wlc
protocol=tcp
checktype=negotiate
#PARA POP3
virtual=192.168.1.106:110
real=192.168.1.104:110 gate
fallback=192.168.1.105:110 gate
service=pop
checktype = connect
scheduler=wlc
protocol=tcp
#PARA IMAP
virtual=192.168.1.106:143
real=192.168.1.104:143 gate
fallback=192.168.1.105:143 gate
service=imap
scheduler=wlc
protocol=tcp
#PARA HTTPS
###Descomentar esta parte si vas a usar HTTPS
#virtual=192.168.1.106:443
# real=192.168.1.104:443 gate
# real=192.168.1.105:443 gate 2
# service=http
# request="ldirectord.php"
# receive="Conectado a MySQL"
# scheduler=wlc
# protocol=tcp
# checktype=negotiate
# persistent=28800
#
#virtual=192.168.1.107:443
# real=192.168.1.104:443 gate
# real=192.168.1.105:443 gate 2
# service=http
# request="ldirector.html"
# receive="Página de Prueba"
# scheduler=wlc
# protocol=tcp
# checktype=negotiate
# persistent=28800
#PARA IMAP SSL
virtual=192.168.1.106:993
real=192.168.1.104:993 gate
fallback=192.168.1.105:993 gate
service=imaps
scheduler=wlc
protocol=tcp
#PARA POP3 SSL
virtual=192.168.1.106:995
real=192.168.1.104:995 gate
fallback=192.168.1.105:995 gate
service=pops
checktype = ping
scheduler=wlc
protocol=tcp
#PARA MONIT MONITOREO #1
virtual=192.168.1.106:10001
real=192.168.1.104:10001 gate
checktype = on
#PARA MONIT MONITOREO #2
virtual=192.168.1.106:20001
real=192.168.1.105:20001 gate
checktype = onvirtual es la IP virtual de los servicios (por ejemplo 192.168.1.106 y 107)
real son las IPs de los servidores reales en el clúster (192.168.1.104 y 105)
fallback es el servidor de respaldo. Si la IP real falla, entonces las solicitudes se reenvían a la IP de respaldo, pero no están balanceadas.
Esta configuración se basa en mi experiencia personal. Algunos servicios están balanceados, otros no. Todo lo relacionado con el correo no está balanceado. No quieres que un mensaje llegue al primer servidor y el segundo al otro (a menos que tengas almacenamiento compartido). Si no tienes un tráfico de correo muy alto, no tiene sentido balancear el correo (pero sigue siendo altamente disponible), lo mismo para DNS. Más adelante sincronizaremos los mensajes en el segundo servidor, por lo que tendremos un respaldo en caso de que falle el primer servidor.
Sobre el puerto 81. Lo usaremos para webmail. También lo uso para la administración de nuestro sitio web de comercio electrónico debido a la carga de imágenes. Más adelante configuraremos rsync de web1.example.com a web2.example.com, pero no al revés. Básicamente, no quieres cargar un archivo en web2.example.com (a menos que uses almacenamiento compartido).
Si deseas obtener más información sobre el tema, busca “ldirectord man”.
Después creamos los enlaces de inicio del sistema para heartbeat y eliminamos los de ldirectord porque ldirectord será iniciado por el demonio de heartbeat:
update-rc.d -f ldirectord remove
Finalmente, iniciamos heartbeat (y con él ldirectord):
/etc/init.d/ldirectord stop
/etc/init.d/heartbeat start
12.5 Probar los balanceadores de carga
Verifiquemos si ambos balanceadores de carga funcionan como se espera:
ip addr sh eth0
El balanceador de carga activo lb1.example.com debería listar las direcciones IP virtuales (192.168.1.106 y 192.168.1.107):
2: eth0: mtu 1500 qdisc pfifo_fast qlen 1000
link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff
inet 192.168.1.102/24 brd 192.168.1.255 scope global eth0
inet 192.168.1.106/24 brd 192.168.1.255 scope global eth0
inet 192.168.1.107/24 brd 192.168.1.255 scope global secondary eth0El respaldo en caliente (lb2.example.com) debería mostrar algo como esto:
2: eth0: mtu 1500 qdisc pfifo_fast qlen 1000
link/ether 00:0c:29:34:d7:7e brd ff:ff:ff:ff:ff:ff
inet 192.168.1.103/24 brd 192.168.1.255 scope global eth0Ahora prueba:
ldirectord ldirectord.cf status
Salida en el balanceador de carga activo (lb1):
ldirectord for /etc/ha.d/ldirectord.cf is running with pid: 5321Salida en el balanceador de carga en espera (lb2):
ldirectord is stopped for /etc/ha.d/ldirectord.cfAhora verificaremos si los puertos están reenviados correctamente:
ipvsadm -L -n | grep :80
Deberías ver algo como esto en lb1.example.com:
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.1.106:80 wlc
-> 192.168.1.104:80 Route 1 0 0
-> 192.168.1.105:80 Route 0 0 0
TCP 192.168.1.107:80 wlc
-> 192.168.1.104:80 Route 1 0 0
-> 192.168.1.105:80 Route 0 0 0Y nada en lb2.example.com.
Una última prueba:
/etc/ha.d/resource.d/LVSSyncDaemonSwap master status
Salida en el balanceador de carga activo:
master running (ipvs_syncmaster pid: 5470)Salida en el respaldo en caliente:
master stopped12.6 Probar la conmutación por error de los balanceadores de carga
lb1.example.com
/etc/init.d/heartbeat stop
El comando ipvsadm:
ipvsadm -L -n | grep :80
debería no mostrar nada.
En lb2.example.com
ipvsadm -L -n | grep :80
y deberías ver lo siguiente :
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.1.106:80 wlc
-> 192.168.1.104:80 Route 1 0 0
-> 192.168.1.105:80 Route 0 0 0
TCP 192.168.1.107:80 wlc
-> 192.168.1.104:80 Route 1 0 0
-> 192.168.1.105:80 Route 0 0 0Reinicia el servicio de heartbeat en lb1.example.com:
/etc/init.d/heartbeat start
Si vuelves a intentar el comando ipvsadm en ambos, verás que lb1.example.com ahora está activo mientras lb2.example.com volvió a estar en espera.
Si tu prueba fue bien, puedes continuar.
Recibe nuevas publicaciones en tu bandeja de entrada.
No spam. Cancela la suscripción en cualquier momento.