Créez un esclave MySQL à partir d'un autre esclave, mais dirigez-le vers le maître

8

Problème

J'ai la configuration de réplication MySQL entre 2 serveurs, maître ( A ) et esclave ( B ). J'ai besoin d'ajouter un nouvel esclave au mix ( C ). Je veux que cet esclave obtienne ses mises à jour directement du maître, je ne veux pas de réplication de chaîne de l'esclave. Cependant, le maître est "chaud", j'utilise généralement Xtrabackup pour créer une sauvegarde complète du maître, mais cela le verrouillera pendant 10 bonnes minutes, car la base de données fait environ 20 Go.

Solution possible

RINCER LES TABLES AVEC VERROUILLAGE DE LECTURE sur l'esclave B , utiliser SHOW SLAVE STATUS sur B , écrire le journal des pannes et la position. Ensuite, sauvegardez la base de données avec Xtrabackup, expédiez la sauvegarde à C et utilisez-la pour créer l'esclave et définissez la réplication sur A avec la position binlog que je viens d'écrire.

Question

Existe-t-il un meilleur moyen qui ne me demande pas de verrouiller B aussi longtemps? Ou quelque chose qui est plus facilement automatisé?

Alex Recarey
la source

Réponses:

20

Hé je connais une méthode folle pour créer un esclave sans augmenter aucune opération de maître (ServerA) ou esclave (ServerB)

Étape 1) Configurer un nouveau serveur (ServerC)

Étape 2) Sur ServerC, installez MySQL (même version que ServerB)

Étape 3) Sur ServerC, service mysql stop

Étape 4) Copiez /etc/my.cnf de ServerB vers ServerC

Étape 5) Sur ServerC, remplacez server_id par une valeur différente de ServerA et ServerB

Étape 6) rsync / var / lib / mysql sur ServerB à ServerC

Étape 7) Lorsque rsync est terminé, exécutez "STOP SLAVE;" sur ServerB

Étape 8) rsync / var / lib / mysql sur ServerB vers ServerC

Étape 9) Sur ServerB, exécutez "START SLAVE;"

Étape 10) Sur ServerC, service mysql start

Étape 11) Sur ServerC, exécutez "START SLAVE;" (Faites ceci si skip-slave-start est dans /etc/my.cnf)

Essaie !!!

BTW J'ai la plus grande confiance que cela fonctionnera car je viens de le faire pour le client au cours des 2 derniers jours. Le client avait 2,7 To de données sur un esclave. J'ai rsyncd à un autre serveur tandis que l'esclave était toujours actif. rsync a pris environ 11 heures. J'ai ensuite couru STOP SLAVE; sur le premier esclave et a exécuté à nouveau rsync. Cela a pris encore une heure. J'ai ensuite effectué l'étape ci-dessus et tout est fait.

RolandoMySQLDBA
la source
LOL. J'allais commenter l'OP pour utiliser votre suggestion, et bas et voici son M. Rolando le "Fridge" DBA. Rolando a mis le doigt sur la tête et c'est la méthode préférée sans avoir à arrêter un maître et sans arrêter trop longtemps votre esclave B.
coderwhiz
2
Je sais que c'est un article assez ancien mais quelqu'un m'a posé des questions sur cette méthode. Cela fonctionne bien en supposant que le nouvel esclave et l'ancien esclave sont exactement les mêmes. Si le nouvel esclave est un arc différent, cela ne fonctionnera pas (iirc). Et je suis presque sûr que si vous utilisez des espaces de table innodb par fichier, cela ne fonctionnera pas. La solution la plus sûre consiste à effectuer une sauvegarde complète à partir du maître en cas de doute.
lusis
@lusis - Votre commentaire est très vrai. Dans un monde parfait, que la plupart des clients mysql s'imaginent avoir, ils veulent que cela soit fait car toutes les spécifications matérielles sont identiques. Dans les configurations où le matériel diffère, mysqldumps et recharger est le plus sûr. Vous devez soumettre votre commentaire comme réponse. Je l'apprécierais. Voyons voir si d'autres le feront !!!
RolandoMySQLDBA
J'ai suivi la procédure. Après avoir redémarré mysql sur SlaveC, je reçois une erreur disant "Votre base de données est peut-être corrompue ou vous avez peut-être copié l'espace de table InnoDB mais pas les fichiers journaux InnoDB". Et sur start slave(SlaveC), je reçois "Impossible d'ouvrir le journal du relais '/var/log/mysql/mysql-relay-bin.001603"
Hussain Tamboli
De cette façon, vous pouvez facilement perdre des données sur ServerC.
akuzminsky
3

