J'étais sous l'hypothèse que chaque fragment dans Elasticsearch est un index. Mais j'ai lu quelque part que chaque segment est un index Lucene.
Qu'est-ce qu'un segment exactement? Comment cela affecte-t-il les performances de recherche? J'ai des indices qui atteignent environ 450 Go tous les jours (j'en crée un tous les jours) avec des paramètres Elasticsearch par défaut.
Lorsque j'exécute curl -XPOST "http://localhost:9200/logstash-2013.03.0$i_optimize?max_num_segments=1"
, Je reçois num_committed_segments=11
et num_search_segments=11
.
Les valeurs ci-dessus ne doivent-elles pas être 1? C'est peut-être à cause de index.merge.policy.segments_per_tier
valeur? Quel est ce niveau de toute façon?
Le mot "index" est un peu abusé dans Elasticsearch - s'applique à trop de choses.
Expliquer:
Un "index" dans Elasticsearch est un peu comme une base de données dans une base de données relationnelle. C'est là que vous stockez/indexez vos données. Mais en fait, c'est exactement ce que voit votre application. En interne, un index est un espace de noms logique qui pointe vers un ou plusieurs fragments.
En outre, "indexer" signifie "mettre" vos données dans Elasticsearch. Vos données sont à la fois stockées (pour la récupération) et "indexées" pour la recherche.
Un "index inversé" est la structure de données que Lucene utilise pour rendre les données consultables. Il traite les données, extrait des termes ou des jetons uniques, puis enregistre les documents contenant ces jetons. Voir http://en.wikipedia.org/wiki/Inverted_index pour en savoir plus.
Un "éclat" est une instance de Lucene. Il s'agit d'un moteur de recherche entièrement fonctionnel à part entière. Un "index" pourrait consister en un seul fragment, mais se compose généralement de plusieurs fragments, pour permettre à l'index de croître et d'être divisé sur plusieurs machines.
Un "fragment principal" est le principal foyer d'un document. Un "fragment de réplique" est une copie du fragment principal qui fournit (1) le basculement au cas où le primaire meurt et (2) un débit de lecture accru
Chaque fragment contient plusieurs "segments", où un segment est un index inversé. Une recherche dans un fragment recherchera tour à tour chaque segment, puis combinera leurs résultats dans les résultats finaux pour ce fragment.
Pendant que vous indexez des documents, Elasticsearch les collecte en mémoire (et dans le journal des transactions, par sécurité), puis toutes les secondes environ, écrit un nouveau petit segment sur le disque et "rafraîchit" la recherche.
Cela rend les données du nouveau segment visibles pour la recherche (c'est-à-dire qu'elles sont "consultables"), mais le segment n'a pas été synchronisé sur le disque, il risque donc de perdre des données.
De temps en temps, Elasticsearch "videra", ce qui signifie fsync'ing les segments, (ils sont maintenant "engagés") et effacera le journal des transactions, qui n'est plus nécessaire parce que nous savons que les nouvelles données ont été écrites sur le disque .
Plus il y a de segments, plus chaque recherche prend de temps. Elasticsearch fusionnera donc un certain nombre de segments de taille similaire ("niveau") en un seul segment plus grand, via un processus de fusion en arrière-plan. Une fois le nouveau segment plus grand écrit, les anciens segments sont supprimés. Ce processus se répète sur les segments plus gros lorsqu'il y en a trop de la même taille.
Les segments sont immuables. Lorsqu'un document est mis à jour, il marque simplement l'ancien document comme supprimé et indexe un nouveau document. Le processus de fusion supprime également ces anciens documents supprimés.