• Ce blog — désormais archivé — est en lecture seule.

Réplication MySQL maître-esclave

Bonjour, je laisse ici une petite note d’un système de secours que j’ai mis en place récemment : la réplication de bases de données MySQL. Il y a beaucoup d’autres articles sur le sujet donc je ne m’y étendrai pas, seul petite différence, j’ai fait la réplication d’une base de prod vers un autre serveur de prod utilisé pour tout à fait autre chose (ie. contenant d’autres bases). C’est l’essentiel de mon article d’aujourd’hui. Je remercie Nicolas Vogel de m’avoir mis sur le bon chemin :-)

La réplication en place me permet de sauvegarder les données contenues de manière instantanée. Si un crash est détecté au niveau du serveur de prod, d’une part il y a fort à parier que, peu voire aucune donnée n’aura été perdue (l’application est déployée sur un serveur unique), et d’autre part, je pourrais lancer un système de secours sur le serveur « esclave« .

Voilà ce qu’il y avait à lire : http://dev.mysql.com/doc/refman/5.0/fr/replication-howto.html

Et pour résumer :

On commence par la partie Maître, c’est-à-dire le serveur de prod numéro 1. On modifie le fichier de configuration /etc/mysql/my.cnf de la manière suivante (on veillera à relancer le service mysql) :

[mysqld]
bind-address  = IP serveur maître
server-id     = 1
log_bin       = /var/log/mysql/mysql-bin.log
# Dans mon cas, c'est la ligne suivante qui spécifie quelle base répliquer
binlog_do_db  = databaseName



Une fois ceci fait on crée un utilisateur « replicateur » pour le deuxième serveur (l’esclave) :

GRANT REPLICATION SLAVE ON *.* TO replicateur@'%' IDENTIFIED BY 'replicateur';

On va devoir s’assurer qu’aucune nouvelle donnée ne soit enregistrée pendant un petit laps de temps. Cette partie est critique puisque il s’agit de bloquer l’écriture sur la base que l’on souhaite répliquer.

FLUSH TABLES WITH READ LOCK;

Il nous faut deux informations que l’on retrouve avec la commande ci-après : la position et le nom du fichier binaire.

SHOW MASTER STATUS;

Pour finir, on fait un dump de la base (mysqldump) et on l’envoie sur le serveur esclave (scp). C’est tout pour le serveur maître, on y reviendra à la fin pour le déverrouiller en écriture.

Au niveau du second serveur, les manip’ sont semblables. On commence par modifier le fichier de conf /etc/mysql/my.cnf puis on redémarre le service mysql.

[mysqld]
server-id       = 2
master-host    = IP serveur maître
master-user     = replicateur
master-password = replicateur
master-port     = 3306
# Je rappelle ici la base à répliquer
replicate-do-db = databaseName

On va ensuite se servir des deux infos relevées plus haut en exécutant la commande :

CHANGE MASTER TO
MASTER_LOG_FILE='FILENAME',
MASTER_LOG_POS=POSITION;

Puis on démarre le process maître/esclave depuis l’esclave :

START SLAVE;

Soit ça marche, soit ça ne marche pas… Par exemple, pour 1 warning détecté, on devra reprendre les paramètres de conf dans une requête de la forme :

CHANGE MASTER TO
MASTER_HOST=IP serveur maître,
MASTER_USER=replicateur,
....;

A partir de là, la replication est prête. Seulement il faut effectuer le rattrapage sur le serveur esclave. La réplication est démarrée mais notre deuxième serveur n’est qu’un esclave qui ne peut recréer la base et se mettre à niveau du maître. Vous comprenez ? Non, tant pis, je recommence. C’est le maître qui donne les ordres donc comme on vient de commencer notre process maître/esclave, le maître ne sait pas que la base de l’esclave est vide. Voilà pour la petite histoire et pourquoi un dump était utile. Il suffit maintenant d’insérer le dump transféré au début.

On retourne sur le serveur maître et on enlève le verrou d’écriture :

UNLOCK TABLES;

La réplication est en place. On peut tester l’ajout d’une ligne dans une table pour voir si la réplication fonctionne parfaitement. Dorénavant, tout changement de la base maître (structures, données) sera répercuté sur la base esclave.

A noter qu’un peu de sécurité ne fait pas de mal. On veillera à créer une liaison très restreinte entre les deux serveurs sur le port 3306, port par défaut de MySQL.

  • Print
  • Digg
  • StumbleUpon
  • del.icio.us
  • Facebook
  • Twitter
  • Google Bookmarks
  • FriendFeed
  • LinkedIn
  • MySpace
  • Netvibes
  • PDF
  • Ping.fm
  • RSS
  • Technorati
  • viadeo FR
  • Wikio
  • Yahoo! Buzz

Related Posts

Cet article a été publié dans Boulot, Serveur, Sysadmin avec les mots-clefs : , , , . Bookmarker le permalien. Les commentaires et les trackbacks sont fermés.

2 commentaires

  1. Le 20 août 2010 à 17 h 09 min | Permalien

    Ahah, je savais que tu avais des tendances S/M !!!

    Merci pour l’article, ton howto va me servir sous peu ;)

    • Le 20 août 2010 à 17 h 15 min | Permalien

      Erf…démasqué :-D
      C’est plus une note qu’un véritable How to mais si tu passes au #wai dans la semaine pro, je pourrais éventuellement te prêter main forte :-)

Un trackback

  1. [...] Ce billet était mentionné sur Twitter par William DURAND, Christophe hagnere. Christophe hagnere a dit: RT @couac: Je la refais : nouvelle note sur la réplication MySQL maitre-esclave http://bit.ly/bPmUuM [...]