Présentation de Fregata et son bundle

Publié le 27/05/2022 à 15:23. Mise à jour le 27/05/2022 à 15:23.

Mon framework de migration de données et son bundle Symfony.

Présentation de Fregata et son bundle

Photo de Charles J. Sharp, CC BY-SA 3.0, via Wikimedia Commons.


Mon 3e bundle Symfony est disponible, il s'agit cette fois de migration de données avec mon framework Fregata. C'est surtout un « pet project » mais peut-être que certains y verront un intérêt dans leur travail.

Cet article présente les projets dans les grandes lignes. Pour le code, rendez-vous sur les repos GitHub:
AymDev/Fregata
AymDev/FregataBundle

Pour la petite histoire ...

Il y a plusieurs années, j'ai fait ma 1e migration de données: j'avais une base MariaDB sans contraintes de clé étrangère, des erreurs de normalisation flagrantes, et je devais envoyer tout ça dans une base PostgreSQL avec une structure plus propre.

Ça n'était pas une base gigantesque mais il y avait de nombreuses tables dont certaines avec plusieurs dizaines de milliers de lignes. Puisque la migration des données ne devait se faire qu'une fois, j'ai commencé à scripter ça, un peu à l'arrache: l'idée de Fregata était née...

Bon, en fait c'était plutôt une catastrophe:

Pour commencer, c'était un long script PHP sans dépendances et beaucoup de fichiers SQL. J'avais un export pour avoir la base source sur un serveur MariaDB, je migrais une première fois vers une autre base sur le même serveur avec la nouvelle structure. Les données de la base d'origine étaient très désordonnées, les requêtes SQL devenaient longues et complexes. Je faisais ensuite un export depuis la 2e base MariaDB en CSV que j'allais ensuite envoyer vers la base PostgreSQL.
Tout était exécuté localement, ça prenait 7h à chaque fois, ça a planté plusieurs fois. De toute évidence je m'y étais pris de la meilleure manière possible.

J'ai procédé au même type de migration complexe entre 2 SGBD plusieurs fois par la suite, en améliorant le procédé au fur et à mesure. J'ai fini par publier Fregata qui était initialement orienté base de données, puis est devenu « source agnostic » à partir de la v1.

Le framework

Objectifs

Le travail de Fregata est de migrer des données d'une source A vers une cible B. Et bien sûr vous pouvez multiplier les sources/cibles. Cependant si votre migration est aussi simple, il y a de grandes chances que d'autres outils soient plus adaptés.

Le framework ne tient pas compte de l'origine des données, on peut donc mélanger de multiples sources lors d'une migration. Par exemple:

  • envoyer les données d'une base MySQL vers une base PostgreSQL avec une structure différentes
  • récupérer des fichiers CSV pour envoyer le contenu vers différentes bases de données
  • récupérer des données d'une base relationnelle, y associer les données de fichiers, et faire des appels à une API REST
  • ...

Fonctionnement

Les 2 principaux composants d'une migration sont les tâches et les migrateurs.

Tâches

Les tâches sont optionnelles et permettent d'effectuer certains traitements qui ne font pas de migration de données: initialiser une base de données ou une structure de dossiers, supprimer des fichiers, ...

Elles peuvent s'exécuter avant ou après les migrateurs. Une migration est donc découpée en 3 étapes:

  • les « before tasks » pour effectuer de l'initialisation
  • les migrateurs
  • les « after tasks » qui peuvent effectuer des actions de nettoyage

Migrateurs

Un migrateur se découpe en 3 sous-composants qui permettent de séparer les sources de données:

  • un « puller » qui va récupérer des données en une seule fois ou par lots
  • un « pusher » qui va envoyer les données au bon endroit en effectuant d'éventuelles transformations
  • un « executor » qui fait le lien entre les 2: il appelle le puller et passe progressivement les données au pusher

On peut également indiquer des dépendances entre migrateurs, ce qui assure un ordre d'exécution cohérent. Si un migrateur A a besoin des données migrées par un migrateur B, ils seront alors exécutés dans l'ordre B-A.

Le bundle

Le framework en lui-même étant déjà basé sur des composants Symfony (Console, DependencyInjection, ...), la configuration des services liés aux migrations reste inchangée dans le bundle.

Il permet principalement l'exécution des migrations via Symfony Messenger. On peut ainsi exécuter plusieurs migrations et/ou migrateurs en parallèle.
Lorsqu'on lance l'exécution d'une migration (un « run »), chaque composant (migration, tâches et migrateurs) est enregistré en base de données afin de conserver l'état de la migration entre chaque message Messenger.

L'enregistrement en base de données permet alors de retrouver tout l'historique des runs. C'est une des raisons pour laquelle le bundle fournit une interface web dans laquelle on peut lancer un run, visualiser les migrations configurées, l'historique des exécutions mais aussi les détails d'un run:

Pour la suite

J'ai encore pas mal d'idées pour améliorer le fonctionnement de Fregata ou apporter de nouvelles fonctionnalités:

  • support de Symfony 6
  • support de Webpack Encore pour le front-end
  • déclenchement manuels de tâches ou de migrateurs
  • des intégrations avec d'autres packages
  • ...

N'hésitez pas à contribuer si le projet vous intéresse. Et si vous l'utilisez, je serais ravi d'avoir vos retours d'expériences ou tout simplement connaître l'utilisation que vous en faîtes.
Bye !

Commentaires: 0

Invasion robot en provenance de robohash.org