web-dev-qa-db-fra.com

Eclats et répliques dans Elasticsearch

J'essaie de comprendre ce qu'est le fragment et la réplique dans Elasticsearch, mais je n'arrive pas à le comprendre. Si je télécharge Elasticsearch et exécute le script, à partir de ce que je sais, j'ai démarré un cluster avec un seul nœud. Maintenant, ce nœud (mon PC) a 5 fragments (?) Et des répliques (?). 

Qu'est-ce qu'ils ont, est-ce que j'ai 5 doublons de l'index? Si oui, pourquoi? Je pourrais avoir besoin d'explications.

243
LuckyLuke

Je vais essayer d'expliquer avec un exemple réel car la réponse et les réponses que vous avez ne semblent pas vous aider.

Lorsque vous téléchargez et démarrez elasticsearch, vous créez un nœud elasticsearch qui tente de rejoindre un cluster existant, le cas échéant, ou en crée un nouveau. Supposons que vous avez créé votre propre cluster avec un seul nœud, celui que vous venez de démarrer. Nous n'avons pas de données, nous devons donc créer un index.

Lorsque vous créez un index (un index est automatiquement créé lorsque vous indexez également le premier document), vous pouvez définir le nombre de fragments qui le composent. Si vous ne spécifiez pas de nombre, le nombre par défaut de fragments sera défini: 5 primaires. Qu'est-ce que ça veut dire? 

Cela signifie que elasticsearch créera 5 fragments primaires contenant vos données:

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

Chaque fois que vous indexez un document, elasticsearch décide quel fragment primaire est censé contenir ce document et l’indexe. Les fragments primaires ne sont pas une copie des données, ils le sont! Avoir plusieurs fragments aide à tirer parti du traitement parallèle sur une seule machine, mais le fait est que si nous démarrons une autre instance d'elasticsearch sur le même cluster, les fragments seront répartis de manière égale sur le cluster.

Le nœud 1 ne contiendra alors par exemple que trois fragments:

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

Puisque les deux fragments restants ont été déplacés vers le noeud nouvellement démarré:

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

Pourquoi cela arrive-t-il? Elasticsearch étant un moteur de recherche distribué, vous pouvez ainsi utiliser plusieurs nœuds/machines pour gérer de grandes quantités de données.

Chaque index elasticsearch est composé d'au moins un fragment primaire, car c'est là que les données sont stockées. Chaque fragment a un coût, cependant, si vous avez un seul nœud et aucune croissance prévisible, restez-en avec un seul fragment primaire.

