Connectes-toi pour publier un commentaire.
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.
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.
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
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 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:
Les 2 principaux composants d'une migration sont les tâches et les migrateurs.
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:
Un migrateur se découpe en 3 sous-composants qui permettent de séparer les sources de données:
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 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:
J'ai encore pas mal d'idées pour améliorer le fonctionnement de Fregata ou apporter de nouvelles fonctionnalités:
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 !
Connectes-toi pour publier un commentaire.