Guida alla Configurazione di un Cluster Elasticsearch ad Alta Disponibilità
Configura un cluster Elasticsearch ad alta disponibilità con ruoli dei nodi, discovery, repliche, dimensionamento JVM e controlli di integrità.
Guida alla Configurazione di un Cluster Elasticsearch ad Alta Disponibilità
Elasticsearch può rimanere disponibile nonostante i guasti dei nodi, ma solo se pianifichi correttamente le elezioni del master, il posizionamento dei dati, le repliche e il discovery. Un cluster a nodo singolo può funzionare in sviluppo, ma non può proteggere il tuo carico di lavoro di ricerca da un guasto dell'host.
Questa guida mostra come configurare un cluster Elasticsearch ad alta disponibilità con nodi dedicati eleggibili a master, nodi dati, repliche di shard e comandi di validazione di base.
Comprendere l'Alta Disponibilità in Elasticsearch
L'alta disponibilità in Elasticsearch è ottenuta attraverso diversi meccanismi chiave:
- Architettura Distribuita: Elasticsearch distribuisce intrinsecamente dati e operazioni su più nodi.
- Ruoli dei Nodi: Nodi diversi possono servire scopi diversi, consentendo un'allocazione specializzata delle risorse e l'isolamento dai guasti.
- Replica degli Shard: Ogni indice è diviso in shard, e ogni shard primario può avere uno o più shard replica, memorizzati su nodi diversi.
- Elezione del Nodo Master: Un processo di elezione robusto garantisce che un nodo master sia sempre disponibile per gestire lo stato del cluster.
- Zen Discovery (Zen2): Questo modulo gestisce la scoperta dei nodi e l'elezione del master, assicurando che i nodi possano trovarsi e formare un cluster in modo affidabile.
Ruoli Essenziali dei Nodi
In una configurazione HA, comprendere i ruoli dei nodi è cruciale. I ruoli principali per HA sono:
- Nodi eleggibili a master: Questi nodi sono responsabili della gestione dello stato del cluster, inclusa la creazione/eliminazione di indici, il tracciamento dei nodi e l'allocazione degli shard. Non memorizzano dati né gestiscono direttamente richieste di ricerca/indicizzazione a meno che non abbiano anche il ruolo
data. Per HA, dovresti avere un numero dispari (tipicamente 3) di nodi dedicati eleggibili a master per formare un quorum. - Nodi dati: Questi nodi memorizzano i tuoi dati indicizzati in shard ed eseguono operazioni relative ai dati come ricerca, aggregazione e indicizzazione. Sono i cavalli di battaglia del tuo cluster.
- Nodi solo di coordinamento: (Opzionale) Questi nodi possono essere utilizzati per instradare le richieste, gestire le fasi di riduzione della ricerca e gestire l'indicizzazione bulk. Non contengono dati né stato del cluster, ma possono scaricare lavoro dai nodi dati e master.
Shard e Repliche
Elasticsearch memorizza i tuoi dati in shard. Ogni indice è composto da uno o più shard primari. Per ottenere alta disponibilità, dovresti configurare uno o più shard replica per ogni shard primario. Gli shard replica sono copie degli shard primari. Se un nodo che ospita uno shard primario si guasta, uno shard replica su un altro nodo può essere promosso a nuovo primario, garantendo nessuna perdita di dati e la continuità delle operazioni.
Prerequisiti per Configurare un Cluster HA
Prima di immergerti nella configurazione, assicurati che il tuo ambiente soddisfi questi requisiti di base:
- Pacchetti o archivi Elasticsearch: I pacchetti ufficiali includono un JDK integrato nelle versioni recenti di Elasticsearch. Se la tua installazione utilizza un JDK separato, assicurati che sia compatibile con la tua versione di Elasticsearch.
- Risorse di Sistema: Alloca RAM sufficiente (es. 8-32GB), core CPU e spazio su disco I/O veloce (SSD consigliato) per ogni nodo, specialmente per i nodi dati.
- Configurazione di Rete: Tutti i nodi devono essere in grado di comunicare tra loro su porte specifiche (default 9300 per comunicazione inter-nodo, 9200 per API HTTP). Assicurati che i firewall siano configurati appropriatamente.
- Sistema Operativo: Una distribuzione Linux stabile (es. Ubuntu, CentOS, RHEL) è generalmente preferita per distribuzioni in produzione.
Guida Passo-Passo alla Configurazione del Cluster HA
Questa sezione delinea il processo per installare e configurare un cluster Elasticsearch multi-nodo.
Passo 1: Installa Elasticsearch su Tutti i Nodi
Installa Elasticsearch su ogni server che farà parte del tuo cluster. Puoi utilizzare i gestori di pacchetti (APT per Debian/Ubuntu, YUM per RHEL/CentOS) o scaricare direttamente l'archivio.
Esempio (Debian/Ubuntu tramite 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
Dopo l'installazione, abilita e avvia il servizio (anche se lo configureremo prima).
sudo systemctl daemon-reload
sudo systemctl enable elasticsearch
Passo 2: Configura elasticsearch.yml su Ogni Nodo
Il file elasticsearch.yml, tipicamente situato in /etc/elasticsearch/, è dove definisci le impostazioni del tuo cluster. Modifica questo file su ogni nodo con le configurazioni appropriate.
Configurazione Comune per Tutti i Nodi
cluster.name: Deve essere identico per tutti i nodi che vuoi uniscano allo stesso cluster.cluster.name: my-ha-clusternode.name: Un nome univoco per ogni nodo, utile per l'identificazione.node.name: node-1network.host: Associa Elasticsearch a un'interfaccia di rete specifica. Usa0.0.0.0per associare a tutte le interfacce disponibili, o un indirizzo IP specifico.network.host: 0.0.0.0 # o un indirizzo IP specifico per sicurezza/configurazioni multi-NIC # network.host: 192.168.1.101http.port: La porta per la comunicazione client HTTP (default 9200).http.port: 9200transport.port: La porta per la comunicazione inter-nodo (default 9300). Dovrebbe essere coerente.transport.port: 9300
Impostazioni di Discovery (Cruciali per HA)
Queste impostazioni dicono ai nodi come trovarsi e formare un cluster.
discovery.seed_hosts: Un elenco di indirizzi dei nodi eleggibili a master nel tuo cluster. Questo è il modo in cui i nodi scoprono i nodi eleggibili a master iniziali. Fornisci gli indirizzi IP o i nomi host di tutti i tuoi nodi eleggibili a master.discovery.seed_hosts: ["192.168.1.101", "192.168.1.102", "192.168.1.103"]cluster.initial_master_nodes: Usato solo quando si avvia un cluster completamente nuovo per la prima volta. Questo elenco dovrebbe contenere ilnode.namedei nodi eleggibili a master che parteciperanno alla prima elezione del master. Una volta che il cluster si è formato, questa impostazione viene ignorata.cluster.initial_master_nodes: ["node-1", "node-2", "node-3"]- Consiglio Importante: Rimuovi o commenta
cluster.initial_master_nodesdopo che il cluster si è formato con successo. Non impostarlo di nuovo per riavvii o per aggiungere nuovi nodi.
- Consiglio Importante: Rimuovi o commenta
Configurazione dei Ruoli dei Nodi
Specifica il/i ruolo/i per ogni nodo. Una configurazione HA comune prevede 3 nodi master dedicati e diversi nodi dati.
- Nodi Eleggibili a Master (es. node-1, node-2, node-3):
node.roles: [master] - Nodi Dati (es. node-4, node-5, node-6):
node.roles: [data] - Nodi con Ruolo Misto (non consigliato per grandi produzioni HA):
node.roles: [master, data]- Migliori Pratiche: Per una vera alta disponibilità e stabilità in produzione, dedica nodi separati per i ruoli master e dati. Questo isola i processi master critici dalle operazioni dati intensive in termini di risorse.
Passo 3: Configura la Dimensione dell'Heap JVM
Modifica /etc/elasticsearch/jvm.options per impostare la dimensione dell'heap JVM. Una buona regola pratica è allocare il 50% della RAM disponibile, ma mai superare 30-32GB. Ad esempio, se un server ha 16GB di RAM, alloca 8GB:
-Xms8g
-Xmx8g
Passo 4: Impostazioni di Sistema
Per la produzione, aumenta vm.max_map_count e ulimit per i file aperti su tutti i nodi. Aggiungi queste righe a /etc/sysctl.conf e applica (sudo sysctl -p).
vm.max_map_count=262144
E in /etc/security/limits.conf (o /etc/security/limits.d/99-elasticsearch.conf):
elasticsearch - nofile 65536
elasticsearch - memlock unlimited
Passo 5: Avvia i Servizi Elasticsearch
Avvia il servizio Elasticsearch su tutti i nodi configurati. Spesso è consigliato avviare prima i nodi eleggibili a master, ma con il discovery moderno, l'ordine è meno critico purché discovery.seed_hosts sia configurato correttamente.
sudo systemctl start elasticsearch
Controlla lo stato del servizio e i log per eventuali errori:
sudo systemctl status elasticsearch
sudo journalctl -f -u elasticsearch
Passo 6: Verifica la Salute del Cluster
Una volta che tutti i nodi sono in esecuzione, verifica la salute del cluster utilizzando l'API Elasticsearch. Puoi interrogare qualsiasi nodo del cluster.
curl -X GET "localhost:9200/_cat/health?v&pretty"
Output Atteso:
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: Dovrebbe esseregreen(tutti gli shard primari e replica sono allocati) oyellow(tutti gli shard primari sono allocati, ma alcuni shard replica non ancora).redindica un problema serio.node.total: Dovrebbe corrispondere al numero totale di nodi che hai avviato.node.data: Dovrebbe corrispondere al numero di nodi dati.
Controlla i nodi per assicurarti che si siano tutti uniti al cluster:
curl -X GET "localhost:9200/_cat/nodes?v&pretty"
Output Atteso (esempio per 3 master, 3 nodi dati):
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
Questo mostra node-1 come master eletto (* sotto la colonna master) e gli altri nodi come parte del cluster.
Passo 7: Configura lo Sharding e la Replica degli Indici
Per gli indici appena creati, Elasticsearch imposta per default uno shard primario e una replica (index.number_of_shards: 1, index.number_of_replicas: 1). Per HA, in genere vuoi almeno una replica, il che significa che i tuoi dati esistono su almeno due nodi diversi. Questo garantisce che se un nodo si guasta, una replica sia disponibile altrove.
Quando crei un indice, specifica queste impostazioni:
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
}
}
}'
Se la sicurezza è abilitata, usa HTTPS e credenziali o una chiave API nel tuo comando curl. Ad esempio:
curl --cacert /etc/elasticsearch/certs/http_ca.crt -u elastic "https://localhost:9200/_cluster/health?pretty"
Controlli Operativi
Dopo che il cluster è verde, verifica il comportamento in caso di guasto prima che il traffico di produzione dipenda da esso:
- Ferma un nodo dati e conferma che le repliche vengano promosse e i primari rimangano disponibili.
- Ferma il nodo master eletto e conferma che un altro nodo eleggibile a master venga eletto.
- Controlla
_cat/shards?vper shard non assegnati dopo che il cluster si è stabilizzato. - Conferma che i client si connettano attraverso più nodi o un bilanciatore di carico invece di un singolo endpoint HTTP.
Conclusione Finale
L'alta disponibilità di Elasticsearch deriva da tre scelte pratiche: mantenere un quorum master affidabile, posizionare le repliche degli shard su nodi diversi e rendere i client resilienti alla perdita di nodi. Inizia con tre nodi dedicati eleggibili a master, abbastanza nodi dati per contenere shard primari e replica, e una procedura di ripristino testata per riavvii e guasti dei nodi.