Un autre type de fragment est une réplique. La valeur par défaut est 1, ce qui signifie que chaque partition principale sera copiée dans une autre partition contenant les mêmes données. Les répliques sont utilisées pour améliorer les performances de recherche et le basculement. Un fragment de réplique ne sera jamais alloué sur le même nœud où se trouve le principal associé (ce serait plutôt comme mettre une sauvegarde sur le même disque que les données d'origine).

Revenons à notre exemple, avec 1 réplica, nous aurons l’index complet sur chaque nœud, car 3 fragments de réplica seront alloués sur le premier nœud et ils contiendront exactement les mêmes données que les primaires sur le deuxième nœud:

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

Idem pour le deuxième noeud, qui contiendra une copie des fragments primaires sur le premier noeud:

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

Avec une configuration comme celle-ci, si un nœud tombe en panne, vous avez toujours l'index complet. Les fragments de réplique deviennent automatiquement des primaires et le cluster fonctionnera correctement malgré la défaillance du nœud, comme suit:

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

Puisque vous avez "number_of_replicas":1, les réplicas ne peuvent plus être attribués car ils ne sont jamais alloués sur le même nœud que leur nœud principal. C'est pourquoi vous aurez 5 fragments non attribués, les réplicas, et le statut du cluster sera YELLOW au lieu de GREEN. Aucune perte de données, mais cela pourrait être mieux, car certains fragments ne peuvent pas être attribués.

Dès que le nœud restant est sauvegardé, il rejoint le cluster à nouveau et les réplicas sont affectés à nouveau. Le fragment existant sur le second nœud peut être chargé, mais il doit être synchronisé avec les autres fragments, car les opérations d'écriture ont probablement eu lieu alors que le nœud était en panne. A la fin de cette opération, le statut du cluster deviendra GREEN.

J'espère que cela clarifie les choses pour vous.

788
javanna

Si vous n'aimez vraiment pas le voir en jaune. vous pouvez définir le nombre de répliques sur zéro:

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

Notez que vous devez le faire uniquement sur votre boîte de développement local.

19
jyu

Un index est divisé en fragments afin de les distribuer et de les mettre à l'échelle. 

Les répliques sont des copies des fragments et offrent une fiabilité en cas de perte d'un nœud. Il y a souvent une confusion dans ce nombre car le nombre de réplicas == 1 signifie que le cluster doit disposer de la copie principale et d'une copie répliquée du fragment disponible pour être à l'état vert. 

Pour que les répliques soient créées, vous devez avoir au moins 2 nœuds dans votre cluster. 

Vous pouvez trouver les définitions ici plus faciles à comprendre: http://www.elasticsearch.org/guide/reference/glossary/

Cordialement, Paul

18
ppearcy

Un index est divisé en fragments afin de les distribuer et de les mettre à l'échelle.

Les répliques sont des copies des fragments.

Un nœud est une instance en cours de recherche élastique qui appartient à un cluster.

Un cluster est constitué d'un ou plusieurs nœuds qui partagent le même nom de cluster. Chaque cluster a un seul nœud maître, choisi automatiquement par le cluster et pouvant être remplacé en cas de défaillance du nœud maître actuel.

4
Pruthvi Kumar

Eclat:

  1. Étant un serveur de recherche distribué, ElasticSearch utilise le concept appelé Shard pour distribuer les documents d'index sur tous les nœuds.
  2. Une index peut potentiellement stocker une grande quantité de données pouvant dépasser les limites matérielles d'un single node
  3. Par exemple, un index unique d’un milliard de documents occupant 1 To d’espace disque Risque de ne pas tenir sur le disque d’un seul nœud ou d’être trop lent pour traiter les demandes de recherche émanant d’un seul nœud.
  4. Pour résoudre ce problème, Elasticsearch permet de subdiviser votre index en plusieurs parties appelées shards.
  5. Lorsque vous créez un index, vous pouvez simplement définir le nombre de shards Que vous souhaitez.
  6. Documents sont stockés dans shards et des fragments sont attribués à nodes dans votre cluster
  7. Au fur et à mesure que votre cluster augmente ou diminue, Elasticsearch va automatiquement migrer des fragments entre nodes de façon à ce que cluster reste équilibré.
  8. Un fragment peut être un primary shard ou un replica shard.
  9. Chaque document de votre index appartient à un single primary shard, donc Le nombre de fragments primaires que vous avez détermine la quantité maximale de De données que votre index peut contenir.
  10. Un replica shard est simplement une copie d'un fragment primaire.

Réplique:

  1. Replica shard est la copie de primary Shard, afin d'éviter toute perte de données incase de défaillance matérielle.
  2. Elasticsearch vous permet de créer une ou plusieurs copies des fragments de votre index dans des fragments appelés répliques, ou replicas en abrégé.
  3. Un index peut également être répliqué à zéro (c'est-à-dire sans réplicas) ou plus Fois.
  4. Le number of shards et les répliques peuvent être définis par index au moment de la création de l'index.
  5. Une fois l’index créé, vous pouvez modifier le nombre de réplicas de façon dynamique à tout moment, mais vous cannot change the number of shards Après-coup.
  6. Par défaut, chaque index dans Elasticsearch se voit attribuer 5 fragments primaires et 1 replica, ce qui signifie que si vous avez au moins deux nœuds dans votre cluster, votre index comportera 5 fragments primaires et 5 fragments supplémentaires. ) pour un total de 10 fragments par indice
2
Vino

Dans ElasticSearch, au premier niveau, nous indexons les documents dans des index. Chaque index a un nombre de fragments qui distribuent les données en interne et à l'intérieur des fragments se trouvent les segments Lucene, qui constituent le stockage principal des données. Ainsi, si l’indice comporte 5 fragments, cela signifie que les données ont été réparties sur les fragments et que les données ne sont pas les mêmes.

Regardez la vidéo qui explique le cœur de l’ES https://www.youtube.com/watch?v=PpX7J-G2PEo

Article sur plusieurs index ou plusieurs fragments Recherche élastique, plusieurs index contre un seul index et types pour différents ensembles de données?

1
Prakash Ghanshani

Pas une réponse, mais une autre référence pour concepts de base à ElasticSearch, et je pense qu'ils sont assez clairs en complément de la réponse de @ javanna.

Eclats

Un index peut potentiellement stocker une grande quantité de données pouvant dépasser les limites matérielles d'un seul nœud. Par exemple, un index unique d'un milliard de documents occupant 1 To d'espace disque peut ne pas tenir sur le disque d'un seul nœud ou peut être trop lent pour traiter les demandes de recherche d'un seul nœud.

Pour résoudre ce problème, Elasticsearch offre la possibilité de subdiviser votre index en plusieurs fragments appelés fragments. Lorsque vous créez un index, vous pouvez simplement définir le nombre de fragments que vous souhaitez. Chaque fragment est en soi un "index" totalement fonctionnel et indépendant pouvant être hébergé sur n'importe quel nœud du cluster.

L'éclatement est important pour deux raisons principales:

  • Il vous permet de diviser/mettre à l'échelle horizontalement le volume de votre contenu.
  • Il vous permet de distribuer et de paralléliser des opérations sur des fragments (potentiellement sur plusieurs nœuds), augmentant ainsi les performances/le débit .

Répliques

Dans un environnement réseau/cloud où des défaillances peuvent être attendues à tout moment, il est très utile et hautement recommandé de disposer d'un mécanisme de basculement en cas de panne ou de rupture d'un nœud/nœud pour une raison quelconque. À cette fin, Elasticsearch vous permet de créer une ou plusieurs copies des fragments de votre index dans des fragments appelés répliques, ou répliques.

La réplication est importante pour deux raisons principales:

  • Il fournit une haute disponibilité en cas de défaillance d'un fragment/nœud. Pour cette raison, il est important de noter qu'un fragment de réplique n'est jamais alloué sur le même nœud que le fragment d'origine/primaire à partir duquel il a été copié.
  • Il vous permet de réduire votre recherche volume/débit, car les recherches peuvent être exécutées sur toutes les répliques en parallèle.
0
Hearen

Elasticsearch est superbement évolutif, tout le crédit en revient à son architecture distribuée. Cela est rendu possible grâce à Sharding. Avant d’aller plus loin, considérons un cas d’utilisation simple et très courant. Supposons que vous ayez un index qui contient beaucoup de documents et, dans un souci de simplicité, considérons que la taille de cet index est 1 TB (c'est-à-dire la somme des tailles de chaque document dans cet indice est de 1 To). En outre, supposons que vous disposiez de deux nœuds disposant chacun de 512 Go d'espace libre pour stocker des données. Comme vous pouvez le constater, l'intégralité de notre index ne peut être stockée dans aucun des deux nœuds disponibles. Nous devons donc répartir notre index entre ces nœuds.

Dans des cas comme celui-ci, où la taille d'un index dépasse les limites matérielles d'un seul nœud, Sharding vient à la rescousse. Sharding résout ce problème en divisant les indices en morceaux plus petits, ces morceaux sont nommés Shards.

0
Ayush Jain

Je vais expliquer cela en utilisant un scénario Word réel. Imaginez que vous dirigez un site de commerce électronique. À mesure que vous devenez plus populaire, de plus en plus de vendeurs et de produits s'ajoutent à votre site Web. Vous vous rendrez compte que le nombre de produits que vous pourriez avoir besoin d'indexer a augmenté et qu'il est trop important pour tenir sur un disque dur d'un nœud. Même si cela convient au disque dur, il est extrêmement lent d'effectuer une recherche linéaire dans tous les documents d'une machine. un index sur un noeud ne tire pas parti de la configuration de cluster distribuée sur laquelle travaille elasticsearch.

Elasticsearch divise donc les documents de l'index en plusieurs nœuds du cluster. Chaque fragment du document est appelé un fragment. Chaque nœud portant un fragment d'un document n'aura qu'un sous-ensemble du document. Supposons que vous avez 100 produits et 5 fragments, chaque fragment aura 20 produits. Ce partage de données est ce qui rend possible la recherche à faible latence dans elasticsearch. la recherche est effectuée en parallèle sur plusieurs nœuds. Les résultats sont agrégés et renvoyés. Cependant, les fragments ne fournissent pas de tolérance aux pannes. Cela signifie que si l'un des nœuds contenant le fragment est hors service, la santé du cluster devient jaune. Cela signifie que certaines des données ne sont pas disponibles.

Pour augmenter la tolérance aux pannes, des répliques entrent en scène. Par deault, la recherche élastique crée une réplique unique de chaque fragment. Ces répliques sont toujours créées sur un autre nœud où le fragment principal ne réside pas. Ainsi, pour rendre le système tolérant aux pannes du système, vous devrez peut-être augmenter le nombre de nœuds de votre cluster. Cela dépend également du nombre de fragments de votre index. La formule générale permettant de calculer le nombre de nœuds requis en fonction des répliques et des fragments est "nombre de nœuds = nombre de fragments * (nombre de répliques + 1)". La pratique standard consiste à avoir au moins un réplica pour la tolérance aux pannes.

La configuration du nombre de fragments est une opération statique, ce qui signifie que vous devez la spécifier lorsque vous créez un index. Toute modification ultérieure nécessiterait une réindexation complète des données et prendrait du temps. Toutefois, la configuration du nombre de réplicas est une opération dynamique et peut également être effectuée à tout moment après la création de l'index.

vous pouvez configurer le nombre de fragments et de répliques de votre index à l'aide de la commande ci-dessous.

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

0