Lorsque nous ajoutons un esclave à notre mix, nous procédons comme suit:

  • mettre un esclave hors ligne
  • copiez le répertoire de données de la base de données vers le nouvel esclave (les paramètres de l'esclave - position du journal, hôte maître, etc. - seront corrects puisque nous avons copié à partir d'un esclave)
  • démarrer l'esclave d'origine
  • modifier l'ID serveur dans my.cnf pour le nouvel esclave
  • commencer un nouvel esclave
sreimer
la source
Je devais juste le faire moi-même cet après
sreimer
1

J'ai fait ce que suggère @RolandoMySQLDBA mais en ajoutant également des pas de 6 ' et 8' (cela résout ce que @Hussain Tamboli commente .):

Étape 1) Configurer un nouveau serveur (ServerC)

Étape 2) Sur ServerC, installez MySQL (même version que ServerB)

Étape 3) Sur ServerC, service mysql stop

Étape 4) Copiez /etc/my.cnf de ServerB vers ServerC

Étape 5) Sur ServerC, remplacez server_id par une valeur différente de ServerA et ServerB

Étape 6) rsync / var / lib / mysql sur ServerB à ServerC

Étape 6 ') rsync / var / log / mysql sur ServerB vers ServerC

Étape 7) Lorsque rsync est terminé, exécutez "STOP SLAVE;" sur ServerB

Étape 8) rsync / var / lib / mysql sur ServerB vers ServerC

Étape 8 ') rsync / var / log / mysql sur ServerB vers ServerC

Étape 9) Sur ServerB, exécutez "START SLAVE;"

Étape 10) Sur ServerC, service mysql start

Étape 11) Sur ServerC, exécutez "START SLAVE;" (Faites ceci si skip-slave-start est dans /etc/my.cnf)

Pere Barceló
la source
votre réponse n'est pas complète et fait référence à d'autres choses. ce n'est pas un forum, améliorez votre réponse pour être complet par lui-même.
asdmin
0

Vous avez l'option "LOAD DATA FROM MASTER" mais c'est fortement déconseillé.

Effectuez-vous des sauvegardes nocturnes / hebdomadaires sur votre système? Si c'est le cas, notez également la position avec votre sauvegarde, vous pouvez alors utiliser cette sauvegarde pour configurer un nouvel esclave. Laissez-le tranquille et laissez-le se mettre à jour pendant un certain temps.

jishi
la source
0

J'ai essayé les réponses de Rolando et j'ai bien fonctionné, mais il a été recommencé depuis le début et j'ai dû ajouter plus de code d'erreur à ignorer (je sais que ce n'est pas recommandé, mais je sais ce que je faisais).

Une fois l'étape 7 terminée, j'ai vérifié le journal mysql et noté le nom et la position du journal bin et j'ai continué jusqu'à la 9ème étape. Avant la 10e étape, je viens d'exécuter change masterpour le fichier journal et la position du journal. Et a continué à partir de l'étape 11. Tout me va bien.

Pointe
la source
-2

Vous devez modifier l'uuid esclave dans auto.cnf afin que le maître puisse différencier les deux esclaves.

Nazgul
la source