Guía para configurar un clúster Elasticsearch de alta disponibilidad
Elasticsearch es un potente motor de búsqueda y análisis distribuido diseñado para la escalabilidad y la resiliencia. En entornos de producción, garantizar la operación continua y la tolerancia a fallos es primordial. Esta guía le guiará a través de los pasos esenciales para configurar múltiples nodos de Elasticsearch para crear un clúster robusto de alta disponibilidad (HA). Siguiendo estas instrucciones, aprenderá a configurar su clúster para resistir fallos de nodos y mantener la accesibilidad de los datos, asegurando que sus aplicaciones sigan siendo receptivas y sus datos permanezcan seguros.
La configuración de un clúster Elasticsearch de alta disponibilidad implica una planificación cuidadosa de los roles de los nodos, la configuración de red y las estrategias de replicación de datos. El objetivo es distribuir la carga de trabajo y los datos de forma redundante en varias máquinas, eliminando puntos únicos de fallo. Este artículo cubrirá los conceptos centrales, los pasos de configuración prácticos y las mejores prácticas para ayudarle a construir una infraestructura Elasticsearch resiliente, adecuada para casos de uso de producción exigentes.
Comprensión de la alta disponibilidad en Elasticsearch
La alta disponibilidad en Elasticsearch se logra a través de varios mecanismos clave:
- Arquitectura Distribuida: Elasticsearch distribuye intrínsecamente los datos y las operaciones entre múltiples nodos.
- Roles de Nodos: Diferentes nodos pueden desempeñar distintos propósitos, permitiendo una asignación de recursos especializada y aislamiento de fallos.
- Replicación de Shards: Cada índice se divide en shards, y cada shard primario puede tener uno o más shards réplica, almacenados en nodos diferentes.
- Elección de Nodos Maestro: Un robusto proceso de elección asegura que un nodo maestro esté siempre disponible para gestionar el estado del clúster.
- Descubrimiento Zen (Zen2): Este módulo maneja el descubrimiento de nodos y la elección del maestro, asegurando que los nodos puedan encontrarse entre sí y formar un clúster de manera confiable.
Roles Esenciales de Nodos
En una configuración HA, comprender los roles de los nodos es crucial. Los roles principales para HA son:
- Nodos aptos para maestro: Estos nodos son responsables de gestionar el estado del clúster, incluida la creación/eliminación de índices, el seguimiento de nodos y la asignación de shards. No almacenan datos ni manejan solicitudes de búsqueda/indexación directamente a menos que también tengan el rol de
data. Para HA, debe tener un número impar (típicamente 3) de nodos dedicados aptos para maestro para formar un quórum. - Nodos de datos: Estos nodos almacenan sus datos indexados en shards y realizan operaciones relacionadas con los datos como búsqueda, agregación e indexación. Son los caballos de batalla de su 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 masiva. No almacenan datos ni el estado del clúster, pero pueden descargar trabajo de los nodos de datos y maestros.
Shards y Réplicas
Elasticsearch almacena sus datos en shards. Cada índice consta de uno o más shards primarios. Para lograr alta disponibilidad, debe configurar uno o más shards réplica para cada shard primario. Los shards réplica son copias de los shards primarios. Si falla un nodo que aloja un shard primario, un shard réplica en otro nodo puede ser promovido para ser el nuevo primario, asegurando la no pérdida de datos y la operación continua.
Requisitos previos para configurar un clúster HA
Antes de sumergirse en la configuración, asegúrese de que su entorno cumple con estos requisitos básicos:
- Kit de Desarrollo de Java (JDK): Elasticsearch requiere un JDK compatible (típicamente OpenJDK). Asegúrese de que esté instalado en todos los nodos.
- Recursos del Sistema: Asigne 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 para los nodos de datos.
- Configuración de Red: Todos los nodos deben poder comunicarse entre sí a través de puertos específicos (el predeterminado es 9300 para comunicación inter-nodo, 9200 para la API HTTP). Asegúrese de que los firewalls estén configurados apropiadamente.
- Sistema Operativo: Generalmente se prefiere una distribución Linux estable (por ejemplo, Ubuntu, CentOS, RHEL) para implementaciones de producción.
Guía paso a paso para la configuración del clúster HA
Esta sección describe el proceso de instalación y configuración de un clúster Elasticsearch multinodo.
Paso 1: Instalar Elasticsearch en todos los nodos
Instale Elasticsearch en cada servidor que formará parte de su clúster. Puede usar administradores 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, habilite e inicie 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, típicamente ubicado en /etc/elasticsearch/, es donde define la configuración de su clúster. Edite 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 desee que se unan al mismo clúster.
yaml cluster.name: my-ha-cluster -
node.name: Un nombre único para cada nodo, útil para la identificación.
yaml node.name: node-1 -
network.host: Vincula Elasticsearch a una interfaz de red específica. Use0.0.0.0para vincular a todas las interfaces disponibles, o una dirección IP específica.
yaml 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 -
http.port: El puerto para la comunicación del cliente HTTP (predeterminado 9200).
yaml http.port: 9200 -
transport.port: El puerto para la comunicación inter-nodo (predeterminado 9300). Debe ser consistente.
yaml transport.port: 9300
Configuración de descubrimiento (Crucial para HA)
Estas configuraciones indican a los nodos cómo encontrarse y formar un clúster.
-
discovery.seed_hosts: Una lista de direcciones de los nodos aptos para maestro en su clúster. Así es como los nodos descubren los nodos aptos para maestro iniciales. Proporcione las direcciones IP o nombres de host de todos sus nodos aptos para maestro.
yaml 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 aptos para maestro que participarán en la primera elección del maestro. Una vez que el clúster se ha formado, esta configuración se ignora.
yaml cluster.initial_master_nodes: ["node-1", "node-2", "node-3"]- Consejo Importante: Elimine o comente
cluster.initial_master_nodesdespués de que el clúster se haya formado con éxito para evitar comportamientos no deseados si un nodo se reinicia e intenta formar un nuevo clúster.
- Consejo Importante: Elimine o comente
Configuración de roles de nodo
Especifique el rol (o roles) para cada nodo. Una configuración HA común involucra 3 nodos maestros dedicados y varios nodos de datos.
- Nodos aptos para maestro (por ejemplo, node-1, node-2, node-3):
yaml node.roles: [master] - Nodos de datos (por ejemplo, node-4, node-5, node-6):
yaml node.roles: [data] - Nodos de rol mixto (no recomendado para HA de producción a gran escala):
yaml node.roles: [master, data]- Mejor Práctica: Para una alta disponibilidad y estabilidad reales en producción, dedique nodos separados para los roles de maestro y datos. Esto aísla los procesos críticos del maestro de las operaciones de datos que consumen muchos recursos.
Paso 3: Configurar el tamaño del montón de JVM
Edite /etc/elasticsearch/jvm.options para establecer el tamaño del montón de JVM. Una buena regla general es asignar el 50% de la RAM disponible, pero nunca excediendo los 30-32 GB. Por ejemplo, si un servidor tiene 16 GB de RAM, asigne 8 GB:
-Xms8g
-Xmx8g
Paso 4: Configuración del Sistema
Para producción, aumente vm.max_map_count y ulimit para archivos abiertos en todos los nodos. Agregue estas líneas a /etc/sysctl.conf y aplíquelas (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
Inicie el servicio Elasticsearch en todos los nodos configurados. A menudo se recomienda iniciar primero los nodos aptos para maestro, pero con el descubrimiento moderno, el orden es menos crítico siempre que discovery.seed_hosts esté correctamente configurado.
sudo systemctl start elasticsearch
Verifique 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 funcionamiento, verifique la salud del clúster utilizando la API de Elasticsearch. Puede 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 0 - 100.0%
status: Debería sergreen(todos los shards primarios y réplica están asignados) oyellow(todos los shards primarios están asignados, pero algunos shards réplica aún no lo están).redindica un problema grave.node.total: Debería coincidir con el número total de nodos que inició.node.data: Debería coincidir con el número de nodos de datos.
Verifique los nodos para asegurarse de que todos se han unido al clúster:
curl -X GET "localhost:9200/_cat/nodes?v&pretty"
Salida esperada (ejemplo para 3 maestros, 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 el sharding y la replicación de índices
Para los índices recién creados, Elasticsearch usa por defecto un shard primario y una réplica (index.number_of_shards: 1, index.number_of_replicas: 1). Para HA, generalmente desea al menos una réplica, lo que significa que sus datos existen en al menos dos nodos diferentes. Esto asegura que si falla un nodo, una réplica está disponible en otro lugar.
Al crear un índice, especifique estas configuraciones:
```bash
curl -X PUT "localhost:9200/my_ha_index?pretty" -H 'Content-Type: application/json' -d'
{
"settings": {
"index": {
"number_of_shards": 3