Buen día, estoy intentando hacer un sitio web de alta disponibilidad, para eso leí un poco y opte por haproxy y keepalived, trate de seguir varios manuales, pero no obtuve buen resultado, así que los mezcle un poco, pero solo con algunas mejorías, la idea general es algo así:
2 balanceadores lb1 y lb2 2 servidores web serv1 y serv2
una ip que comparten los 2 balanceadores (1.98)
si hago ip addr sh eth0 en ambos balanceadores me muestra la ip que tienen y también la 1.98.
ya probé incluso cambiando de distribución (ubuntu, Debian y CentOS) pero el resultado es el mismo y ese es mi problema, cuando "enciendo" el servicio lo puedo ver y me alterna las peticiones a cada servidor web, si apago un servidor web dirige toda la carga al que queda encendido, de igual forma si apago un balanceador, pero mi problema es que solo "veo" el servicio desde los balanceadores, si trato de acceder desde otro equipo no puedo, tarda un buen tiempo tratando de conectarse y se corta por tiempo excedido.
abajo están mis configuraciones, agradezco sus comentarios.
haproxy.cfg
global log 127.0.0.1 local0 log 127.0.0.1 local1 notice maxconn 4096 user haproxy group haproxy
defaults log global mode http option httplog option dontlognull retries 3 maxconn 2000 contimeout 5000 clitimeout 50000 srvtimeout 50000
listen webfarm 192.168.1.98:80 mode http stats enable balance roundrobin option httpclose option forwardfor server webA 192.168.1.86:80 cookie A check server webB 192.168.1.85:80 cookie B check
# en la linea server webA ...... también intente cambiar la etiqueta webA por el nombre completo del server pero no hubo ningún cambio, supongo que es solo una etiqueta cierto????
------------------------------------------------------------------
keepalived.conf
global_defs { # quite premeditadamente la sección de notificación por correo smtp_connect_timeout 30 lvs_id LVS_MAIN } virtual_server 192.168.1.98 80 { delay_loop 30 lb_algo wrr lb_kind NAT persistence_timeout 50 protocol TCP real_server 192.168.1.86 80 { weight 1 TCP_CHECK { connect_port 80 connect_timeout 3 nb_get_retry 3 delay_before_retry 2 } } real_server 192.168.1.85 80 { weight 2 TCP_CHECK { connect_port 80 connect_timeout 3 nb_get_retry 3 delay_before_retry 2 } } } vrrp_script chk_haproxy { script "killall -0 haproxy" interval 2 weight 2 } vrrp_instance VI_1 { --- VI_2 en el secundario state MASTER ------ este es substituido en el secundario por BACKUP interface eth0 virtual_router_id 51 priority 101 ---- prioridad mas baja en el secundario advert_int 1 virtual_ipaddress { 192.168.1.98 } track_script { chk_haproxy } }
El 19/11/09 20:08, Mauricio Cesar Ramirez Torres escribió:
Hola!
ya probé incluso cambiando de distribución (ubuntu, Debian y CentOS) pero el resultado es el mismo y ese es mi problema, cuando "enciendo" el servicio lo puedo ver y me alterna las peticiones a cada servidor web, si apago un servidor web dirige toda la carga al que queda encendido, de igual forma si apago un balanceador, pero mi problema es que solo "veo" el servicio desde los balanceadores, si trato de acceder desde otro equipo no puedo, tarda un buen tiempo tratando de conectarse y se corta por tiempo excedido.
Por lo que comentas posiblemente sea un problema de ARP, estas utilizando LVS-DR, ¿verdad?
Si utilizas DR, tienes que configurar la VIP en un interfaz loopback y despúes debes configurar arp_ignore y arp_announce vía sysctl del siguiente modo:
net/ipv4/conf/eth0/arp_ignore = 1 net/ipv4/conf/eth0/arp_announce = 2 net/ipv4/ip_forward=1
Haz estos cambios y luegos nos cuentas si ya puedes ver la VIP desde cualquier sitio ;-)
Saludos!
Santi Saez escribió:
El 19/11/09 20:08, Mauricio Cesar Ramirez Torres escribió:
Hola!
ya probé incluso cambiando de distribución (ubuntu, Debian y CentOS) pero el resultado es el mismo y ese es mi problema, cuando "enciendo" el servicio lo puedo ver y me alterna las peticiones a cada servidor web, si apago un servidor web dirige toda la carga al que queda encendido, de igual forma si apago un balanceador, pero mi problema es que solo "veo" el servicio desde los balanceadores, si trato de acceder desde otro equipo no puedo, tarda un buen tiempo tratando de conectarse y se corta por tiempo excedido.
Por lo que comentas posiblemente sea un problema de ARP, estas utilizando LVS-DR, ¿verdad?
Si utilizas DR, tienes que configurar la VIP en un interfaz loopback y despúes debes configurar arp_ignore y arp_announce vía sysctl del siguiente modo:
net/ipv4/conf/eth0/arp_ignore = 1 net/ipv4/conf/eth0/arp_announce = 2 net/ipv4/ip_forward=1
Haz estos cambios y luegos nos cuentas si ya puedes ver la VIP desde cualquier sitio ;-)
Saludos!
Pues ayer estuve realice los cambios que me comentas y nada ... ahora no me queda muy claro a que te refieres con que tengo que tener la ip virtual en una interfaz loopback??? a lo que te refieres es que debo de "escuchar" las 2 ip's??? porque si yo hago $ip addr sh eth0
me muestra las 2 ip's la real y la virtual, esto en ambos balanceadores, ahora si yo hago por ejemplo un ping a la ip virtual si me responde y si me conecto por ssh solicitando la ip virtual también me conecto, siempre al servidor de mas prioridad, pero si quiero entrar a mi servicio web no puedo :(
Saludos y gracias.
El 24/11/09 21:17, Mauricio Cesar Ramirez Torres escribió:
Pues ayer estuve realice los cambios que me comentas y nada ... ahora no me queda muy claro a que te refieres con que tengo que tener la ip virtual en una interfaz loopback??? a lo que te refieres es que debo de "escuchar" las 2 ip's??? porque si yo hago $ip addr sh eth0
me muestra las 2 ip's la real y la virtual, esto en ambos balanceadores, ahora si yo hago por ejemplo un ping a la ip virtual si me responde y si me conecto por ssh solicitando la ip virtual también me conecto, siempre al servidor de mas prioridad, pero si quiero entrar a mi servicio web no puedo :(
¿Estás utilizando LVS-NAT o LVS-DR? Esto es muy importante :)
Como te decía, si estás utilizando Direct-Routing [1], necesitas que la VIP esté configurada en una interfaz loopback y hacerla non-ARP, tienes mas información sobre este método de balanceo en:
[1] http://www.linuxvirtualserver.org/VS-DRouting.html
Si ves complicada la cosa para hacerlo con Keepalived, te recomiendo que utilices el interfaz web de Red Hat para balanceadores "piranha":
(..) Various tools to administer and configure the Linux Virtual Server as well as heartbeating and failover components. The LVS is a dynamically adjusted kernel routing mechanism that provides load balancing primarily for web and ftp servers though other services are supported. (..)
Podrás hacer prácticamente lo mismo que con Keepalived, de forma muy sencilla desde un interfaz web: balanceo + failover del master.
Saludos,