Guida alla configurazione di un cluster Elasticsearch ad alta disponibilità

Garantisci l'operatività continua e la tolleranza ai guasti con questa guida completa alla configurazione di un cluster Elasticsearch ad alta disponibilità. Impara a configurare più nodi Elasticsearch, a comprendere concetti critici come i ruoli dei nodi e la replicazione dei shard, e a implementare impostazioni di discovery per un ambiente di produzione robusto. Questo articolo fornisce istruzioni passo passo, esempi pratici e best practice essenziali per garantire che il tuo motore di ricerca e analisi distribuito sia resiliente, sicuro e sempre disponibile. Preveni la perdita di dati e i tempi di inattività acquisendo padronanza delle configurazioni Elasticsearch HA.

57 visualizzazioni

Guida alla configurazione di un cluster Elasticsearch ad alta disponibilità

Elasticsearch è un potente motore di ricerca e analisi distribuito, progettato per scalabilità e resilienza. Negli ambienti di produzione, garantire l'operatività continua e la tolleranza ai guasti è fondamentale. Questa guida ti accompagnerà attraverso i passaggi essenziali per configurare più nodi Elasticsearch per creare un cluster robusto e ad alta disponibilità (HA). Seguendo queste istruzioni, imparerai come configurare il tuo cluster per resistere ai guasti dei nodi e mantenere l'accessibilità dei dati, garantendo che le tue applicazioni rimangano reattive e i tuoi dati sicuri.

La configurazione di un cluster Elasticsearch ad alta disponibilità richiede un'attenta pianificazione dei ruoli dei nodi, della configurazione di rete e delle strategie di replica dei dati. L'obiettivo è distribuire il carico di lavoro e i dati in modo ridondante su più macchine, eliminando i singoli punti di guasto. Questo articolo coprirà i concetti fondamentali, i passaggi di configurazione pratici e le migliori pratiche per aiutarti a costruire un'infrastruttura Elasticsearch resiliente, adatta a casi d'uso di produzione esigenti.

Comprensione dell'Alta Disponibilità in Elasticsearch

L'alta disponibilità in Elasticsearch si ottiene attraverso diversi meccanismi chiave:

  • Architettura Distribuita: Elasticsearch distribuisce intrinsecamente dati e operazioni su più nodi.
  • Ruoli dei Nodi: Nodi diversi possono svolgere scopi diversi, consentendo un'allocazione specializzata delle risorse e l'isolamento dei guasti.
  • Replica degli Shard: Ogni indice è diviso in shard e ogni shard primario può avere uno o più shard replica, archiviati su nodi diversi.
  • Elezione del Nodo Master: Un robusto processo di elezione 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, garantendo che i nodi possano trovarsi l'un l'altro e formare un cluster in modo affidabile.

Ruoli Essenziali dei Nodi

In una configurazione HA, la comprensione dei ruoli dei nodi è cruciale. I ruoli primari per l'HA sono:

  • Nodi idonei al ruolo di master: Questi nodi sono responsabili della gestione dello stato del cluster, inclusa la creazione/eliminazione di indici, il monitoraggio dei nodi e l'allocazione degli shard. Non memorizzano dati né gestiscono richieste di ricerca/indicizzazione direttamente, a meno che non abbiano anche il ruolo data. Per l'HA, dovresti avere un numero dispari (tipicamente 3) di nodi dedicati idonei al ruolo di 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 richieste, gestire le fasi di riduzione della ricerca e gestire l'indicizzazione in blocco. Non contengono dati né stato del cluster, ma possono scaricare lavoro dai nodi dati e master.

Shard e Replica

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 fallisce, uno shard replica su un altro nodo può essere promosso a nuovo shard primario, garantendo nessuna perdita di dati e l'operatività continua.

Prerequisiti per la configurazione di un cluster HA

