Frammenti e repliche in Elasticsearch


303

Sto cercando di capire quale frammento e replica sono presenti in Elasticsearch, ma non sono riuscito a capirlo. Se scarico Elasticsearch ed eseguo lo script, da quello che so ho avviato un cluster con un singolo nodo. Ora questo nodo (il mio PC) ha 5 frammenti (?) E alcune repliche (?).

Cosa sono, ho 5 duplicati dell'indice? Se sì, perché? Potrei aver bisogno di qualche spiegazione.



Ma la domanda rimane senza risposta.
LuckyLuke,

Ho pensato che la risposta che hai ricevuto e la risposta collegata sopra dovrebbe chiarire le cose. Cosa non è chiaro allora?
javanna,

Non capisco cosa sia un frammento e repliche. Non capisco perché ci siano molti frammenti e repliche su un nodo.
LuckyLuke

1
Ogni indice può essere suddiviso in frammenti per poter distribuire i dati. Il frammento è la parte atomica di un indice, che può essere distribuita sul cluster se si aggiungono più nodi.
javanna,

Risposte:


966

Proverò a spiegare con un vero esempio poiché la risposta e le risposte che hai ricevuto non sembrano aiutarti.

Quando scarichi elasticsearch e lo avvii, crei un nodo elasticsearch che tenta di unirsi a un cluster esistente se disponibile o ne crea uno nuovo. Supponiamo che tu abbia creato il tuo nuovo cluster con un singolo nodo, quello che hai appena avviato. Non abbiamo dati, quindi abbiamo bisogno di creare un indice.

Quando si crea un indice (un indice viene creato automaticamente anche quando si indicizza anche il primo documento) è possibile definire quanti frammenti sarà composto. Se non specifichi un numero, avrà il numero predefinito di frammenti: 5 primarie. Cosa significa?

Significa che elasticsearch creerà 5 frammenti primari che conterranno i tuoi dati:

 ____    ____    ____    ____    ____
| 1  |  | 2  |  | 3  |  | 4  |  | 5  |
|____|  |____|  |____|  |____|  |____|

Ogni volta che indicizzi un documento, elasticsearch deciderà quale frammento primario dovrebbe contenere quel documento e indicizzerà lì. I frammenti primari non sono una copia dei dati, sono i dati! Avere più frammenti aiuta a sfruttare l'elaborazione parallela su una singola macchina, ma il punto è che se iniziamo un'altra istanza di elasticsearch sullo stesso cluster, i frammenti verranno distribuiti in modo uniforme sul cluster.

Il nodo 1 conterrà quindi ad esempio solo tre frammenti:

 ____    ____    ____ 
| 1  |  | 2  |  | 3  |
|____|  |____|  |____|

Poiché i restanti due frammenti sono stati spostati nel nodo appena avviato:

 ____    ____
| 4  |  | 5  |
|____|  |____|

Perché succede? Perché elasticsearch è un motore di ricerca distribuito e in questo modo è possibile utilizzare più nodi / macchine per gestire grandi quantità di dati.

Ogni indice elasticsearch è composto da almeno un frammento primario poiché è lì che vengono archiviati i dati. Ogni frammento ha un costo, tuttavia, quindi se hai un singolo nodo e nessuna crescita prevedibile, resta solo un singolo frammento primario.

Un altro tipo di frammento è una replica. Il valore predefinito è 1, il che significa che ogni frammento primario verrà copiato in un altro frammento che conterrà gli stessi dati. Le repliche vengono utilizzate per aumentare le prestazioni di ricerca e per il failover. Un frammento di replica non verrà mai allocato sullo stesso nodo in cui si trova il relativo primario (sarebbe praticamente come mettere un backup sullo stesso disco dei dati originali).

Nel nostro esempio, con 1 replica avremo l'intero indice su ciascun nodo, poiché 2 frammenti di replica saranno allocati sul primo nodo e conterranno esattamente gli stessi dati dei frammenti primari sul secondo nodo:

 ____    ____    ____    ____    ____
| 1  |  | 2  |  | 3  |  | 4R |  | 5R |
|____|  |____|  |____|  |____|  |____|

Lo stesso vale per il secondo nodo, che conterrà una copia dei frammenti primari sul primo nodo:

 ____    ____    ____    ____    ____
| 1R |  | 2R |  | 3R |  | 4  |  | 5  |
|____|  |____|  |____|  |____|  |____|

