Réplication MySQL Master-Master de TOUTES les bases de données. Comment?

16

Contexte : J'ai deux serveurs MySQL 5.1 configurés en réplication basée sur les lignes Master-Master (RBR) en suivant cet excellent guide . Je veux que toutes les bases de données soient répliquées et j'ajouterai régulièrement de nouvelles bases de données.

Objectif : je voudrais pouvoir ajouter de nouvelles bases de données à la réplication en ajoutant simplement la base de données à l'un des serveurs; sans avoir à arrêter les deux esclaves, modifier les fichiers de configuration, redémarrer les serveurs MySQL et redémarrer les esclaves.

Question : D'après ce que je l' ai lu, je pense que je peux le faire simplement en omettant tout binlog-do-db, binlog-ignore-db, replicate-do-dbet les replicate-ignore-dbparamètres de configuration de chaque serveur, mais je ne peux pas être sûr. Les documents de MySQL sur la façon dont les options de réplication au niveau de la base de données et de la table sont évaluées me font penser qu'il n'y a aucun moyen d'y parvenir.

Les parties pertinentes de mes /etc/mysql/my.cnffichiers sont copiées ci-dessous. Suis-je sur la bonne voie? Est-ce que je veux même possible?

Master 1 :

[mysqld]
binlog-format = row
server-id = 1
replicate-same-server-id = 0
auto-increment-increment = 2
auto-increment-offset = 1

master-host = <master2_ip>
master-user = slave_user
master-password = <password>
master-connect-retry = 60

log-bin = /var/log/mysql/mysql-bin.log
relay-log = /var/lib/mysql/slave-relay.log
relay-log-index = /var/lib/mysql/slave-relay-log.index
expire_logs_days = 14
max_binlog_size = 2048M

Master 2 :

[mysqld]
binlog-format = row
server-id = 2
replicate-same-server-id = 0
auto-increment-increment = 2
auto-increment-offset = 2

master-host = <master1_ip>
master-user = slave_user
master-password = <password>
master-connect-retry = 60

log-bin = /var/log/mysql/mysql-bin.log
relay-log = /var/lib/mysql/slave-relay.log
relay-log-index = /var/lib/mysql/slave-relay-log.index
expire_logs_days = 14
max_binlog_size = 2048M
Andrew Ensley
la source
1
Créez la base de données sur la machine vers laquelle vous dirigez les écritures.
Martin
quelle est votre config complète? J'essaie la réponse ci-dessous, cela n'a pas fonctionné :-(
zx1986

Réponses:

17

Voilà comment je l'ai fait pour les deux maîtres

log-bin = mysqld-bin
binlog-ignore-db=test
binlog-ignore-db=information_schema
binlog-ignore-db=mysql
log-slave-updates
replicate-ignore-db=test
replicate-ignore-db=information_schema
replicate-ignore-db=mysql
relay-log=mysqld-relay-bin
Mike
la source
Pouvez-vous ajouter des bases de données à l'un ou l'autre maître et les faire répliquer automatiquement sur l'autre?
Andrew Ensley
oui ils l'ont fait .. je viens de configurer ceux à ignorer
Mike
1
Deux questions: je dois juste m'assurer que nous disons tous les deux la même chose. # 1 Pouvez-vous ajouter une base de données à l'un des deux maîtres et elle est créée automatiquement sur l'autre, puis toutes les données insérées dans la nouvelle base de données sont répliquées sans changer de configuration ni redémarrer les serveurs? # 2 Utilisez-vous la réplication basée sur des instructions ou des lignes? J'ai besoin de toutes les modifications sur toutes les bases de données répliquées; même ceux exécutés sans instruction "use" au préalable. Ces paramètres fonctionneront-ils bien avec la réplication basée sur les lignes?
Andrew Ensley
3
oui oui oui oui oui :)
Mike
1
Ok, je viens de configurer mes serveurs en utilisant ces paramètres hier soir. J'ai sauté le log-slave-updatesréglage car je n'en voyais pas la nécessité. Tout fonctionne parfaitement. Je peux ajouter et supprimer des bases de données et les modifications sont répliquées. Je vous remercie! Bounty décerné.
Andrew Ensley
4

