Migration de base de données Liquibase ou Flyway alternative pour Elasticsearch

je suis assez nouveau à l'ES. J'ai essayé de chercher un outil de migration db pendant longtemps et je n'ai pas pu en trouver un. Je me demande si quelqu'un pourrait m'aider à m'orienter dans la bonne direction.

J'utiliserais Elasticsearch comme datastore primaire dans mon projet. Je voudrais mettre en version tous les changements de mappage et de configuration / importation de données / mises à niveau de scripts que j'exécute que je développe de nouveaux modules dans mon projet.

dans le passé j'ai utilisé des outils de versioning de base de données comme La voie de migration ou Liquibase.

y a-t-il des cadres / scripts ou méthodes que je pourrais utiliser avec ES pour réaliser quelque chose de similaire ?

est-ce que quelqu'un a de l'expérience pour faire cela à la main en utilisant des scripts et en exécutant des scripts de migration au moins des scripts de mise à niveau?

Merci d'avance!

19
demandé sur Jan Żankowski 2014-06-01 11:33:52

1 réponses

de ce point de vue/besoin, les Se ont d'énormes limites:

  • malgré la cartographie dynamique, ES est schemaless mais à un schéma intensif. Les mappages ne peuvent pas être modifiés dans le cas où ce changement entre en conflit avec des documents existants (en pratique, si l'un des documents n'a pas de champ-null que le nouveau mappage affecte, il en résultera une exception)
  • les documents en ES sont immuables: une fois que vous en avez indexé un, vous pouvez le récupérer/le supprimer uniquement. Le le sucre syntaxique autour de ceci est une mise à jour partielle, qui rend le thread-safe delete + index (avec le même id) du côté de ES

Qu'est-ce que cela signifie dans le contexte de votre question? Vous, en gros, ne pouvez pas avoir les outils de migration classiques pour ES. Et voici ce qui peut faciliter votre travail avec ES:

  • utiliser une cartographie stricte ("dynamic": "strict" et/ou index.mapper.dynamic: false, jetez un oeil à cartographie des docs). Cela protégera vos index/types de

    • > accidentellement mappé dynamiquement avec le mauvais type
    • obtenir d'erreur explicite dans le cas où vous manquez quelque erreur dans les données de mappage de relation
  • vous pouvez obtenir la cartographie ES réelle et la comparer avec vos modèles de données. Si votre PL a assez de niveau de bibliothèque pour ES, cela devrait être assez facile

  • vous pouvez tirer parti de index alias pour les migrations


Donc, un peu de peu d'expérience. Pour moi, actuellement, le débit raisonnable est ceci:

  • toutes les structures de données décrites comme des modèles en code. Ces modèles fournissent en fait une abstraction ORM aussi.
  • Index / mapping creation call est la méthode simple de model.
  • chaque index a un alias (i.e. news) qui pointe à l'indice réel (c'est à dire news_index_{revision}_{date_created}).

chaque fois que le code est déployé, vous

  1. essayez de mettre la mapping model(type). Si c'est fait sans erreur, cela signifie que vous avez soit

    • mettre le même mappage
    • mettre la cartographie qui est pur sur-ensemble de l'ancien (seulement de nouveaux champs ont été fournis, vieux reste intact)
    • pas de documents ont des valeurs dans les champs concernés par la nouvelle cartographie

    tout cela signifie en fait que vous êtes bon pour aller avec mappping / données que vous avez, il suffit de travailler avec des données comme toujours

  2. si ES fournit une exception à propos de la nouvelle cartographie, vous
    • créer un nouvel indice/type avec une nouvelle cartographie (nommé comme name_{revision}_{date}
    • redirigez votre alias vers le nouvel index
    • activez le code de migration qui rend bulk demandes de réindexation rapide Lors de cette réindexation, vous pouvez indexer les nouveaux documents en toute sécurité, normalement par le biais de l'alias. L'inconvénient est que les données historiques sont partiellement disponibles lors du réexamen.

il s'agit d'une solution testée en production. Mises en garde autour d'une telle approche:

  • vous ne pouvez pas faire cela, si vos demandes de lecture nécessitent des données historiques cohérentes
  • vous devez reindex whole index. Si vous avez 1 type par indice (solution viable) alors son amende. Mais parfois vous avez besoin d'index multi-types
  • réseau de données de l'aller-retour. Peut-être parfois de la douleur

Pour résumer:

  • essayez d'avoir une bonne abstraction dans vos modèles, c'est toujours aide
  • essayez de garder les données historiques/champs périmés. Il suffit de construire votre code avec cette idée en tête, c'est plus facile que les sons au début
  • je recommande fortement d'éviter de s'appuyer sur des outils de migration qui tirent parti des outils expérimentaux ES. Ceux - ci peuvent être changés à tout moment, comme river-* outils.
24
répondu Slam 2017-04-11 23:49:06