Makina Blog

Le blog Makina-corpus

L’ano­ny­mi­sa­tion sous stéroïdes avec le DBTools­Bundle


Le DbTools­Bundle permet d’ano­ny­mi­ser des tables d’un million de lignes en seule­ment quelques secondes. Cet article vous présente la métho­do­lo­gie mise en place pour arri­ver à ce résul­tat.

Image
DbToolsBundle

 

Le DbTools­Bundle est une librai­rie PHP qui permet notam­ment de mettre en place un proces­sus d’ano­ny­mi­sa­tion de données. S’agis­sant à l’heure actuelle d’un bundle Symfony, elle est par consé­quent assez couplée au frame­work. Nous envi­sa­geons cepen­dant qu’elle puisse être utili­sée indé­pen­dam­ment à plus ou moins court terme.

 

Lorsque nous avons déve­loppé cet outil, l’un de nos objec­tifs était de mettre à dispo­si­tion de l’éco­sys­tème Symfony une solu­tion simple d’ano­ny­mi­sa­tion pour favo­ri­ser les bonnes pratiques liées au RGPD. Pour que l’ou­til soit adopté, nous avons tenté de répondre aux trois problé­­ma­­tiques suivantes :

  1. Confi­­gu­­rer faci­­le­­ment une anony­­mi­­sa­­tion de données
  2. Mettre en place un work­flow simple pour récu­pé­rer des données de produc­tion anony­mi­sées de manière sécu­ri­sée
  3. Rendre cette anony­mi­sa­tion rapide

Les deux premières problé­ma­tiques ont déjà été évoquées sur ce blog dans l’ar­ticle Décou­vrez le DbTools­Bundle. Vous trou­ve­rez égale­ment des infor­ma­tions plus complètes direc­te­ment dans la docu­men­ta­tion du bundle (ici pour la confi­gu­ra­tion et ici pour le work­flow).

Évoquons ensemble la troi­sième problé­ma­tique.

Une appli­ca­tion bench­mark

Pour évaluer les capa­ci­tés du DbTools­Bundle à anony­mi­ser rapi­de­ment des données, nous avons créé une petite appli­ca­tion Symfony que vous pouvez retrou­ver sur GitHub.

Cette appli­ca­tion défi­nit 4 connexions pour 4 bases de données gérées par des SGBD diffé­rents : Post­greSQL, SQLite, MariaDB et MySQL.

Pour chacune de ces 4 bases de données, nous avons défini les 3 mêmes enti­tés Doctrine :

Custo­mer

  • Une adresse e-mail
  • Un mot de passe
  • Un nom
  • Un prénom
  • Un entier repré­sen­tant un âge
  • Un numéro de télé­phone

Address

  • Une rue
  • Un code postal
  • Une ville
  • Un pays

Order

  • Un numéro de télé­phone
  • Une adresse e-mail
  • Un montant
  • Un message

Ces 3 enti­tés essayent de mimer au mieux une vraie appli­ca­tion : chacune d’entre elles défi­nit plusieurs champs à anony­mi­ser.

Ensuite, nous avons lancé la commande db-tools:anony­mize avec des jeux de données plus ou moins consé­quents.

Le tableau suivant présente les résul­tats :

Custo­mers Addresses Orders Post­greSQL SQLite MariaDB MySQL
100 000
5s
7s
20s
53s
500 000
9s
10s
37s
3m 44s
1 000 000
16s
16s
1m 23s
36m 56s
200 000
6s
10s
26s
42s
1 000 000
16s
11s
1m 15s
25m 31s
100 000
200 000
7s
10s
32s
1m 16s
100 000
200 000
1 000 000
24s
25s
1m 40s
36m 47s

Note1 : Les valeurs données sont indi­ca­tives et varient légè­re­ment à chaque lance­ment de la commande, on peut consi­dé­rer une marge d’er­reur de 10%.

Note2 : Ces tests ont été lancés sur une stack Docker qui utilise les images Docker offi­cielles des diffé­rentes plate­formes de base de données. Aucune confi­gu­ra­tion n’a été mise en place, c’est ce qui peut expliquer les mauvais résul­tats pour MySQL : l’image Docker de MySQL n’a pas de confi­gu­ra­tion parti­cu­lière mise en place de base, contrai­re­ment à celle de MariaDB.

La dernière ligne est sans doute celle la plus repré­sen­ta­tive d’un cas que l’on pour­rait rencon­tré. Les résul­tats sont très satis­fai­sants, on anony­mise 3 tables dont une avec 1 million de lignes en 24 secondes avec Post­greSQL !

