Réplication MySQL en Master/Master avec partage de charge
2010-10-21 11:29
Write commentDans cet article nous allons essayer de mettre en place une solution qui assure la redondance d'une base de données MySQL et qui permet de partager la charge entre deux nœuds.
Pour assurer la redondance des données nous allons avoir recours à la réplication native de MySQL.
En ce qui concerne le partage de charge, nous allons utiliser MySQL Proxy bien qu'il soit encore à sa version 0.8 Alpha.
Redondance des données:
Dans cette section, nous allons configurer une réplication entre deux Maîtres MySQL, identifiés par DB-1 et DB-2, sachant que dans cette configuration, chaque Maitre sera en même temps l'esclave de l'autre.
Ce schéma est plus expressif:

Le grand avantage de cette architecture est d'avoir deux bases de données sur lesquelles on peut écrire en parallèle sans se soucier de la synchronisation, la réplication se charge de synchroniser vers DB-2 ce qu'on écrit sur DB-1, et vice versa.
C'est d'ailleurs pourquoi on va utiliser MySQL Proxy qui se placera comme partageur de charge entre ces deux bases de données.
On va commencer par mettre en place la réplication à double master:
NB: Toutes les requêtes SQL seront exécutés avec le compte root.
DB-1:
Ajouter ce qui suit à la section [mysqld] du fichier my.cnf et redémarrer mysqld:
# primary master server id
server-id=1
auto_increment_offset=1
# total number of master servers
auto_increment_increment=2
# local slave replication options
log-bin=master1-bin
log-slave-updates
# remote master replication options
master-host=slave2.ip
master-port=3306
master-user=slave2
master-password=slave2
master-connect-retry=10 Cette configuration indique à DB-1 d'accepter la réplication depuis Slave2.DB-2:
Ajouter ce qui suit à la section [mysqld] du fichier my.cnf et redémarrer mysqld:
# secondary master server id
server-id=2
auto_increment_offset=2
# total number of master servers
auto_increment_increment=2
# local slave replication options
log-bin=master2-bin
log-slave-updates
# remote master replication options
master-host=slave1.ip
master-port=3306
master-user=slave1
master-password=slave1
master-connect-retry=10 Cette configuration indique à DB-2 d'accepter la réplication depuis Slave2.Vous l'aurez certainement remarqué, auto_increment_offset et auto_increment_increment sont les clés du bon fonctionnement d'une réplication à double maîtres, car dans ce type de réplication et lors de l'écriture simultanée sur les deux maîtres, on aura facilement des collisions au niveau des clés auto incrémentées (auto_increment) menant à l'échec la réplication.
Prenons l'exemple de cette requête SQL
mysql> INSERT INTO personne (id, name) VALUES (null, 'Mahmoud'); Sachant que la colonne ID est une clé primaire auto incrémentée, à son exécution sur DB-1, la colonne ID aura la valeur '1'.Et si on exécute une autre requête sur DB-2 comme suit
mysql> INSERT INTO personne (id, name) VALUES (null, 'Fourat'); La colonne ID sera incrémentée et aura la valeur '1', ce qui provoquera un conflit dans la réplication car le la deuxième ligne insérée sur DB-2 ne pourra jamais synchronisée sur DB-2 puisque la colonne ID est une clé primaire et donc unique.Pour remédier à ce problème il faut appliquer configurer auto_increment_offset et auto_increment_increment en tenant compte de cette règle:




