Guida al Dimensionamento degli Shard di Elasticsearch: Bilanciare Prestazioni e Scalabilità

Dimensiona gli shard di Elasticsearch con obiettivi pratici, controlli di capacità, rollover ILM e piani di reindicizzazione sicuri.

Guida al Dimensionamento degli Shard di Elasticsearch: Bilanciare Prestazioni e Scalabilità

Elasticsearch è un potente motore di ricerca e analisi distribuito che eccelle nella gestione di volumi massivi di dati. Tuttavia, ottenere prestazioni e stabilità ottimali dipende in modo significativo da come strutturi la distribuzione dei dati—in particolare, il dimensionamento degli shard. Gli shard sono gli elementi costitutivi fondamentali degli indici di Elasticsearch; determinano come i dati vengono partizionati, replicati e distribuiti tra i nodi del cluster. Un dimensionamento improprio degli shard può portare a gravi colli di bottiglia nelle prestazioni, aumento del carico operativo o, al contrario, risorse sottoutilizzate.

Questa guida al dimensionamento degli shard di Elasticsearch ti fornisce un modo pratico per scegliere un numero iniziale di shard e convalidarlo con metriche di carico di lavoro reali. L'obiettivo non è un numero perfetto; è una disposizione degli shard che rimanga recuperabile, ricercabile e conveniente man mano che i tuoi dati crescono.


Comprendere gli Shard di Elasticsearch

Prima di addentrarci nel dimensionamento, è essenziale capire cosa sia uno shard e come funzioni all'interno dell'architettura del cluster. Un indice in Elasticsearch è composto da uno o più shard primari. Ogni shard primario è un indice indipendente basato su Lucene che può ospitare dati.

Shard Primari vs. Replica

  1. Shard Primari: Contengono i dati effettivi. Sono responsabili delle operazioni di indicizzazione e ricerca. Quando definisci il numero di shard primari per un indice, decidi come i dati verranno distribuiti orizzontalmente nel cluster.
  2. Shard Replica: Sono copie degli shard primari. Forniscono ridondanza (tolleranza ai guasti) e aumentano la produttività delle ricerche consentendo di servire le query sia dalle copie primarie che da quelle replica.

L'Impatto del Numero di Shard

Il numero totale di shard (Primari + Replica) influisce direttamente sul sovraccarico del cluster. Ogni shard richiede memoria (spazio heap) e risorse CPU per tracciare il suo stato e i metadati. Troppi shard piccoli sovraccaricano il nodo master e aumentano il sovraccarico di gestione del cluster, portando a un degrado delle prestazioni, anche se i singoli shard sono piccoli.


Vincoli Chiave e Raccomandazioni sul Dimensionamento

Non esiste un singolo "numero magico" per la dimensione degli shard. La dimensione ottimale dipende fortemente dal volume dei dati, dal tasso di indicizzazione e dai pattern di query. Tuttavia, la documentazione di Elasticsearch e le best practice della comunità offrono diverse linee guida cruciali.

1. Soglia di Dimensione: La Dimensione Ottimale dello Shard

Il fattore più critico è la dimensione dei dati contenuti in un singolo shard.

  • Intervallo target comune: Molti cluster di produzione mirano a shard primari nell'intervallo da 10GB a 50GB.
  • Attenzione agli shard grandi: Shard più grandi possono funzionare per alcuni carichi di lavoro di sola aggiunta o a bassa intensità di query, ma aumentano il tempo di recupero e rendono la rilocazione più costosa. Testa prima di affidarti a shard vicini o superiori a 100GB.

Perché il limite? Se un nodo si guasta, Elasticsearch deve riallocare (rilocare o ri-replicare) gli shard memorizzati su quel nodo. Shard grandi aumentano significativamente il tempo necessario per il recupero, aumentando la finestra di resilienza ridotta. Inoltre, Lucene si comporta meglio quando gestisce segmenti di medie dimensioni.

2. Soglia del Numero di Documenti

Sebbene la dimensione sia fondamentale, anche il numero di documenti è rilevante, specialmente per documenti molto piccoli.

Non esiste un numero di documenti per shard universalmente sicuro. Uno shard con milioni di piccoli documenti di log può comportarsi bene, mentre uno shard con pochi documenti grandi e pesantemente analizzati può essere costoso. Monitora sia la dimensione di archiviazione dello shard che il comportamento del carico di lavoro invece di affidarti solo al numero di documenti.

3. Sovraccarico del Cluster e Numero di Shard

Limita il numero totale di shard per nodo per gestire efficacemente il consumo di risorse.

Le linee guida più vecchie spesso utilizzavano regole di shard per GB di heap. Trattale come segnali di avvertimento approssimativi, non come limiti rigidi. Elasticsearch moderno ha un sovraccarico di heap per shard inferiore rispetto alle versioni precedenti, ma troppi shard aumentano ancora il lavoro sullo stato del cluster, i descrittori di file, il sovraccarico dei segmenti e la complessità del recupero.


Metodologia Pratica di Dimensionamento degli Shard

Utilizza i seguenti passaggi per calcolare il numero appropriato di shard primari per un nuovo indice in base alla dimensione totale prevista dei dati.

Passaggio 1: Stima della Dimensione Totale dell'Indice

