Guía para Configurar un Clúster de Elasticsearch de Alta Disponibilidad

Configura un clúster de Elasticsearch de alta disponibilidad con roles de nodo, descubrimiento, réplicas, dimensionamiento de JVM y verificaciones de salud.

Guía para Configurar un Clúster de Elasticsearch de Alta Disponibilidad

Elasticsearch puede mantenerse disponible ante fallos de nodos, pero solo si planificas correctamente las elecciones de maestro, la colocación de datos, las réplicas y el descubrimiento. Un clúster de un solo nodo puede funcionar en desarrollo, pero no puede proteger tu carga de trabajo de búsqueda ante una falla del host.

Esta guía te muestra cómo configurar un clúster de Elasticsearch de alta disponibilidad con nodos dedicados elegibles como maestro, nodos de datos, réplicas de fragmentos y comandos básicos de validación.

Comprendiendo la Alta Disponibilidad en Elasticsearch

La alta disponibilidad en Elasticsearch se logra a través de varios mecanismos clave:

  • Arquitectura Distribuida: Elasticsearch distribuye inherentemente los datos y las operaciones a través de múltiples nodos.
  • Roles de Nodo: Diferentes nodos pueden servir diferentes propósitos, permitiendo una asignación especializada de recursos y aislamiento de fallos.
  • Replicación de Fragmentos: Cada índice se divide en fragmentos, y cada fragmento primario puede tener uno o más fragmentos réplica, almacenados en diferentes nodos.
  • Elección de Nodo Maestro: Un proceso de elección robusto asegura que siempre haya un nodo maestro disponible para gestionar el estado del clúster.
  • Descubrimiento Zen (Zen2): Este módulo maneja el descubrimiento de nodos y la elección de maestro, asegurando que los nodos puedan encontrarse entre sí y formar un clúster de manera confiable.

Roles Esenciales de Nodo

En una configuración de alta disponibilidad, comprender los roles de los nodos es crucial. Los roles principales para alta disponibilidad son:

  • Nodos elegibles como maestro: Estos nodos son responsables de gestionar el estado del clúster, incluyendo la creación/eliminación de índices, el seguimiento de nodos y la asignación de fragmentos. No almacenan datos ni manejan solicitudes de búsqueda/índice directamente a menos que también tengan el rol de data. Para alta disponibilidad, debes tener un número impar (típicamente 3) de nodos dedicados elegibles como maestro para formar un quórum.
  • Nodos de datos: Estos nodos almacenan tus datos indexados en fragmentos y realizan operaciones relacionadas con datos como búsqueda, agregación e indexación. Son los caballos de batalla de tu clúster.
  • Nodos solo de coordinación: (Opcional) Estos nodos se pueden usar para enrutar solicitudes, manejar fases de reducción de búsqueda y gestionar la indexación por lotes. No contienen datos ni estado del clúster, pero pueden descargar trabajo de los nodos de datos y maestro.

Fragmentos y Réplicas

Elasticsearch almacena tus datos en fragmentos. Cada índice consta de uno o más fragmentos primarios. Para lograr alta disponibilidad, debes configurar uno o más fragmentos réplica para cada fragmento primario. Los fragmentos réplica son copias de los fragmentos primarios. Si un nodo que aloja un fragmento primario falla, un fragmento réplica en otro nodo puede ser promovido para convertirse en el nuevo primario, asegurando que no haya pérdida de datos y la operación continúe.

Requisitos Previos para Configurar un Clúster de Alta Disponibilidad

Antes de sumergirte en la configuración, asegúrate de que tu entorno cumpla con estos requisitos básicos:

  • Paquetes o archivos de Elasticsearch: Los paquetes oficiales incluyen un JDK incluido en versiones recientes de Elasticsearch. Si tu instalación usa un JDK separado, asegúrate de que sea compatible con tu versión de Elasticsearch.
  • Recursos del Sistema: Asigna suficiente RAM (por ejemplo, 8-32 GB), núcleos de CPU y espacio en disco de E/S rápida (se recomienda SSD) para cada nodo, especialmente los nodos de datos.
  • Configuración de Red: Todos los nodos deben poder comunicarse entre sí a través de puertos específicos (por defecto 9300 para comunicación entre nodos, 9200 para API HTTP). Asegúrate de que los firewalls estén configurados adecuadamente.
  • Sistema Operativo: Generalmente se prefiere una distribución Linux estable (por ejemplo, Ubuntu, CentOS, RHEL) para implementaciones en producción.

Guía Paso a Paso para la Configuración del Clúster de Alta Disponibilidad