En regar­dant les 3 premières lignes, on voit qu’en multi­pliant le nombre de données à anony­mi­ser par 10, on ne multi­plie le temps d’ano­ny­mi­sa­tion que par 3 (au moins pour Post­greSQL et SQLite). Ce résul­tat est en grande partie dû à la manière dont le DbTools­Bundle anony­mise les données.

SQL for the win

Avant de propo­ser le DbTools­Bundle à la commu­nauté, nous avons regardé quels étaient les outils PHP exis­tants pour faire de l’ano­ny­mi­sa­tion de données. Ceux que nous avons trouvé mettent tous en place la même approche par batch :

  1. Char­ger les données depuis la base
  2. Anony­mi­ser les données à l’aide d’un script PHP
  3. Mettre à jour les données dans la base

Cette approche a un avan­tage, elle permet d’uti­li­ser des librai­ries exis­tantes comme Faker pour géné­rer de fausses données. Mais elle a un gros incon­vé­nient : elle est très, très, lente.

Avec le DbTools­Bundle, nous avons choisi une autre approche : nous anony­mi­sons direc­te­ment à l’aide de requêtes SQL. Nous utili­sons le moteur de base de données pour ce qu’il fait le mieux : trai­ter de grosses quan­ti­tés de données.

Pour chaque table de base de données à anony­mi­ser, la librai­rie génère une unique requête d’update. C’est ce qui explique que lors des tests évoqués dans la section précé­dente, nous n’ob­ser­vions pas de corré­la­tion linéaire entre le nombre de lignes à anony­mi­ser et le temps d’ano­ny­mi­sa­tion. Pour un moteur de base de données, l’ef­fort à four­nir pour mettre à jour des données n’est pas direc­te­ment propor­tion­nel au nombre de données à modi­fier.

Ce n’est pas le cas lorsque l’on effec­tue ces actions par batch. Avec cette métho­do­lo­gie, le temps d’ano­ny­mi­sa­tion est direc­te­ment propor­tion­nel au nombre de lignes en base de données. Il n’y a rien à faire, c’est dû à la nature même de l’al­go­rithme.

Il faut noter qu’un gros travail a égale­ment été fait pour opti­mi­ser ces requêtes d’update. Le DbTools­Bundle supporte aujour­d’hui 4 moteurs de base de données diffé­rents (Post­greSQL, SQLite, MySQL/MariaDB et SQL Server), les requêtes d’update géné­rées par la librai­rie ont été travaillées de manière à être les plus effi­caces possibles en fonc­tion de la plate­forme sur lesquelles elles vont être exécu­tées. Nous avons ainsi, entre la version bêta du DbTools­Bundle et sa sortie, divisé par 50 les temps d’ano­ny­mi­sa­tion.

Un article est en cours de rédac­tion pour vous présen­tez ces diffé­rentes opti­mi­sa­tions pour chacun de ces 4 types de moteur de base de données.

Formations associées

Formation Symfony

Formation Symfony Initiation

Paris Du 28 au 30 mai 2024

Voir la formation

Formations Outils et bases de données

Formation PostgreSQL

Nantes Du 29 au 31 janvier 2024

Voir la formation

Formations Outils et bases de données

Formation GIT avancé

Nantes Du 25 au 26 juin 2024

Voir la formation

Actualités en lien

Image
Symfony
11/04/2024

Access Control : une biblio­thèque PHP pour gérer des droits d’ac­cès

Suite à un projet de gestion métier opéra­tion­nel dont la durée de vie et la main­te­nance sont à long termes, nous avons expé­ri­menté un passage de celui-ci sur l’archi­tec­ture hexa­go­nale et la clean archi­tec­ture.

Voir l'article
Image
Encart article 2 : Itéra­tions vers le DDD et la clean archi­tec­ture avec Symfony
20/02/2024

Itéra­tions vers le DDD et la clean archi­tec­ture avec Symfony (2/2)

Quels virages avons-nous pris après un premier projet expé­ri­men­tal pour stabi­li­ser notre concep­tion logi­cielle, et que ferons-nous plus tard ?

Voir l'article
Image
DbToolsBundle + Symfony = ❤️
06/02/2024

Découvrez le DbToolsBundle

L'équipe PHP est fière de vous présenter son nouveau bundle à destination des développeurs Symfony : sauvegardez, restaurez et anonymisez simplement vos bases de données !

Voir l'article

Inscription à la newsletter

Nous vous avons convaincus