Determina la quantità totale di dati che prevedi che questo indice memorizzi durante la sua vita operativa (ad esempio, 6 mesi o 1 anno).

  • Esempio: Prevediamo di memorizzare 2 TB di dati per il nostro indice logs-2024.

Passaggio 2: Definisci la Dimensione Target dello Shard

Seleziona una dimensione target sicura in base alle linee guida (ad esempio, 40GB).

  • Esempio: Dimensione target dello shard = 40 GB.

Passaggio 3: Calcola gli Shard Primari Richiesti

Dividi la dimensione totale stimata per la dimensione target dello shard. Arrotonda sempre per eccesso al numero intero più vicino.

$$\text{Shard Primari} = \text{Arrotonda per eccesso} \left( \frac{\text{Dimensione Totale dell'Indice}}{\text{Dimensione Target dello Shard}} \right)$$

  • Esempio di Calcolo (2 TB = 2048 GB): $$\text{Shard Primari} = \text{Arrotonda per eccesso} \left( \frac{2048 \text{ GB}}{40 \text{ GB}} \right) = \text{Arrotonda per eccesso}(51.2) = 52$$

In questo scenario, dovresti creare l'indice con 52 shard primari.

Passaggio 4: Determina il Numero di Replica

Decidi il numero di replica in base alle tue esigenze di resilienza e volume di ricerca.

  • Resilienza: Imposta number_of_replicas ad almeno 1 (per alta disponibilità).

  • Prestazioni di Ricerca: Se il traffico di ricerca è elevato, utilizza 2 o più repliche.

  • Esempio: Scegliamo 1 replica per la tolleranza ai guasti standard.

Impostazioni Finali dell'Indice: 52 shard primari e 1 replica (totale 104 shard).

Passaggio 5: Distribuisci tra i Nodi

Assicurati che il tuo cluster abbia abbastanza nodi, heap, disco e capacità I/O per ospitare efficacemente questi shard. Con le repliche, Elasticsearch deve essere in grado di posizionare ogni replica su un nodo diverso dal suo primario.


Gestione del Ciclo di Vita dell'Indice e Ridimensionamento

Elasticsearch non ti consente di modificare direttamente index.number_of_shards su un indice esistente. Puoi utilizzare i flussi di lavoro split, shrink o reindex, ma ognuno ha requisiti e costi operativi.

Il Ruolo della Gestione del Ciclo di Vita dell'Indice (ILM)

Per i dati di serie temporali (log, metriche), la best practice è sfruttare Index Lifecycle Management (ILM) e la funzionalità Rollover.

Invece di creare un unico indice massiccio e difficile da gestire, crei un alias di rollover che punta a un modello.

  1. Fase Calda: I dati vengono scritti nell'indice attivo corrente. ILM monitora questo indice in base alla dimensione o all'età (ad esempio, esegue il rollover quando raggiunge 40GB).
  2. Rollover: Quando la soglia viene raggiunta, Elasticsearch crea automaticamente un nuovo indice basato sul modello (con il numero calcolato di shard primari) e commuta l'alias per puntare al nuovo indice. Il vecchio indice passa a una fase diversa (Calda/Fredda).

Questo approccio ti consente di mantenere shard di dimensioni costanti e con prestazioni ottimali durante tutto il ciclo di vita dei dati.

Quando è Necessario il Re-sharding (Avanzato)

Se un indice esistente cresce ben oltre la raccomandazione di 50GB a causa di pattern di dati imprevisti, devi utilizzare la Reindex API per correggere la distribuzione degli shard:

  1. Crea un nuovo indice con la configurazione degli shard corretta (ottimale).
  2. Utilizza la Reindex API per copiare tutti i dati dal vecchio indice mal dimensionato in quello nuovo.
  3. Aggiorna gli alias per puntare al nuovo indice.
  4. Elimina il vecchio indice.

Avvertenza sulla Reindicizzazione: La reindicizzazione è un'operazione intensiva in termini di risorse. Dovrebbe essere pianificata durante i periodi di basso traffico e richiede risorse cluster sufficienti per gestire il carico simultaneo di indicizzazione e copia.


Riepilogo delle Best Practice

Area Best Practice / Linea Guida
Dimensione del Singolo Shard Mantieni gli shard primari tra 10GB e 50GB (massimo 100GB).
Numero di Documenti Tieni d'occhio il numero di documenti come segnale secondario, ma convalida con le metriche di query e indicizzazione.
Sovraccarico del Cluster Mantieni il numero di shard sufficientemente basso in modo che la pressione sull'heap, gli aggiornamenti dello stato del cluster e il recupero rimangano sani.
Gestione dell'Indice Utilizza Index Lifecycle Management (ILM) e Rollover per i dati di serie temporali per garantire un dimensionamento ottimale continuo.
Ridimensionamento Non tentare di modificare il numero di shard primari su indici live; utilizza la Reindex API per migrare i dati a un nuovo indice correttamente dimensionato.

Inizia con una dimensione target dello shard, calcola gli shard primari dal volume di dati previsto, quindi convalida con test di carico e metriche di produzione. Per i dati di serie temporali, il rollover ILM è solitamente il modo più pulito per mantenere le dimensioni degli shard prevedibili senza interventi manuali costanti.