Esta sección describe el proceso para instalar y configurar un clúster de Elasticsearch de múltiples nodos.

Paso 1: Instalar Elasticsearch en Todos los Nodos

Instala Elasticsearch en cada servidor que formará parte de tu clúster. Puedes usar gestores de paquetes (APT para Debian/Ubuntu, YUM para RHEL/CentOS) o descargar el archivo directamente.

Ejemplo (Debian/Ubuntu vía APT):

wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo gpg --dearmor -o /usr/share/keyrings/elasticsearch-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/elasticsearch-keyring.gpg] https://artifacts.elastic.co/packages/8.x/apt stable main" | sudo tee /etc/apt/sources.list.d/elastic-8.x.list
sudo apt update
sudo apt install elasticsearch

Después de la instalación, habilita e inicia el servicio (aunque lo configuraremos primero).

sudo systemctl daemon-reload
sudo systemctl enable elasticsearch

Paso 2: Configurar elasticsearch.yml en Cada Nodo

El archivo elasticsearch.yml, ubicado típicamente en /etc/elasticsearch/, es donde defines la configuración de tu clúster. Edita este archivo en cada nodo con las configuraciones apropiadas.

Configuración Común para Todos los Nodos

  1. cluster.name: Debe ser idéntico para todos los nodos que deseas que se unan al mismo clúster.

    cluster.name: my-ha-cluster
    
  2. node.name: Un nombre único para cada nodo, útil para la identificación.

    node.name: node-1
    
  3. network.host: Vincula Elasticsearch a una interfaz de red específica. Usa 0.0.0.0 para vincular a todas las interfaces disponibles, o una dirección IP específica.

    network.host: 0.0.0.0
    # o una dirección IP específica para configuraciones de seguridad/múltiples NIC
    # network.host: 192.168.1.101
    
  4. http.port: El puerto para la comunicación del cliente HTTP (por defecto 9200).

    http.port: 9200
    
  5. transport.port: El puerto para la comunicación entre nodos (por defecto 9300). Debe ser consistente.

    transport.port: 9300
    

Configuración de Descubrimiento (Crucial para Alta Disponibilidad)

Estas configuraciones indican a los nodos cómo encontrarse entre sí y formar un clúster.

  1. discovery.seed_hosts: Una lista de direcciones de nodos elegibles como maestro en tu clúster. Así es como los nodos descubren nodos elegibles como maestro iniciales. Proporciona las direcciones IP o nombres de host de todos tus nodos elegibles como maestro.

    discovery.seed_hosts: ["192.168.1.101", "192.168.1.102", "192.168.1.103"]
    
  2. cluster.initial_master_nodes: Se usa solo al iniciar un clúster completamente nuevo por primera vez. Esta lista debe contener el node.name de los nodos elegibles como maestro que participarán en la primera elección de maestro. Una vez que el clúster se ha formado, esta configuración se ignora.

    cluster.initial_master_nodes: ["node-1", "node-2", "node-3"]
    
    • Consejo Importante: Elimina o comenta cluster.initial_master_nodes después de que el clúster se haya formado con éxito. No lo configures nuevamente para reinicios o para agregar nuevos nodos.

Configuración de Roles de Nodo

Especifica el(los) rol(es) para cada nodo. Una configuración común de alta disponibilidad implica 3 nodos maestro dedicados y varios nodos de datos.

  • Nodos Elegibles como Maestro (por ejemplo, node-1, node-2, node-3):
    node.roles: [master]
    
  • Nodos de Datos (por ejemplo, node-4, node-5, node-6):
    node.roles: [data]
    
  • Nodos de Rol Mixto (no recomendado para alta disponibilidad en producción grande):
    node.roles: [master, data]
    
    • Mejor Práctica: Para una verdadera alta disponibilidad y estabilidad en producción, dedica nodos separados para los roles de maestro y datos. Esto aísla los procesos críticos del maestro de las operaciones intensivas de datos.

Paso 3: Configurar el Tamaño del Heap de JVM

Edita /etc/elasticsearch/jvm.options para establecer el tamaño del heap de JVM. Una buena regla general es asignar el 50% de la RAM disponible, pero sin exceder nunca los 30-32 GB. Por ejemplo, si un servidor tiene 16 GB de RAM, asigna 8 GB:

-Xms8g
-Xmx8g

Paso 4: Configuración del Sistema

Para producción, aumenta vm.max_map_count y ulimit para archivos abiertos en todos los nodos. Agrega estas líneas a /etc/sysctl.conf y aplica (sudo sysctl -p).