Prima di addentrarci nella configurazione, assicurati che il tuo ambiente soddisfi questi requisiti di base:

  • Java Development Kit (JDK): Elasticsearch richiede un JDK compatibile (tipicamente OpenJDK). Assicurati che sia installato su tutti i nodi.
  • Risorse di Sistema: Assegna RAM sufficiente (ad es. 8-32 GB), core CPU e spazio su disco con I/O veloce (SSD consigliato) per ogni nodo, in particolare per i nodi dati.
  • Configurazione di Rete: Tutti i nodi devono essere in grado di comunicare tra loro su porte specifiche (la predefinita è 9300 per la comunicazione inter-nodo, 9200 per l'API HTTP). Assicurati che i firewall siano configurati correttamente.
  • Sistema Operativo: Una distribuzione Linux stabile (ad es. Ubuntu, CentOS, RHEL) è generalmente preferita per le distribuzioni di produzione.

Guida passo passo alla configurazione del cluster HA

Questa sezione illustra il processo di installazione e configurazione di un cluster Elasticsearch multi-nodo.

Passaggio 1: Installare Elasticsearch su tutti i nodi

Installa Elasticsearch su ciascun 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

Passaggio 2: Configurare elasticsearch.yml su ciascun nodo

Il file elasticsearch.yml, tipicamente situato in /etc/elasticsearch/, è dove definisci le impostazioni del tuo cluster. Modifica questo file su ciascun nodo con le configurazioni appropriate.

Configurazione comune per tutti i nodi

  1. cluster.name: Questo deve essere identico per tutti i nodi che desideri unire allo stesso cluster.
    yaml cluster.name: my-ha-cluster

  2. node.name: Un nome univoco per ogni nodo, utile per l'identificazione.
    yaml node.name: node-1

  3. network.host: Associa Elasticsearch a una specifica interfaccia di rete. Usa 0.0.0.0 per associare a tutte le interfacce disponibili, o un indirizzo IP specifico.
    yaml network.host: 0.0.0.0 # o un indirizzo IP specifico per configurazioni di sicurezza/multi-NIC # network.host: 192.168.1.101

  4. http.port: La porta per la comunicazione del client HTTP (predefinita 9200).
    yaml http.port: 9200

  5. transport.port: La porta per la comunicazione inter-nodo (predefinita 9300). Dovrebbe essere coerente.
    yaml transport.port: 9300

Impostazioni di Discovery (Cruciali per l'HA)

Queste impostazioni indicano ai nodi come trovarsi l'un l'altro e formare un cluster.

  1. discovery.seed_hosts: Un elenco di indirizzi dei nodi idonei al ruolo di master nel tuo cluster. È così che i nodi scoprono i nodi idonei al ruolo di master iniziali. Fornisci gli indirizzi IP o i nomi host di tutti i tuoi nodi idonei al ruolo di master.
    yaml discovery.seed_hosts: ["192.168.1.101", "192.168.1.102", "192.168.1.103"]

  2. cluster.initial_master_nodes: Utilizzato solo per l'avvio di un cluster nuovo di zecca per la prima volta. Questo elenco dovrebbe contenere il node.name dei nodi idonei al ruolo di master che parteciperanno alla prima elezione del master. Una volta che il cluster si è formato, questa impostazione viene ignorata.
    yaml cluster.initial_master_nodes: ["node-1", "node-2", "node-3"]

    • Suggerimento Importante: Rimuovi o commenta cluster.initial_master_nodes dopo che il cluster si è formato con successo per evitare comportamenti indesiderati se un nodo si riavvia e tenta di formare un nuovo cluster.

Configurazione dei Ruoli dei Nodi

Specifica il/i ruolo/i per ciascun nodo. Una configurazione HA comune coinvolge 3 nodi master dedicati e diversi nodi dati.

  • Nodi idonei al ruolo di Master (ad es. node-1, node-2, node-3):
    yaml node.roles: [master]
  • Nodi Dati (ad es. node-4, node-5, node-6):
    yaml node.roles: [data]
  • Nodi con ruoli misti (non raccomandato per HA di produzione su larga scala):
    yaml node.roles: [master, data]
    • Migliore Pratica: Per una vera alta disponibilità e stabilità in produzione, dedica nodi separati per i ruoli master e data. Questo isola i processi master critici dalle operazioni sui dati ad alta intensità di risorse.

Passaggio 3: Configurare la dimensione dello Heap JVM

Modifica /etc/elasticsearch/jvm.options per impostare la dimensione dello heap JVM. Una buona regola generale è allocare il 50% della RAM disponibile, ma mai superare i 30-32 GB. Ad esempio, se un server ha 16 GB di RAM, alloca 8 GB:

-Xms8g
-Xmx8g

Passaggio 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 applicale (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

Passaggio 5: Avviare i servizi Elasticsearch

Avvia il servizio Elasticsearch su tutti i nodi configurati. È spesso consigliato avviare prima i nodi idonei al ruolo di master, ma con la discovery moderna, l'ordine è meno critico finché discovery.seed_hosts è 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

Passaggio 6: Verificare lo stato di salute del cluster

Una volta che tutti i nodi sono in esecuzione, verifica lo stato di 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 essere green (tutti gli shard primari e replica sono allocati) o yellow (tutti gli shard primari sono allocati, ma alcuni shard replica non lo sono ancora). red indica un problema serio.
  • node.total: Dovrebbe corrispondere al numero totale di nodi avviati.
  • 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.

Passaggio 7: Configurare Sharding e Replica degli Indici

Per gli indici creati di recente, Elasticsearch utilizza per impostazione predefinita uno shard primario e una replica (index.number_of_shards: 1, index.number_of_replicas: 1). Per l'HA, solitamente si desidera almeno una replica, il che significa che i tuoi dati esistono su almeno due nodi diversi. Ciò garantisce che, se un nodo fallisce, una replica sia disponibile altrove.

Quando crei un indice, specifica queste impostazioni:

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