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
cluster.name: Debe ser idéntico para todos los nodos que deseas que se unan al mismo clúster.cluster.name: my-ha-clusternode.name: Un nombre único para cada nodo, útil para la identificación.node.name: node-1network.host: Vincula Elasticsearch a una interfaz de red específica. Usa0.0.0.0para 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.101http.port: El puerto para la comunicación del cliente HTTP (por defecto 9200).http.port: 9200transport.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.
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"]cluster.initial_master_nodes: Se usa solo al iniciar un clúster completamente nuevo por primera vez. Esta lista debe contener elnode.namede 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_nodesdespués de que el clúster se haya formado con éxito. No lo configures nuevamente para reinicios o para agregar nuevos nodos.
- Consejo Importante: Elimina o comenta
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 sergreen(todos los fragmentos primarios y réplica están asignados) oyellow(todos los fragmentos primarios están asignados, pero algunos fragmentos réplica aún no).redindica 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?ven 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.