Con una configurazione come questa, se un nodo si arresta, hai ancora l'intero indice. I frammenti di replica diventeranno automaticamente primari e il cluster funzionerà correttamente nonostante l'errore del nodo, come segue:

 ____    ____    ____    ____    ____
| 1  |  | 2  |  | 3  |  | 4  |  | 5  |
|____|  |____|  |____|  |____|  |____|

Dato che hai "number_of_replicas":1, le repliche non possono più essere assegnate in quanto non sono mai allocate sullo stesso nodo in cui si trova il loro primario. Ecco perché avrai 5 frammenti non assegnati, le repliche e lo stato del cluster saranno YELLOWinvece di GREEN. Nessuna perdita di dati, ma potrebbe essere migliore in quanto alcuni frammenti non possono essere assegnati.

Non appena viene eseguito il backup del nodo rimasto, si unirà nuovamente al cluster e le repliche verranno assegnate di nuovo. Il frammento esistente sul secondo nodo può essere caricato ma devono essere sincronizzati con gli altri frammenti, poiché molto probabilmente le operazioni di scrittura sono avvenute mentre il nodo era inattivo. Al termine di questa operazione, lo stato del cluster diventerà GREEN.

Spero che questo ti chiarisca le cose.


57
Splendida spiegazione, grazie per aver dedicato del tempo a metterlo insieme! :)
LuckyLuke

6
Questa è di gran lunga la migliore spiegazione del concetto di shard / replica. Grazie mille :)
Frank Förster

1
@javanna Grande spiegazione, puoi parlare un po 'di più cluster e di come funzionano?
Raffian,

3
Posso suggerire di spiegare ulteriormente cosa accadrebbe quando il nodo che è andato giù ritorna di nuovo?
c0dem4gnetic,

1
Insegni? Perché dovresti assolutamente. Sei forte. Ma come ha chiesto @Animesh Pandey, sono anche curioso di sapere cosa succede con due repliche o 1 replica con 3 nodi.
frostymarvelous,

24

Un indice viene suddiviso in frammenti per distribuirli e ridimensionarli.

Le repliche sono copie dei frammenti e forniscono affidabilità in caso di perdita di un nodo. C'è spesso confusione in questo numero perché il conteggio delle repliche == 1 indica che il cluster deve avere la copia principale e replicata del frammento disponibile per essere nello stato verde.

Per poter creare repliche, è necessario disporre di almeno 2 nodi nel cluster.

Puoi trovare le definizioni qui più facili da capire: http://www.elasticsearch.org/guide/reference/glossary/

I migliori saluti, Paul


Questo è ciò che dice ogni documento: l'indice è suddiviso in frammenti, ma cosa contiene effettivamente l'indice?
Alex Pryiomka,

@AlexPryiomka, Index contiene dati
Gaurav,

Quindi è fondamentalmente la stessa della replica delle partizioni nel mondo di kafka?
beatrice,

19

Se davvero non ti piace vederlo giallo. puoi impostare il numero di repliche su zero:

curl -XPUT 'localhost:9200/_settings' -d '
{
    "index" : {
        "number_of_replicas" : 0
    }
}
'

Nota che dovresti farlo solo sulla tua casella di sviluppo locale.


10

Coccio:

  1. Essendo un server di ricerca distribuito, ElasticSearchutilizza il concetto chiamato Shardper distribuire documenti indice su tutti i nodi.
  2. Un indexpuò potenzialmente memorizzare una grande quantità di dati che possono superare i limiti hardware di unsingle node
  3. Ad esempio, un singolo indice di un miliardo di documenti che occupa 1 TB di spazio su disco potrebbe non adattarsi al disco di un singolo nodo o potrebbe essere troppo lento per servire le richieste di ricerca da un solo nodo.
  4. Per risolvere questo problema, Elasticsearchoffre la possibilità di suddividere l'indice in più parti chiamate shards.
  5. Quando si crea un indice, è possibile semplicemente definire il numero shards desiderato.
  6. Documentssono memorizzati shardse i frammenti sono allocati nodesnel tuocluster
  7. Man mano che clustercresce o si restringe, Elasticsearchmigrerà automaticamente tra i frammenti in nodesmodo che clusterrimanga bilanciato.
  8. Un frammento può essere a primary shardo a replica shard.
  9. Ogni documento nel tuo indice appartiene a single primary shard, quindi il numero di frammenti primari che hai determina la quantità massima di dati che il tuo indice può contenere
  10. A replica shardè solo una copia di un frammento primario.

