web-dev-qa-db-fra.com

Accélérer la réplication des esclaves sur une grande base de données / esclave rapide

Nous avons une grande base de données MySQL (environ 100 Go sur disque) que nous aimerions apparaître un esclave.

Notre processus typique de création d'un esclave est:

  1. Créer un serveur esclave
  2. Charge dans une vidage mysql du maître
  3. Commencer l'esclave
  4. Attendez que la réplication des esclaves synchronisées avec maître
  5. Placez le serveur esclave en production

Le problème que nous rencontrons est avec la taille de la base de données. Au début de l'étape ci-dessus est terminée, l'esclave est si loin derrière le maître qu'il est incapable de se rattraper. En fait, la réplication des esclaves pousse plus loin et derrière. Je ne suis pas sûr de savoir pourquoi cela se produit.

Des idées sur la manière de semer le serveur esclave plus rapide ou de réparer la question de la réplication? Notez que le serveur maître dispose de plusieurs bases de données et un mélange de tables InnoDB/Myisam. Le serveur exécute MySQL 5.1

4
user1040700

Il y a deux problèmes ici, qui doivent être résolus de manière indépendante.

Créer un esclave

Avec cette taille, 100 Go, MySqldump est généralement de ralentir aussi d'être fait efficacement. Essayez d'utiliser une sauvegarde binaire. Vous avez plusieurs options: @Paul vous en dit un, mais il est gênant que le maître soit verrouillé pendant la durée du processus de copie. De plus, RSYNC peut être très efficace si vous disposez de plusieurs petits fichiers, mais il peut ne pas être pour que les tailles de fichiers plus importantes changent de manière aléatoire tout au long de celle-ci (si vous avez une grande ibdata1).

Mes recommandations seraient instantané (si vous utilisez des machines virtuelles ou un système de fichiers qui le permettent: ZFS, tout autre sur le dessus de LVM, etc.) ou Percona Xtrabackup/Oracle Enterprise Backup. Ces options rendront le processus de sauvegarde presque aussi rapide que la copie de fichiers du système de fichiers sans presque aucun verrou. Certains d'entre eux permettent également une copie parallèle si votre bande passante le permet.

Si aucun de ces éléments ne fonctionne pour vous, essayez d'utiliser un utilitaire de sauvegarde/restauration parallèle logique comme myDumper.

Réplication avec l'augmentation de la gamme

Vous devez découvrir pourquoi cela se passe en premier (profilez vos questions sur les deux serveurs), mais ce sont certaines des causes les plus courantes:

  • Utilisez du matériel/des ressources au moins aussi bien que le maître de votre esclave. Si l'esclave est plus lent, la réplication fonctionne dans un seul thread (principalement), l'esclave sera décalé.
  • Si vous avez des transactions à long terme en concurrence, essayez d'utiliser le binlog_format = ROW. Il peut augmenter votre utilisation de la bande passante mais réduire la charge de l'esclave.
  • Essayez de mettre à niveau les versions MySQL, si c'est une possibilité. Il y a eu beaucoup d'améliorations de performance en termes d'exécution de requêtes et de journaux binaires dans les versions ultérieures. Par exemple, une raison pour laquelle vous pourriez être en retard, c'est parce que les tampons ne sont pas chauds sur l'esclave récemment démarré. Qui est atténué partiellement dans les dernières versions. En outre, l'exécution de la réplication multiple-thread a été quelque peu intégrée.
  • Vous pouvez vous détendre des configurations d'intégrité sur l'esclave, comme dans le cas d'un crash, vous pouvez toujours réimporter du maître en cas de crash (innodb_flush_log_at_trx_commit, par exemple).
  • En dernier recours, vous pouvez essayer des protocoles alternatifs permettant une communication plus synchronisée entre serveurs, mais cela implique généralement beaucoup plus de travail.
4
jynus

Un problème majeur avec la recréation d'une base de données de cette taille est l'index. Cela va prendre un certain temps pour indexer ce que je suppose, c'est des rangées dans les milliards.

La solution consiste à copier les index avec les données et cela signifie sauter la décharge. Cela signifie également sauter le déménagement de> 700 Go de données.

Voici ce que vous faites maintenant:

  • table complète Lire, écrire sur disque (lecture de 100 Go, écriture de 100 Go, probablement à travers les mêmes têtes de disque).
  • lire le fichier, appuyer sur le réseau, écrire sur un autre disque
  • lisez la deuxième copie, écrivez à la base de données (à nouveau, probablement via les mêmes têtes de disque)
  • lisez-la à nouveau, calculez et écrivez les index.

Essayez cela à la place:

  • Sur Master, verrouillez la base de données en lecture seule, rincer tout.
  • Sur esclave, arrêtez le démon mysqld ((( très IMPORTANT !!!)
  • rsync le répertoire de magasin de données du maître à l'esclave
  • commencer l'esclave
  • déverrouillez le maître.

Il peut y avoir un peu de ménage comme définissant correctement l'indice de journal, mais cette opération copie la base de données intacte plutôt que de le recréer. Bien sûr, les numéros de version doivent correspondre.

Si vous partitionnez vos plus grandes tables, vous obtenez même des performances plus rapides, car RSYNC ne copiera que des fichiers qui ont changé.

2
paul