it-swarm-fr.com

Que pouvons-nous faire dans la réplication MySQL 5.0 pour répondre aux préoccupations de la bande passante?

Je développe une application à exécuter sur le client client (Win) configuré avec une instance MySQL Server 5.1 qui servira d'esclave en lecture seule sur le maître distant. Le maître distant comporte des dizaines de schémas, mais je n'ai besoin que d'un par client, donc je fournis le paramètre Replication-do-dB dans My.ini pour répliquer uniquement le schéma dont le client a besoin. La réplication fonctionne, mais lorsque nos clients entrent dans des régions du monde où l'accès à Internet n'est disponible que via 3G sans fil, qui facturent l'utilisation de données, ils dépassent rapidement leurs limites de plan de données et gèrent des problèmes coûteux.

Si je comprends bien, MySQL écrit toutes les transactions pour tous les schémas dans un fichier binlog unique, ce qui signifie que chaque client doit télécharger toutes les transactions effectuées sur chaque schéma du maître, puis une fois téléchargé, appliquer le filtre de base de données par - Replication-do-dB Paramètres du fichier My.ini du client.

Pour minimiser cette inefficacité, j'ai utilisé le paramètre esclave_compressed_protocol = 1, ce qui semble réduire de 50% les données transmises de 50%, mais elle fait toujours dépasser rapidement son client de dépasser la facture 3G.

Je ne peux pas imaginer que je suis le seul à faire face à cela, alors je suis sûr que je vais avoir une tonne de réponses sur la manière de y parvenir en définissant x = y. Cependant, je ne trouve aucune documentation d'un tel cadre ni une approche recommandée à prendre.

Jusqu'à présent, voici ma pensée à une solution possible, veuillez fournir des commentaires ou des itinéraires alternatifs:


  1. Configurez un esclave "proxy" pour chaque schéma (sur une boîte différente ou même boîte avec une instance/port mySQL différente)
  2. Configurez l'esclave proxy pour reproduire-do-dB uniquement la base de données que les clients souhaitent reproduire.
  3. Configurez l'instance MySQL du client comme esclaves à l'esclave proxy approprié.

Cela devrait résultat au client tirant uniquement les données de Binlog pour leur schéma. L'inconvénient (aussi loin que je peux dire) est qu'il augmente considérablement la complexité de notre configuration, probablement la rendant plus fragile.

Les pensées? Cette approche fonctionnera-t-elle même?

Remarque, nous exécutons le serveur MySQL 5.0 sur Redhat, mais nous pourrions passer à 5,5 si elle produit une solution.

18
Abram

Suggestion n ° 1: Utiliser la distribution Masters

Un maître de distribution est un esclave MySQL avec BOG-Bin activé, log-esclave-mises à jour activées et contient uniquement des tables avec le Moteur de stockage Blackhole . Vous pouvez appliquer Replicat-do-dB au maître de distribution et créer des journaux binaires sur le maître de distribution contenant uniquement le (s) schéma (s) DB que vous voulez binlogged. De cette façon, vous réduisez la taille des binlogs sortants à partir du maître de distribution.

Vous pouvez configurer un maître de distribution comme suit:

  1. mySqldump Votre (s) base de données (s) à l'aide de --NO-Data Option pour générer un vidage de schéma uniquement.
  2. Chargez le dépotoir Schema uniquement au maître de distribution.
  3. Convertissez chaque table dans le maître de distribution au moteur de stockage Blackhole.
  4. Réplication de configuration sur le maître de distribution d'un maître avec des données réelles.
  5. Ajouter des options de réplication-do-dB à /etc/my.cnf du maître de distribution.

Pour les étapes 2 et 3, vous pouvez également modifier le décharge de schéma uniquement et remplacer le moteur = myisam et le moteur = Innodb avec moteur = Blackhole, puis chargez que le schéma modifié uniquement dans le maître de distribution.