Replica:

  1. Replica shardè la copia di primary Shard, per prevenire la perdita di dati in caso di guasto hardware.
  2. Elasticsearchti permette di fare una o più copie dei frammenti del tuo indice in quelli che vengono chiamati frammenti di replica, o replicasin breve.
  3. È indexinoltre possibile replicare zero (senza significato repliche) o più volte.
  4. Le number of shardsrepliche e possono essere definite per indice al momento della creazione dell'indice.
  5. Dopo aver creato l'indice, è possibile modificare il numero di repliche in modo dinamico in qualsiasi momento, ma cannot change the number of shards dopo il fatto.
  6. Per impostazione predefinita, a ogni indice in Elasticsearchsono assegnati 5 1 replicaframmenti primari e ciò significa che se si hanno almeno due nodi nel cluster, l'indice avrà 5 frammenti primari e altri 5 frammenti di replica (1 replica completa) per un totale di 10 frammenti per indice.

6

Un indice viene suddiviso in frammenti per distribuirli e ridimensionarli.

Le repliche sono copie dei frammenti.

Un nodo è un'istanza corrente di ricerca elastica che appartiene a un cluster.

Un cluster è costituito da uno o più nodi che condividono lo stesso nome cluster. Ogni cluster ha un singolo nodo principale che viene scelto automaticamente dal cluster e che può essere sostituito in caso di errore del nodo principale corrente.


Ho tre AWS ec2istanze, ognuna delle quali ha installato elasticsearch. Significa che abbiamo tre nodi qui? Se tutti questi nodi hanno lo stesso cluster.name: testset di proprietà, creerà un nome cluster testche avrebbe tre nodi?
TheCoder

5

Spiegherò questo usando scenari di parole reali. Immagina di gestire un sito di e-commerce. Man mano che diventi più popolare, più venditori e prodotti si aggiungono al tuo sito web. Ti renderai conto che il numero di prodotti che potresti dover indicizzare è cresciuto ed è troppo grande per adattarsi a un disco rigido di un nodo. Anche se si adatta al disco rigido, eseguire una ricerca lineare attraverso tutti i documenti in una macchina è estremamente lento. un indice su un nodo non sfrutterà la configurazione del cluster distribuito su cui funziona elasticsearch.

Quindi elasticsearch suddivide i documenti nell'indice su più nodi nel cluster. Ogni divisione del documento è chiamata frammento. Ogni nodo che trasporta un frammento di un documento avrà solo un sottoinsieme del documento. supponiamo di avere 100 prodotti e 5 frammenti, ogni frammento avrà 20 prodotti. Questo frammento di dati è ciò che rende possibile la ricerca a bassa latenza in elasticsearch. la ricerca viene condotta in parallelo su più nodi. I risultati vengono aggregati e restituiti. Tuttavia, i frammenti non forniscono tolleranza agli errori. Significa che se un nodo contenente il frammento è inattivo, lo stato del cluster diventa giallo. Significa che alcuni dei dati non sono disponibili.

Per aumentare la tolleranza agli errori, le repliche entrano in figura. Con la ricerca elastica e silenziosa crea una singola replica di ogni frammento. Queste repliche vengono sempre create su un altro nodo in cui il frammento primario non risiede. Quindi, per rendere tollerante l'errore del sistema, potrebbe essere necessario aumentare il numero di nodi nel cluster e dipende anche dal numero di frammenti dell'indice. La formula generale per calcolare il numero di nodi richiesti in base a repliche e frammenti è "numero di nodi = numero di frammenti * (numero di repliche + 1)". La pratica standard prevede almeno una replica per la tolleranza agli errori.

L'impostazione del numero di frammenti è un'operazione statica, il che significa che è necessario specificarlo quando si crea un indice. Qualsiasi modifica successiva a tale woulf richiede la reindicizzazione completa dei dati e richiederà tempo. Tuttavia, l'impostazione del numero di repliche è un'operazione dinamica e può essere eseguita in qualsiasi momento anche dopo la creazione dell'indice.

puoi impostare il numero di frammenti e repliche per il tuo indice con il comando seguente.

curl -XPUT 'localhost:9200/sampleindex?pretty' -H 'Content-Type: application/json' -d '
{
  "settings":{
    "number_of_shards":2,
    "number_of_replicas":1
  }
}'

