MySQL et le moteur Blackhole
MySQL a l’avantage de pouvoir fonctionner avec différents moteur de stockage. Les plus connus sont sans aucun doute MyISAM, moteur historique très rapide en lecture mais dépourvu de transaction, et InnoDB qui est un moteur transactionnel capable d’absorber des charges plus importantes. Plusieurs autres moteurs sont également disponibles et répondent à des besoins particuliers. Memory permet par exemple d’utiliser des tables en mémoire. Enfin le moteur Blackhole permet comme son nom l’indique de ne rien stocker ! Alors me direz-vous à quoi cela peut-il bien servir un moteur de stockage qui ne stocke rien ??
Le moteur Blackhole et la réplication
Dans un système à forte charge il est fréquent de trouver plusieurs serveurs MySQL synchronisés entre eux via la réplication des données. Toutes les données ajoutées sur le serveur Maître sont sont enregistrées dans un journal qui est alors envoyé sur les différents serveurs Esclave pour y être joué afin que les bases soient parfaitement synchronisées. Etant donné que le journal contient les ordres sql, les serveurs MySQL peuvent fonctionner avec différents moteurs de stockage.
Utilisation en Proxy
Si les tables sur le Maître utilisent le moteur Blackhole, alors celui-ci ne fait qu’enregistrer les ordres SQL et les transmet aux différents serveurs Esclave. Bien entendu, seulement une ou une partie des tables peuvent être configurées de cette manière afin de répartir la charge entre différents serveurs dans le cas de grosses charges en écriture.
Utilisation en filtre de réplication
Un des inconvénients de la réplication MySQL actuelle, c’est qu’elle ne permet pas de de ne répliquer qu’une partie des données présentes sur le Maître. Ainsi, si un Maitre possède beaucoup de données, les Esclaves sont en principe obligés de supporter la même volumétrie même si ces données ne sont pas utilisées. Comme les tables sur un Esclave peuvent ne pas utiliser le même moteur de stockage que sur le Master, il est possible de déclarer les tables sur l’Esclave avec un moteur Blackhole. Ainsi, lorsque le processus de réplication jouera les ordres SQL reçus du Maître, celle-ci seront jouées, mais sans aucune conséquence ni sur les accès disque ni sur la charge CPU du serveur.
Exemple
Vous gérez plusieurs serveur MySQL en réplication avec une grosse base de données et beaucoup de requêtes… Malheureusement, vous devez exécuter des requêtes très consommatrices d’accès disque et qui ne sont pas optimisables, du genre :
SELECT id FROM users WHERE name like '%dupont%';
Cette requête fera inlassablement un « Full scan » de la table et ne peut pas utiliser d’index. Si la table contient beaucoup d’enregistrements et/ou un certain volume de données, il sera très difficile d’obtenir des temps de réponse corrects. En prime, les autres requêtes seront ralenties.
Une solution ? Ajoutez un serveur Esclave, mais déclarez toutes les autres tables en Blackhole et réservez ce serveur à l’exécution de ces mauvaises requêtes. La réplication n’utilisera que très peu d’accès disque qui seront quasiment dédiés à ces mauvaises requêtes.
Un solution « riche » ? Si votre serveur a suffisamment de mémoire, déclarez une table Memory qui ne contiendra que ce champ « name » ou les champs nécessaires à vos requetes, et positionnez un trigger sur la table d’origine afin que les modifications apportées par la réplication soient répliquées dans la table en mémoire.
Quelques chiffres
Chez Wikio, nous avons mis en place cette solution pour faire une test avec une table qui occupe 1Go sur disque. Les temps de réponse sont les suivants :
- Sur une esclave non dédié : entre 10 et 30 secondes suivant la charge occasionnée par les autres requêtes
- Sur un esclave ne répliquant que les tables nécessaires : 9 secondes
- En mettant les tables en mémoire : 3 secondes
Ben sûr, vous me direz, la solution est coûteuse… mais dans certains cas, il est préférable de monopoliser un serveur afin que les traitements aillent 3 fois plus vite !
5 Responses to “MySQL et le moteur Blackhole”
Indispensable pour que certains processus avancent rapidement !
Bonjour,
je cite :
« Un des inconvénients de la réplication MySQL actuelle, c’est qu’elle ne permet pas de de ne répliquer qu’une partie des données présentes sur le Maître. »
C’est inexact : regardez les options –replicate-ignore-table ou –replicate-ignore-db dans le manuel de MySQL.
Deuxième point : concernant votre requête : « SELECT id FROM users WHERE name like ‘%dupont%’; », une vraie solution sans manipulations coûteuses serait tout simplement de créer un index FULLTEXT sur le champ sus-cité…
Cordialement,
GL
Pour la réplication c’est exact. Malgré tout, dans notre cas, l’utilisation de tables blackhole était plus pratique et plus souple.
Concernant l’index full-text il ne permet (sauf erreur) de ne rechercher que des mots et non pas des parties de mots. Dans notre cas, nous utilisons cela pour rechercher des mots qui feraient partie d’une url. Par exemple, retrouver ‘dupont’ dans l’url ‘http://leblogdemarcdupont.com’. Les index ne sont dans ce cas d’aucune utilité car ils indexent des mots.
Mais si quelqu’un connaît une solution simple et efficace, je suis preneur
Bertrand
Merci pour cette explication ,
J’aimerai juste savoir quelle méthode utilisez vous pour réserver le serveur esclave à ce genre de requêtes ?
En jouant sur plusieurs ressources (connexions) mysql ?
Merci d’avance ,
Ch.
Oui, nous avons déclaré plusieurs ressources (une par serveur) et nous pouvons ainsi spécialiser une ressource pour un type de requêtes. Dans notre cas, ce serveur n’est utilisé que par des requêtes faisant un scan de toute la table à chaque fois.
Leave a Reply