vm.max_map_count=262144

Y en /etc/security/limits.conf (o /etc/security/limits.d/99-elasticsearch.conf):

elasticsearch - nofile 65536
elasticsearch - memlock unlimited

Paso 5: Iniciar los Servicios de Elasticsearch

Inicia el servicio de Elasticsearch en todos los nodos configurados. A menudo se recomienda iniciar primero los nodos elegibles como maestro, pero con el descubrimiento moderno, el orden es menos crítico siempre que discovery.seed_hosts esté configurado correctamente.

sudo systemctl start elasticsearch

Verifica el estado del servicio y los registros en busca de errores:

sudo systemctl status elasticsearch
sudo journalctl -f -u elasticsearch

Paso 6: Verificar la Salud del Clúster

Una vez que todos los nodos estén en ejecución, verifica la salud del clúster usando la API de Elasticsearch. Puedes consultar cualquier nodo del clúster.

curl -X GET "localhost:9200/_cat/health?v&pretty"

Salida Esperada:

epoch      timestamp cluster        status node.total node.data shards pri relo init unassign pending_tasks max_task_wait_time active_shards_percent
1678886400 12:00:00  my-ha-cluster  green      6          3       0    0    0    0        0             0                  -                 100.0%
  • status: Debe ser green (todos los fragmentos primarios y réplica están asignados) o yellow (todos los fragmentos primarios están asignados, pero algunos fragmentos réplica aún no). red indica un problema grave.
  • node.total: Debe coincidir con el número total de nodos que iniciaste.
  • node.data: Debe coincidir con el número de nodos de datos.

Verifica los nodos para asegurarte de que todos se hayan unido al clúster:

curl -X GET "localhost:9200/_cat/nodes?v&pretty"

Salida Esperada (ejemplo para 3 nodos maestro, 3 nodos de datos):

ip         heap.percent ram.percent cpu load_1m load_5m load_15m node.role   master name
192.168.1.101          21          87   0    0.00    0.01     0.05 m           *      node-1
192.168.1.102          20          88   0    0.00    0.01     0.05 m           -      node-2
192.168.1.103          22          86   0    0.00    0.01     0.05 m           -      node-3
192.168.1.104          35          90   1    0.10    0.12     0.11 d           -      node-4
192.168.1.105          32          89   1    0.11    0.13     0.10 d           -      node-5
192.168.1.106          30          91   1    0.12    0.10     0.09 d           -      node-6

Esto muestra node-1 como el maestro elegido (* bajo la columna master) y otros nodos como parte del clúster.

Paso 7: Configurar la Fragmentación y Replicación de Índices

Para índices recién creados, Elasticsearch tiene por defecto un fragmento primario y una réplica (index.number_of_shards: 1, index.number_of_replicas: 1). Para alta disponibilidad, normalmente deseas al menos una réplica, lo que significa que tus datos existen en al menos dos nodos diferentes. Esto asegura que si un nodo falla, una réplica esté disponible en otro lugar.

Al crear un índice, especifica estas configuraciones:

curl -X PUT "localhost:9200/my_ha_index?pretty" -H 'Content-Type: application/json' -d'
{
  "settings": {
    "index": {
      "number_of_shards": 3,
      "number_of_replicas": 1
    }
  }
}'

Si la seguridad está habilitada, usa HTTPS y credenciales o una clave de API en tu comando curl. Por ejemplo:

curl --cacert /etc/elasticsearch/certs/http_ca.crt -u elastic "https://localhost:9200/_cluster/health?pretty"

Verificaciones Operacionales

Después de que el clúster esté en verde, verifica el comportamiento ante fallos antes de que el tráfico de producción dependa de él:

  • Detén un nodo de datos y confirma que las réplicas sean promovidas y los primarios permanezcan disponibles.
  • Detén el nodo maestro elegido y confirma que otro nodo elegible como maestro sea elegido.
  • Verifica _cat/shards?v en busca de fragmentos no asignados después de que el clúster se estabilice.
  • Confirma que los clientes se conecten a través de múltiples nodos o un balanceador de carga en lugar de un único punto final HTTP.

Conclusión Final

La alta disponibilidad de Elasticsearch proviene de tres elecciones prácticas: mantener un quórum de maestro confiable, colocar réplicas de fragmentos en diferentes nodos y hacer que los clientes sean resistentes a la pérdida de nodos. Comienza con tres nodos dedicados elegibles como maestro, suficientes nodos de datos para contener fragmentos primarios y réplica, y un procedimiento de recuperación probado para reinicios y fallos de nodos.