Est-il une façon plus intelligente de réindexer elasticsearch?
Je demande parce que notre recherche est dans un état de flux, comme nous les choses, mais à chaque fois que nous faisons un changement de l'indice (changement de générateur de jetons ou d'un filtre, ou le nombre de tessons/répliques), nous avons à souffler la totalité de l'index et ré-indexer tous nos Rails modèles de nouveau dans Elasticsearch ... cela signifie que nous devons facteur dans les temps d'arrêt pour ré-indexer tous nos dossiers.
Est-il une façon plus intelligente à faire ce que je ne suis pas au courant?
Vous devez vous connecter pour publier un commentaire.
Je pense que @karmi fait droit. Cependant laissez-moi vous expliquer un peu plus simple. J'avais besoin de temps en temps de mettre à niveau schéma de production avec de nouvelles propriétés ou les paramètres d'analyse.
J'ai récemment commencé à utiliser le scénario décrit ci-dessous afin de faire vivre, d'une charge constante, zéro temps d'arrêt de l'indice de migrations. Vous pouvez le faire à distance.
Voici les étapes:
Hypothèses:
real1
et aliasreal_write
,real_read
pointant vers elle,real_write
et lit uniquement à partir dereal_read
,_source
de propriété de document est disponible.1. Nouvel indice
Créer
real2
index avec une nouvelle cartographie et les paramètres de votre choix.2. L'écrivain alias commutateur
L'aide en suivant requête en bloc interrupteur d'écrire alias.
Cette opération atomique. À partir de ce moment
real2
est rempli avec de nouvelles données du client sur tous les nœuds. Les lecteurs utilisent encore vieuxreal1
viareal_read
. C'est la cohérence des résultats.3. Vieux de la migration des données
Les données doivent être migrés à partir de
real1
àreal2
, cependant de nouveaux documents dansreal2
ne peuvent pas être écrasés avec les anciennes entrées. La migration script doit utiliserbulk
API aveccreate
(elle n'est pasindex
ouupdate
). J'utilise simple script Ruby es-réindexer qui a de belles E. T. A. statut:Mise à JOUR en 2017 Vous pouvez envisager de nouvelles Réindexer API au lieu d'utiliser le script. Il a beaucoup de fonctionnalités intéressantes comme des conflits reporting etc.
4. Lecteur alias commutateur
Maintenant
real2
est à jour et les clients sont écrit pour elle, cependant, ils sont encore la lecture dereal1
. Nous allons mettre à jour reader alias:5. De sauvegarde et de supprimer l'ancien indice
Les écritures et lectures aller à
real2
. Vous pouvez sauvegarder et supprimerreal1
indice de ES cluster.Fait!
-r
option.Oui, il y a des façons plus intelligentes comment ré-indexer vos données sans interruption de service.
Première, jamais, jamais utiliser la "finale" du nom de l'index de votre vrai nom de l'index. Donc, si vous voulez le nom de votre index "articles", de ne pas utiliser ce nom comme une physique de l'indice, mais de créer un indice comme "articles-2012-12-12" ou "articles-Un", "articles-1", etc.
En Second lieu, créer un alias "alias" en pointant l'index. Votre demande sera alors utiliser cet alias, de sorte que vous n'aurez jamais besoin de modifier manuellement le nom de l'index, le redémarrage de l'application, etc.
Troisième, quand vous le voulez ou avez besoin de ré-indexer les données, ré-indexe dans différents index, disons-le, "articles-B" -- tous les outils d'un Pneu d'indexation de l'toolchaing vous soutenir ici.
Lorsque vous avez terminé, point de l'alias pour le nouvel indice. De cette façon, non seulement vous réduire le temps d'indisponibilité (il n'y a pas tout), vous avez également un coffre-fort instantané: si vous en quelque sorte gâcher l'indexation dans le nouvel index, vous pouvez simplement revenir à l'ancien, jusqu'à ce que vous résoudre le problème.
A écrit un billet de blog à propos de la façon dont j'ai géré de réindexation avec des pas de temps mort récemment. Prend un peu de temps pour comprendre toutes les petites choses qui doivent être en place pour le faire. Espérons que cette aide!
https://summera.github.io/infrastructure/2016/07/04/reindexing-elasticsearch.html
Pour résumer:
Étape 1: Préparer Les Nouveaux Index
Créer votre nouvel index avec votre nouvelle cartographie. Cela peut être sur la même instance de Elasticsearch ou sur une nouvelle instance.
Étape 2: Conserver À L'Index Jusqu'À Ce Jour
Pendant que vous êtes à la réindexation vous voulez garder vos deux nouveaux et les anciens indices jusqu'à ce jour. Pour une opération d'écriture, ce qui peut être fait par l'envoi de l'opération d'écriture d'un contexte à un travailleur à la fois les nouveaux et les anciens index.
Suppressions sont un peu plus compliqué car il y a une condition de concurrence entre la suppression et réindexation de l'enregistrement dans le nouvel indice. Ainsi, vous aurez envie de garder une trace des enregistrements qui doivent être supprimés au cours de votre réindexer et processus de ces lorsque vous avez terminé. Si vous n'êtes pas effectuer de nombreuses suppressions, une autre façon serait d'éliminer la possibilité de supprimer au cours de votre réindexer.
Étape 3: Effectuer Réindexation
Vous aurez envie d'utiliser un défilé de recherche pour la lecture des données et en vrac pour l'insertion. Car après l'Étape 2, vous serez l'écriture de nouvelles et mises à jour des documents pour le nouvel indice dans le fond, vous voulez vous assurer que vous ne mettez PAS à jour les documents existants dans le nouvel indice avec votre vrac requêtes à l'API.
Cela signifie que l'opération que vous voulez pour votre vrac demandes d'API est de créer, pas d'index. À partir de la la documentation: “créer échoue si un document avec le même index et le type existe déjà, alors que l'indice d'ajouter ou de remplacer un document en tant que de besoin”. Le point essentiel ici est que vous ne voulez pas que les anciennes données de la défilé de recherche instantané de remplacer les nouvelles données dans le nouvel indice.
Il y a une grande script sur github pour vous aider avec ce processus: es-réindexer.
Étape 4: Passer
Une fois que vous avez fini de réindexation, il est temps de passer votre recherche sur le nouvel indice. Vous aurez envie de tourner supprime le dos ou sur le processus de la file d'attente de supprimer des emplois pour les nouveaux index. Vous pouvez remarquer que la recherche dans le nouvel indice est un peu lent au début. C'est parce que Elasticsearch et la JVM besoin de temps pour se réchauffer.
Effectuer aucune modification de code dont vous avez besoin pour votre application commence à chercher le nouvel indice. Vous pouvez continuer à écrire à l'ancien indice au cas où vous avez un problème et besoin de restauration. Si vous pensez que c'est inutile, vous pouvez arrêter d'écrire pour elle.
Étape 5: Nettoyer
À ce stade, vous devriez être complètement à la transition vers le nouvel indice. Si tout va bien, effectuer tout le nécessaire de nettoyage tels que:
Peut-être créer un autre indice, et réindexer toutes les données sur celui-là, et ensuite faire le changement quand il est fait ré-indexation ?