Articles

Le moteur Blackhole pour MySQL

  • Ecrit par Damien Seguy
Image pour le titre du contenu

Le moteur Blackhole de MySQL est un moteur de table, aussi appelé moteur de stockage. Blackhole signifie trou noir, en anglais : comme son alter ego astrophysicien, le moteur Blackhole avale toutes les données qu'on lui envoie, mais n'en revoie jamais. Il accepte toutes les commandes comme n'importe quel moteur, mais il ignore simplement les insertions de données; il n'efface et ne modifie jamais rien, et il renvoie toujours des jeux de lignes vides.

Quand j'ai découvert ce moteur dans la documentation de MySQL 4.1, je me suis aussitôt demandé : mais à quoi ce diable de moteur peut-il bien servir ? Il est vrai que j'ai mis du temps à voir son utilité apparaître, et ce n'est probablement pas le moteur de prédilection que vous aurez à utiliser. Mais il est fort pratique dans de nombreuses situations.


Moteur d'exemple
La première utilité que je lui ai trouvée est d'être un moteur d'exemple pour ceux qui se lancent dans la compilation d'un nouveau moteur pour MySQL. En fait, le moteur Blackhole est le tout simplement le squelette d'un tel moteur. Il contient toutes les interfaces, mais ne fait rien entre l'acquisition des arguments et le retour des données. C'est probablement comme cela qu'il a été inventé, d'ailleurs : les auteurs ont rassemblé le strict minimum qui était nécessaire pour qu'il fonctionne, mais rien de plus.

Bref, si vous vous lancez dans le développement d'un moteur pour MySQL, commencez par jeter un œil à ce moteur, pour savoir comment il fonctionne.

Référence pour les tests de performance
La deuxième application possible est de servir de référence pour les performances. L'utilisation du moteur Blackhole impose au serveur MySQL de préparer les données comme pour n'importe quel moteur, et de lui transmettre. Le moteur Blackhole ne fait alors rien du tout, et répond immédiatement que tout s'est bien passé. C'est le service minimum imaginable.

Lorsque vous montez une suite de tests de performance, il est bon d'ajouter le moteur Blackhole dans les moteurs testés, pour avoir les performances maximales comme référence. Si le moteur Blackhole prend une seconde (gasp!) pour avaler une insertion, et qu'un autre moteur en prend 1.2s, vous saurez que vous pourrez gagner au mieux 0.2 seconde de temps de traitement. Il ne sera pas possible de battre les performances du Blackhole. Peter Zaitsev et Brian Aker l'ont utilisé dans leurs tests de performance cette année.

Réplication
Voici une situation plus proche d'une pratique opérationnelle : le moteur Blackhole dans le cadre de la réplication. Ce moteur peut être utilisé sur le maître. Ce dernier encaisse les écritures (insertions, modifications et effacements) et avec le moteur Blackhole, elles seront très rapides. L'intérêt ici est que ces opérations, bien qu'ignorées par le moteur Blackhole, seront notées dans le journal binaire (bin log), et donc relayé aux esclaves. Cela permet de configurer un serveur maître sous forme de simple proxy : il ne fait que relayer les modifications aux esclaves sans les prendre en charge. Vous pouvez ainsi utiliser un maître qui est bien moins puissant que les esclaves, mais qui saura leur transmettre fidèlement les évolutions des données.

Chargement de caches
Enfin, la dernière utilisation possible est similaire à la précédente : MySQL utilise un maximum de cache à tous les niveaux (cache de requête, d'index, de table, mémoire, etc), mais le système d'exploitation et les pilotes des disques aiment aussi avoir les données en cache. Pour assurer des performances intéressantes en production, il est important de pouvoir préremplir ces caches.

Le plus efficace est alors de charger toutes les données issues d'une table avec une commande SELECT * : MySQL va en profiter pour remplir ses caches mémoires. Mais que faire de toute cette masse de données ? Blackhole est alors une bonne solution : il suffit d'insérer toutes ces données dans une table Blackhole.

Mysql> insert into table_bh select * from table;

Les données sont lues dans table, puis envoyée à table_bh, mais jamais écrite. La charge sur le serveur est minimum, et vous remplissez les caches sans gaver la mémoire du serveur ou de PHP.

Toujours plus haut
La documentation propose encore trois autres utilisations :
  • Vérifier la syntaxe d'un fichier SQL : appliquant les commandes sur une table Blackhole, on passe en revue toutes les commandes et on peut identifier les erreurs rapidement, sans faire faire tout le travail au serveur.
  • Identifier les ralentissements qui ne sont pas liés au moteur : par exemple, si une requête SQL est très complexe et que c'est le moteur d'optimisation de MySQL qui est très lent à l'analyser, alors le temps de calcul ne va pas changer si vous changez le moteur en Blackhole. Cela peut aussi être une approche d'optimisation pour une application Web, pour vérifier si le script est à l'origine des ralentissements plutôt que la base de données.
  • Mesurer le coût de l'entretien d'un journal (binaire, général, requêtes lentes, etc) en utilisant le moteur Blackhole, avant ou sans ces journaux activés.

Conclusion
Quoique risible tant il ne réalise aucune opération utile, le moteur Blackhole se révèle bien pratique dans de nombreuses circonstances, pour assurer des relais ou soulager le serveur de tâches totalement inutiles.

Commentaires

Vous pouvez ajouter votre commentaire!


Vous devez vous connecter pour commenter