En ce qui concerne la création de bases de données, il existe toujours des rapports de bogues sur l'utilisation de CREATE DATABASE avec la réplication basée sur les lignes.

Ce rapport est fermé, mais le bogue est réapparu dans MySQL 5.1.47
Ce rapport est basé sur MySQL Cluster (moteur de stockage NDB)
Ce rapport est basé sur replicate-wild-ignore-table toujours en cours de réplication.

La réplication basée sur les lignes fait augmenter les journaux binaires à un rythme extraordinaire qui peut augmenter le trafic réseau simplement en envoyant des données de journaux binaires aux journaux de relais de l'esclave.

@Mike dit qu'il a réussi à créer et à répliquer la base de données. Je n'en doute pas du tout. Ce que je suis, c'est un peu méfiant de MySQL (eh Oracle) n'ayant pas éliminé tous les défauts de la réplication basée sur les lignes une fois la base de données instanciée.

Vous souhaiterez peut-être basculer vers row_format MIXED si vous souhaitez toujours des entrées basées sur des lignes dans les journaux binaires. En interne, le format de journal binaire a tendance à flotter entre instruction et fixe de toute façon: (Voir http://bugs.mysql.com/bug.php?id=40146 ). Plus de rapports de bogues sont fermés en utilisant des méthodes mixtes et en évitant les lignes ( http://bugs.mysql.com/bug.php?id=39701 ) mais les problèmes persistent toujours par intermittence.

NOTE FINALE

Pour votre propre raison, veuillez revenir à la réplication basée sur les instructions et ainsi rendre CREATE DATABASE (qui est une instruction SQL) stable et cohérente pour le SQL suivant par rapport à la base de données créée. En fait, le rapport de bogue le plus récent montre qu'il est préférable d'utiliser la réplication basée sur les instructions, indépendamment de ce que la documentation dit sur les options au niveau de la base de données et de la table.

RolandoMySQLDBA
la source
Merci pour toutes ces informations. Mon seul problème avec la réplication basée sur les instructions est que les modifications spécifiant la base de données (c'est-à-dire "INSERT INTO db1.table1 (col1) VALUES ('hi');") ne fonctionneront que si la base de données est la base de données en cours d'utilisation. Je suppose qu'il est peut-être temps de passer à la réplication basée sur des instructions et de nettoyer du code ...
Andrew Ensley
Il s'avère que ce n'était pas si difficile de corriger le code nécessaire. J'utilise la réplication basée sur les instructions maintenant. Merci pour le conseil.
Andrew Ensley
0

Hmm ... Vous devrez également trouver un moyen de gérer / différencier les clés et les champs auto-incrémentés. Cela semble intéressant .. http://mysql-mmm.org/

Nandhini Anand
la source
Ceci est géré dans les paramètres auto-increment-incrementet auto-increment-offsetdans mes fichiers de configuration. Voir cette page: dev.mysql.com/doc/refman/5.1/en/…
Andrew Ensley
Je pense que vous vous méprenez. @Andrew parle d'ajouter de nouvelles bases de données, pas d'ajouter de nouveaux serveurs de bases de données. Si @Andrew introduisait de nouveaux serveurs de base de données, il pourrait y avoir des collisions clés lors de la redistribution des données entre 3 serveurs DB ou plus, que votre réponse traiterait. +1 pour vos efforts, mais veuillez lire attentivement toutes les questions. J'ai également été brûlé de la même manière.
RolandoMySQLDBA
@all: Oups .. Désolé. Je pourrais jurer que je l'ai lu complet, mais aucun ne doit avoir écrémé à la place ...
Nandhini Anand
-1

cmiiw j'ai pensé que vous devriez pouvoir créer une base de données sur master1 et master2 sans changer la conf ou arrêter l'esclave, mais assurez-vous que la réplication maître-maître fonctionne. parce que vous ne définissez pas la base de données à répliquer, cela signifie que toute base de données sera répliquée si vous ne la définissez pas sur my.cnf.

chocripple
la source
C'est exactement ce que je demande ici. Je ne peux pas trouver de réponse définitive à ce sujet jusqu'à présent.
Andrew Ensley,