À l'étape 3 seulement, si vous souhaitez scripter la conversion de toutes les tables Myisam et InnoDB au Blackhole dans le maître de distribution, exécutez la requête suivante et de la sortie à un fichier texte:

mysql -h... -u... -p... -A --skip-column-names -e"SELECT CONCAT('ALTER TABLE ',table_schema,'.',table_name', ENGINE=BLACKHOLE;') BlackholeConversion FROM information_schema.tables WHERE table_schema NOT IN ('information_schema','mysql') AND engine <> 'BLACKHOLE'" > BlackholeMaker.sql

Un bonus supplémentaire pour scripter de la conversion de la table sur le moteur de stockage Blackhole est celui-ci Memory Stockage Engine Les tables sont converties. Bien que la table des moteurs de stockage de mémoire ne prenne pas d'espace disque pour le stockage de données, elle prendra la mémoire. Conversion des tables de mémoire au Blackhole gardera la mémoire dans le maître de distribution épuré.

Tant que vous n'envoyez aucun DDL dans le maître de distribution, vous pouvez transmettre n'importe quel DML (insertion, mise à jour, supprimer), vous désirez avant de laisser les clients reproduire uniquement les informations de base de données.

J'ai déjà écrit un poste dans un autre site Stackexchange qui discute d'un maître de distribution .

Suggestion n ° 2: Utilisez des journaux binaires plus petits et des journaux de relais

Si vous définissez max_binlog_size sur quelque chose de ridiculement petit, les binlogs peuvent être collectés et expédiés dans des morceaux plus petits. Il existe également une option séparée pour définir la taille des journaux de relais, max_relay_log_size . Si max_relay_log_size = 0, il sera défini par défaut à tout max_binlog_size.

Suggestion n ° 3 : tilisez une réplication semi-anchrone (MySQL 5.5 uniquement)

Configurez votre base de données principale et plusieurs maîtres de distribution en tant que MySQL 5.5. Activez la réplication semi-anchrone de sorte que la base de données principale puisse rapidement expédier des binlogs au maître de distribution. Si tous vos esclaves sont des maîtres de distribution, vous n'avez peut-être pas besoin de réplication séminatronique ou de MySQL 5.5. Si l'un des esclaves, autres que les maîtres de distribution, ont des données réelles pour la déclaration, la haute disponibilité, le mode veille passive ou la sauvegarde, puis accédez à MySQL 5.5 en liaison avec une réplication semi-anchrone.

Suggestion n ° 4: Utilisez la journalisation binaire basée sur la déclaration non basée sur la ligne

Si une instruction SQL met à jour plusieurs lignes dans une table, la journalisation binaire basée sur l'instruction (SBBL) stocke uniquement l'instruction SQL. La même instruction SQL utilisant la journalisation binaire basée sur ligne (RBBL) enregistre réellement le changement de ligne pour chaque ligne. Cela rend évident que la transmission de déclarations SQL sauvera de la place sur des journaux binaires faisant SBBL sur RBBL.

n autre problème utilise RBBL en conjonction avec Replicat-do-dB où le nom de la table a la base de données préparé . Cela ne peut pas être bon pour un esclave, surtout pour un maître de distribution. Par conséquent, assurez-vous que tous les DML ne disposent pas d'une base de données et d'une période devant tous les noms de table.

10
RolandoMySQLDBA

Le MAX_BINLOG_SIZE doit être sans importance - les données Binlog sont continuellement diffusées en continu.

Attention à propos d'un "maître de distribution" - c'est un "point unique d'échec". C'est-à-dire que s'il meurt, tous les esclaves au-delà de cela ne recevront pas de données et la reconstruction du relais prendra du travail.

SBR vs RBR - Cela dépend de la requête. Soit peut être meilleur ou pire que l'autre.

Mettez les maîtres de distribution sur la même machine que le vrai maître, ou sur une machine "près" du maître. Utilisez des ports séparés pour conserver les instances séparées.

2
Rick James