Quel est le but du moteur BLACKHOLE de MySQL?

Pourquoi voudriez-vous enregistrer quelque chose que vous ne pouvez pas récupérer plus tard? À quoi ça sert?

Il est utile dans un environnement répliqué où toutes les instructions SQL sont exécutées sur tous les nœuds, mais vous ne souhaitez que certains nœuds pour stocker le résultat. Ceci est un cas d’utilisation donné dans la documentation: http://dev.mysql.com/doc/refman/5.0/en/blackhole-storage-engine.html

Les autres utilisations données dans la documentation incluent:

  • Vérification de la syntaxe du fichier de vidage.
  • Mesure de la surcharge de la journalisation binary, en comparant les performances à l’aide de BLACKHOLE avec et sans la journalisation binary activée.
  • BLACKHOLE est essentiellement un moteur de stockage «non opérationnel», il peut donc être utilisé pour détecter les goulots d’étranglement liés au rendement du moteur de stockage lui-même.

Supposons que vous ayez deux ordinateurs, chacun exécutant un serveur MySQL. Un ordinateur héberge la firebase database principale et le second ordinateur héberge un esclave de réplication que vous utilisez en tant que sauvegarde.

Supposons en outre que votre serveur principal contienne des bases de données ou des tables que vous ne souhaitez pas sauvegarder. Peut-être sont-elles des tables de cache à haut taux de rotation et peu importe si vous perdez leur contenu. Ainsi, pour économiser de l’espace disque et éviter l’utilisation inutile de processeurs, de mémoire et d’E / S disque, vous utilisez les options de réplication pour configurer l’esclave afin qu’il ignore les instructions qui affectent les tables que vous ne souhaitez pas sauvegarder.

Mais comme les filtres de réplication ne sont appliqués que sur le serveur esclave , les fichiers binarys de toutes les instructions exécutées sur le serveur maître doivent toujours être transmis sur le réseau. La bande passante est gaspillée ici; le serveur maître envoie des fichiers binarys pour les transactions que l’esclave va simplement jeter lors de leur réception. Pouvons-nous faire mieux et éviter l’utilisation inutile de la bande passante?

Oui, nous le pouvons, et c’est là que le moteur BLACKHOLE entre en jeu. Sur le même ordinateur que le serveur maître, nous exécutons un deuxième processus mysqld , celui-ci hébergeant une firebase database BLACKHOLE. Nous configurons ce processus factice pour qu’il soit répliqué à partir du binlog du processus maître, avec les mêmes options de réplication que l’esclave réel, et qu’il génère son propre journal. Le binlog du processus factice ne contient plus que les instructions dont l’esclave réel a besoin, et il n’a pas effectué de travail au-delà du filtrage des instructions indésirables du binlog (puisqu’il utilise le moteur BLACKHOLE). Enfin, nous configurons l’esclave vrai pour qu’il soit répliqué à partir du binary du processus factice, plutôt que du binary du processus maître d’origine. Nous avons maintenant éliminé le trafic réseau inutile entre les deux ordinateurs hébergeant les serveurs maître et esclave.

Cette configuration est ce qui est décrit et illustré (beaucoup plus simplement) par ce paragraphe et ce diagramme des documents BLACKHOLE :

Supposons que votre application nécessite des règles de filtrage côté esclave, mais que le transfert de toutes les données de journal binarys vers l’esclave entraîne d’abord un trafic excessif. Dans un tel cas, il est possible de configurer sur l’hôte maître un processus esclave «factice» dont le moteur de stockage par défaut est BLACKHOLE, représenté comme suit:

Diagramme du scénario décrit ci-dessus

Outre le filtrage, les documents suggèrent également que l’utilisation d’un serveur BLACKHOLE avec binlogging activé “peut être utile comme mécanisme de répéteur” . Ce cas d’utilisation est moins détaillé dans les documents, mais il est possible d’imaginer un scénario dans lequel cela aurait du sens. Par exemple, supposons que vous ayez beaucoup de serveurs esclaves, tous sur des ordinateurs sur un réseau local avec des connexions locales rapides les uns aux autres, qui doivent tous répliquer de grandes quantités de données à partir d’un esclave distant qui ne peut être connecté qu’à Internet. Vous ne voulez pas tous les répliquer directement à partir du boîtier principal, car vous obtenez les mêmes données plusieurs fois et utilisez plusieurs fois plus de bande passante Internet que nécessaire. Mais supposons que vous ne vouliez pas non plus qu’un seul de vos esclaves existants soit répliqué à partir du maître et que les autres répliquent avec cet esclave, peut-être parce que vos esclaves fonctionnent sur des machines beaucoup moins fiables que le maître ou exécutent d’autres processus. cela pourrait tuer la boîte en mangeant tout son processeur ou sa mémoire, et vous ne voulez pas risquer une panne logicielle ou matérielle de l’esclave intermédiaire qui détruit tout votre réseau esclave. Que faire?

Un compromis possible serait d’introduire une boîte supplémentaire dans votre réseau esclave pour servir d’intermédiaire, optimisé pour la fiabilité et les performances plutôt que pour le stockage. Donnez-lui un petit disque SSD fiable et ne lancez rien d’autre qu’un processus mysqld répliqué à partir du maître distant, et produisez des fichiers binarys auxquels les autres esclaves peuvent s’abonner. Et, bien sûr, configurez cet esclave intermédiaire pour utiliser le moteur BLACKHOLE, de sorte qu’il n’ait pas besoin d’espace de stockage.

Cela et l’esclave de filtrage intermédiaire décrit en détail dans la documentation sont des cas extrêmes. la plupart des utilisateurs de MySQL ne se retrouveront jamais dans des situations où ils tireraient avantage de l’une ou l’autre de ces stratégies, et encore moins d’avoir suffisamment d’influence pour justifier leur travail. Mais au moins théoriquement, le moteur BLACKHOLE peut être utilisé pour créer un nœud intermédiaire dans un réseau d’esclaves de réplication en tant que stratégie de conservation de la bande passante, sans avoir besoin que ce nœud stocke réellement les données sur le disque.