Volver al blog
Infraestructura 4 min de lectura

Balanceo de carga de LDAP en alta disponibilidad con HAProxy

Un servicio LDAP en alta disponibilidad necesita algo delante que reparta las peticiones entre los nodos. La configuración de HAProxy en modo TCP, paso a paso, y la prueba de que el failover funciona.

Portada de la guía de balanceo de carga de LDAP con HAProxy

Montar un servidor LDAP en alta disponibilidad plantea enseguida la misma necesidad: algo que reciba las peticiones de los clientes y las reparta entre los nodos del servicio. Cuando hablamos de alta disponibilidad nos referimos a un entorno cuyo objetivo es mantener el servicio siempre disponible, y para eso es imprescindible que corra en más de un servidor: si uno de los equipos del clúster falla, los usuarios finales no deberían notarlo.

Esta guía recorre una configuración de balanceo de carga con HAProxy delante de dos nodos de Oracle Internet Directory, y la prueba de que el failover funciona de verdad.

Los nombres de host de los ejemplos están sustituidos por equivalentes genéricos.

El escenario

  • Equipo HAProxyhaproxy.ejemplo.local:389
  • Nodo LDAP 1ldap01.ejemplo.local:3060
  • Nodo LDAP 2ldap02.ejemplo.local:3060

Los clientes apuntarán al puerto LDAP estándar (389) del equipo HAProxy, que redirigirá cada petición a uno de los dos nodos.

1. Instalar HAProxy

[root@haproxy /]# yum install haproxy

Dependencies Resolved

==========================================================================
 Package        Arch       Version           Repository          Size
==========================================================================
Installing:
 haproxy        x86_64     1.5.18-1.el6      public_ol6_latest   799 k

Transaction Summary
==========================================================================
Install       1 Package(s)

Total download size: 799 k
Installed size: 2.5 M
Is this ok [y/N]: y
...
Installed:
  haproxy.x86_64 0:1.5.18-1.el6

Complete!

2. Configurar el frontend y el backend

La configuración vive en /etc/haproxy/haproxy.cfg:

[root@haproxy /]# cd /etc/haproxy
[root@haproxy haproxy]# ls
haproxy.cfg

Se añaden las secciones frontend y backend:

#-----------------------------------
# Load Balance LDAP
#-----------------------------------

frontend f_oid 0.0.0.0:389
        log             global
        mode            tcp
        option          tcplog
        option          dontlognull
        default_backend b_oid

backend b_oid
        mode    tcp
        balance roundrobin
        server  oid1 ldap01.ejemplo.local:3060
        server  oid2 ldap02.ejemplo.local:3060

Frontend es la configuración con la que HAProxy escucha las peticiones entrantes. Dos detalles importan aquí:

  • El protocolo debe ser tcp, porque la comunicación LDAP se hace sobre TCP y no sobre HTTP.
  • No puede faltar default_backend: es el parámetro que enlaza con la sección donde están definidos los destinos.

El valor 0.0.0.0 indica que escuche en todas las interfaces que el servidor tenga configuradas y activas.

Backend es donde se referencian los dos equipos que tienen el servicio LDAP. También aquí es imprescindible declarar el modo tcp.

3. Reiniciar y validar los nodos

[root@haproxy ~]# service haproxy restart
Stopping haproxy:                            [  OK  ]
Starting haproxy:                            [  OK  ]

Antes de probar el balanceador conviene comprobar que cada nodo responde por su cuenta. La prueba se hace desde un equipo distinto al de HAProxy y al de los LDAP:

[oracle@cliente ~]$ ldapbind -h ldap01.ejemplo.local -p 3060 -W cn=orcladmin
bind successful

[oracle@cliente ~]$ ldapbind -h ldap02.ejemplo.local -p 3060 -W cn=orcladmin
bind successful

Con los dos nodos validados, se prueba ahora contra el puerto 389 del balanceador:

[oracle@cliente ~]$ ldapbind -h haproxy.ejemplo.local -p 389 -W cn=orcladmin
bind successful

El servicio de HAProxy está funcionando. Queda lo importante: validar que la alta disponibilidad hace su trabajo.

4. Probar la alta disponibilidad

El escenario de control es apagar los dos nodos LDAP y comprobar que el balanceador, efectivamente, ya no tiene a quién enviar la petición:

[oracle@ldap01 ~]$ opmnctl stopproc ias-component=oid1
opmnctl stopproc: stopping opmn managed processes...

[oracle@ldap01 ~]$ opmnctl status

Processes in Instance: asinst_1
------------------+--------------------+---------+---------
ias-component     | process-type       |     pid | status
------------------+--------------------+---------+---------
ohs1              | OHS                |    1636 | Alive
oid1              | oidldapd           |     N/A | Down
oid1              | oidldapd           |     N/A | Down
oid1              | oidmon             |     N/A | Down
EMAGENT           | EMAGENT            |    1635 | Alive

Lo mismo en el segundo nodo con ias-component=oid2. Con ambos abajo, la petición a través de HAProxy falla, como cabe esperar:

[oracle@cliente ~]$ ldapbind -h haproxy.ejemplo.local -p 389 -W cn=orcladmin
ldap_bind: Can't contact LDAP server

Ahora se levanta solo uno de los dos nodos:

[oracle@ldap01 ~]$ opmnctl startproc ias-component=oid1
opmnctl startproc: starting opmn managed processes...

[oracle@ldap01 ~]$ opmnctl status

Processes in Instance: asinst_1
------------------+--------------------+---------+---------
ias-component     | process-type       |     pid | status
------------------+--------------------+---------+---------
ohs1              | OHS                |    1636 | Alive
oid1              | oidldapd           |    3753 | Alive
oid1              | oidldapd           |    3751 | Alive
oid1              | oidmon             |    3745 | Alive
EMAGENT           | EMAGENT            |    1635 | Alive

Y la misma petición contra el balanceador vuelve a resolverse, aunque el otro nodo siga caído:

[oracle@cliente ~]$ ldapbind -h haproxy.ejemplo.local -p 389 -W cn=orcladmin
bind successful

La prueba es simétrica: levantando oid2 y dejando oid1 abajo, el resultado es el mismo. Eso es exactamente lo que se busca — que la caída de un nodo no llegue al cliente.

Resultado

Con esta configuración, los clientes LDAP apuntan a un único destino —el puerto 389 del equipo HAProxy— y dejan de depender de qué nodo concreto esté vivo. El reparto se hace por round robin y la caída de cualquiera de los dos servidores es transparente para el usuario final.

Conviene tener presente que, tal como queda, el balanceador es ahora el punto único de fallo: el servicio LDAP tolera perder un nodo, pero no que se caiga HAProxy. En entornos donde eso importe, el siguiente paso es duplicar también el balanceador con una IP virtual entre las dos instancias.