3

Non una risposta, ma un altro riferimento per i concetti chiave di ElasticSearch, e penso che siano abbastanza chiari come complimento per la risposta di @ javanna.

Frammenti

Un indice può potenzialmente archiviare una grande quantità di dati che possono superare i limiti hardware di un singolo nodo. Ad esempio, un singolo indice di un miliardo di documenti che occupa 1 TB di spazio su disco potrebbe non adattarsi al disco di un singolo nodo o potrebbe essere troppo lento per servire le richieste di ricerca da un solo nodo.

Per risolvere questo problema, Elasticsearch offre la possibilità di suddividere il proprio indice in più pezzi chiamati frammenti. Quando crei un indice, puoi semplicemente definire il numero di frammenti che desideri. Ogni frammento è di per sé un "indice" completamente funzionale e indipendente che può essere ospitato su qualsiasi nodo del cluster.

Il coccio è importante per due motivi principali:

  • Ti consente di dividere / ridimensionare orizzontalmente il tuo volume di contenuti.
  • Consente di distribuire e parallelizzare le operazioni tra frammenti (potenzialmente su più nodi) aumentando così le prestazioni / la velocità effettiva .

repliche

In un ambiente di rete / cloud in cui è possibile prevedere errori in qualsiasi momento, è molto utile e altamente raccomandato disporre di un meccanismo di failover nel caso in cui un frammento / nodo in qualche modo si disconnetta o scompaia per qualsiasi motivo. A tal fine, Elasticsearch ti consente di effettuare una o più copie dei frammenti del tuo indice in quelli che vengono chiamati frammenti di replica, o repliche in breve.

La replica è importante per due motivi principali:

  • Fornisce elevata disponibilità nel caso in cui un frammento / nodo fallisca. Per questo motivo, è importante notare che un frammento di replica non viene mai allocato sullo stesso nodo del frammento originale / primario da cui è stato copiato.
  • Consente di ridimensionare il volume di ricerca / throughput poiché le ricerche possono essere eseguite su tutte le repliche in parallelo.

1

In ElasticSearch, ai massimi livelli indicizziamo i documenti in indici. Ogni indice ha un numero di frammenti che distribuisce internamente i dati e all'interno di frammenti esistono i segmenti Lucene che è la memoria principale dei dati. Quindi, se l'indice ha 5 frammenti significa che i dati sono stati distribuiti tra i frammenti e non esistono gli stessi dati nei frammenti.

Fai attenzione al video che spiega il nucleo di ES https://www.youtube.com/watch?v=PpX7J-G2PEo

Articolo su più indici o più frammenti Ricerca elastica, più indici contro un indice e tipi per diversi set di dati?


1

Elasticsearch è straordinariamente scalabile con tutto il merito della sua architettura distribuita. È reso possibile grazie allo Sharding. Ora, prima di approfondire ulteriormente, consideriamo un caso d'uso semplice e molto comune. Supponiamo che tu abbia un indice che contiene un sacco di documenti e, per semplicità, considera che la dimensione di quell'indice è 1 TB (cioè, la somma delle dimensioni di ogni documento in quell'indice è 1 TB ). Inoltre, supponi di avere due nodi ciascuno con 512 GB di spazio disponibile per l'archiviazione dei dati. Come si può vedere chiaramente, il nostro intero indice non può essere archiviato in nessuno dei due nodi disponibili e quindi dobbiamo distribuire il nostro indice tra questi nodi.

In casi come questo in cui la dimensione di un indice supera i limiti hardware di un singolo nodo, Sharding viene in soccorso. La frammentazione risolve questo problema dividendo gli indici in pezzi più piccoli e questi pezzi vengono denominati frammenti.


0

In parole povere, shardnon è altro che una parte di un indice memorizzato sul disco in una cartella separata:

Frammenti di Elasticsearch

Questa schermata mostra l'intera directory di Elasticsearch.

Come puoi vedere, tutti i dati vanno nella datadirectory.

Ispezionando l'indice C-mAfLltQzuas72iMiIXNwvediamo che ha cinque frammenti (cartelle 0da 4).

D'altra parte, l' JH_A8PgCRj-GK0GeQ0limwindice ha solo un frammento ( 0cartella).

Frammenti di Elasticsearch

Visualizza priil numero totale di frammenti.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.