MysqlDuplicate

From AleikoumWiki

Jump to: navigation, search

Comment mettre une replication MySQL
par Erwan 'Laby' Ben Souiden e.bensouiden<@>gmail.com


Ce howto a été réalisé après une suite de tests faits sur des serveurs MySQL v4.0.24

Créer un compte utilisateur pour la réplication
Pour que la réplication soit possible il faut créer au niveau du master un utilisateur avec des droits spécifique :

mysql> GRANT REPLICATION SLAVE ON *.* TO <user_name>@'%' IDENTIFIED BY '<password>';

<user_name> : nom de l'utilisateur utilisé pour la réplication
<password> : mot de passe associé
A noter qu'il peut être bon de créer l'user sur la machine esclave au cas ou l'esclave passerait maître par exemple...
De plus le % indique n'importe quelle machine pour la replication mais il est possible (et plus secure) de mettre l'adresse de la machine qui nous interesse

Bloquer l'accès en écriture des tables du côté MASTER
Jusqu'à ce que le serveur esclave soit mis en place il ne faut pas que les bases copiées subissent des modifications, cela risquerait de créer des incohérences dans les mises à jour de l'esclave.
Pour bloquer les tables il suffit de taper la commande suivante :

mysql> FLUSH TABLES WITH READ LOCK;


Eteindre le MASTER

shell>/usr/local/mysql/bin/mysqladmin -u root shutdown


Copier les bases
Il suffit de se placer dans le répertoire des bases :

shell> tar -cvf ./mysql-snapshot.tar ./cette_base

La commande suivante copie seulement "cette_base" pour toutes les copier il suffit de taper la ligne suivante :

shell> tar -cvf ./mysql-snapshot.tar


Modification du my.cnf côté MASTER Il est important de spécifier certains paramètres dans le fichier /etc/my.cnf , il suffit de rajouter dans la section [mysql] les lignes suivantes (si elles n'y étaient pas):

log-bin
server-id = <number>

<number> : est une valeur comprise entre 1 et 2^32 - 1
log-bin permet de spécifier la génération de fichiers binaires contenant une sorte d'historique des modifications des bases.
SHOW MASTER STATUS; permet de consulter quel est le dernier log-file modifié et quel est l'offset de la dernière commande.

Redémarrer le MASTER

shell>/usr/local/mysql/bin/mysqld --user=root &


Reset le MASTER Dans le cas où log-bin été déjà activé il faut vider les fichiers binaires pour ne pas créer d'inchohérences (plus loin il y aura une autre solution si vous ne souhaitez pas faire cette manipulation).

RESET MASTER;


Débloquer l'accès en écriture des tables du côté MASTER
L'accès aux bases en écriture peut être rétabli vu qu'auparavantle snapshot des bases le RESET ont été faits. Le but pour le SLAVE sera donc de répliquer toutes les nouvelles commandes qui modifieront les bases. Ces modifications sont répercutées dans les fichiers de log binaire

mysql> UNLOCK TABLES;


Copier les bases sur le SLAVE
En se placant dans le répertoire des bases de données du SLAVE taper la commande suivante :

shell> tar -xvf ./mysql-snapshot.tar

A ce stade le slave possède les mêmes bases que le MASTER moins les dernières modifications qui sont décrites dans les fichiers de logs binaires. C'est ces modifications que le SLAVE devra rattraper pour avoir les bases équivalentes au MASTER.

Modification du my.cnf côté SLAVE
Plusieurs champs devront être spécifiés pour que même si le serveur SLAVE plante a son redémarrage il puisse reprendre un fonctionnement normal sans aucune commandes à taper.
Les modifications sont à faire dans la section [mysql] :

server-id = <number>
master-host = <master_name>
master-user = <user_name>
master-password = <password>
master-port = <port>

<number> : est une valeur comprise entre 1 et 2^32 - 1 différent de l'id d'un autre serveur.
<master_name> : adresse du serveur maître
<user_name> : utilisateur créé plus tot avec son mot de passe associé <password>
<port> : port utilisé par MySQL

Ajoutez replicate-wild-do-table = databasename.% : pour uniquement dupliquer la base databasename et % == toutes les tables

A noter que si l'on veut mettre en place un second SLAVE à partir du meme snapshot des bases, il suffit de le configurer comme ci dessu, pas besoin de modifier autre chose : le nouvel esclave reprendra toutes les modifications qui auront été recensées dans les fichiers de logs binaires (ce qui peut parfois être long).

Lancer les threads SLAVE

mysql> START SLAVE;

Faire des tests
Modifier les bases du serveur MASTER et vérifier que du côté client les modifications ont été répercutées.




Méthodes si vous ne souhaitez pas faire de RESET MASTER :
Au lieu de faire le RESET MASTER, il faut faire un SHOW MASTER STATUS et récupérer les informations d'offset et de log-bin. Puis apres avoir modifié le fichier my.cnf du SLAVE il suffit de taper la commande suivante :

mysql> CHANGE MASTER TO MASTER_LOG_FILE='<recorded log file name>', MASTER_LOG_POS=<recorded log offset>;


<recorded log file name> : est l'information log-bin récupéré plus haut.
<recorded log offset> : est l'informatiopn d'offset récupéré plus haut.

Le reste de la procédure reste identique.

Personal tools