Synchronisation de deux serveurs MySQL.
Par Thierry NARDOUX le samedi 27 août 2005, 20:48 - Informatique - Les bons plans - Lien permanent
Suite au très bon article de mon collègue rédacteur, Xavier, et sa traduction en Français d'un document sur les bases de la sécurisation de MySQL, je tenais à expliquer concrètement la sécurisation d'un serveur MySQL par la mise en place d'un serveur de backup, synchronisé automatiquement sur le serveur principal ....
La mise en place d'un tel système est enfantine (pour qui maitrise un petit peu l'outil informatique), rapide (un 1/4 d'heure à 1/2 heure), ne nécessite que peu de matériel (peut se faire sur la même machine ou sur deux serveurs distincts pour plus de sécurité) et aura pour conséquence de vous rassurer énormément sur la pérennité de vos données en cas de défaillances de votre matériel ...
Pour mettre en oeuvre cette synchronisation de bases MySQL, nous allons partir sur l'option que j'ai moi-même choisie, à savoir deux serveurs distincts pour plus de sécurité, le tout fonctionnant sur le schéma classique maitre/esclave
.
Vous n'avez pas besoin d'un monstre de puissance pour ce serveur esclave, car il n'est pas destiné à délivrer des données à vos visiteurs mais simplement faire un backup continuel de vos bases. Vous pouvez donc ré-utiliser un ancien PC qui traine et qui ne vous sert plus
Pour commencer nous allons partir sur l'hypothèse que vous avez déjà un serveur MySQL en activité avec un certain nombre de bases, contenant elles-mêmes des tables qui hébergent vos précieuses données. Nous considérons qu'il s'agit d'une installation classique, à savoir répondant aux requêtes sur le port 3306 de votre couche TCP/IP.
Nous prenons également l'hypothèse que vous tournez sous Windows, bien que les manipulations soient strictement identiques sous les OS Unix-Like
, seuls les emplacements des fichiers de configuration étant différents.
La première chose que je vous conseille est de télécharger l'utilitaire nommé MySQL Administrator, qui est un outil puissant, vous permettant de régler et optimiser votre serveur. Bien que non indispensable, cet utilitaire vous permettra de vérifier, à la fin de la procédure, que toutes vos bases/tables sont synchrones.
Il s'agit toujours d'un outil gratuit, que vous trouverez sur cette page de MySQL. Vous trouverez d'autres outils (pas nécessaires pour nos manipulations) sur cette page.
D'autre part, il est fortement recommandé d'utiliser les mêmes versions du serveur MySQL sur la machine maitre
et sur la machine esclave
. Malgré tout, si vous êtes dans l'impossiblité de conserver le même numéro de version entre les deux serveurs, il existe un tableau de compatibilité qui vous permettra de connaitre s'il est possible de procéder à cette réplication avec les versions dont vous disposez.
* Configuration du maitre :
- Arrêtez votre serveur MySQL. Attention! Pas votre ordinateur, mais le service MySQL. Vous pouvez soit passer par le Gestionnaire de Services dans les outils d'administration soit taper, dans une invite de commandes, la commande suivante :
net stop mysql
. - La seule chose à faire pour le rendre maitre est de procéder à des modifications ou/et ajouts dans son fichier de configuration. Ce fichier se nomme généralement
my.ini
oumy.cnf
et se trouve, dans l'idéal dans votre dossier d'installation Windows (Ex:c:\windows
), ou à la racine de votre disque système (Ex :c:
) ou (moins recommandé) dans le dossier d'installation de MySQL (Ex :C:\MySQL
ouD:\MySQL
). Si vous avez installé vous-même votre serveur, vous devez savoir où se trouve ce fichier :P
Il va donc falloir maintenant rajouter/modifier les lignes suivantes :
server-id = 2
(Cela permet de numéroter les serveurs, la numérotation commençant à 2 dixit la documentation MySQL)
show-slave-auth-info
(Cela permet de vérifier qu'il s'agit de votre serveur esclave qui se synchronise sur le maitre et non pas un serveur pirate ...)
slave_compressed_protocol
(Cela permet la compression des données lors de la synchronisation, afin de limiter le trafic réseau et surtout permettre une mise à jour plus rapide de l'esclave)
D'autres options sont disponibles, telles que l'enregistrement de l'activité dans un fichier log, mais je ne l'ai pas activée car cela est consommateur de ressources et peu utile dans notre cas de figure ...
- Toujours par le Gestionnaire de services, démarrez votre service MySQL ou par une invite de commandes, en tapant
net start mysql
- Vérifiez le fonctionnement de votre serveur en faisant tourner les applications qui utilisent les bases de données de votre serveur.
* Installation et configuration de l'esclave :
- Procédez à l'installation du logiciel serveur MySQL sur votre deuxième PC. Prenez soin de simplifier au mieux l'installation en choisissant exacetement les mêmes options que lors de l'installation du premier serveur, notamment sur le type de bases utilisées (MyIsam ou InnoDB) et le même type de codage de caractères (Latin-1 ou UTF-8). Pour ma part, mes deux serveurs (maitre et esclave) sont installés sont installés sur D:\MySQL, avec le moteur de BDD MyIsam par défaut et un codage en UTF-8 pour supporter tous les caractères existants dans tous les langages.
- Comme pour le serveur maitre, arrêtez le service MySQL par le gestionnaire de services ou par une invite de commandes.
- Repérez votre fichier de configuration (
my.ini
oumy.cnf
) et procédez aux modifications/ajouts suivants :
server-id =3
(Incrémenter le numéro de serveur afin de le différencier du serveur maitre)
master-host = www.thierrynardoux.com
(indiquer le nom NetBios complet de votre serveur maitre; dans mon cas il s'agit de www.thierrynardoux.com)
master-user = root
(indiquer l'utilisateur root, seul capable d'accéder à toutes les bases afin de procéder à la synchro)
master-password = Mot_de_passe
(indiquer le mot de passe de l'utilisateur root du serveur maitre)
master-port = 3306
(Facultatif ! Si votre serveur maitre répond aux requêtes sur le port 3306, il est inutile de renseigner cette ligne. Si toutefois, il répond sur un port autre (tel que 3307) il faut donc l'indiquer ici).
replicate-do-db=bdd_blog
(Indiquer ici, le nom exact des bases du serveur maitre à répliquer; dans notre exemple, nous allons répliquer 5 bases)
replicate-do-db=bdd_phpbb
replicate-do-db=bdd_phpwebgallery
replicate-do-db=bdd_faq
replicate-do-db=t_nardoux
A ce sujet, ne jamais répliquer la base nommé mysql
! Il n'est pas recommandé non plus de répliquer les bases nommées test
et phpmyadmin
(si celle-ci existe)
show-slave-auth-info
(Idem que pour le maitre)
slave_compressed_protocol
(Idem que pour le maître)
- Par le gestionnaire de services ou par une invite de commandes, comme pour le serveur maître, re-démarrez le service MySQL
Voilà, la configuration du serveur esclave est prête. Il ne nous reste plus qu'à créer les bases esclaves, lancer la synchronisation et vérifier que tout fonctionne correctement.
* Création des bases esclaves :
- Par une Invite de Commandes, se positionner dans le dossier
bin
de votre installation MySQL esclave. Dans mon cas, le chemin estD:\MYSQL\bin>
Puis taper les commandes suivantes, à adapter bien sur en fonction du nom de vos bases, nous continuons sur mon exemple avec les mêmes noms que ceux que nous avons indiqués dans le fichier de configuration de l'esclave :
mysql --user=root --password=mot_de_passe_root_de_l_esclave
Vous arrivez au prompt suivant :
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 8 to server version: 4.1.13-nt-max
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql>
Nous allons maintenant créer les bases esclaves avec un nom __strictement_ identiques à celles du serveurs que nous voulons répliquer :
CREATE DATABASE bdd_blog;
(Attention ! Ne pas oublier le point-virgule en fin de ligne qui sert à valider votre commande ... En cas d'oubli vous pouvez le taper directement sur la ligne suivante.)
CREATE DATABASE bdd_phpbb;
CREATE DATABASE bdd_phpwebgallery;
CREATE DATABASE bdd_faq;
CREATE DATABASE t_nardoux;
Nous allons ensuite procéder au chargement des bases du maitre vers l'esclave (chargement des données à un instant T):
LOAD DATA FROM MASTER;
Pour finir nous allons lancer le processus esclave :
START SLAVE;
(Cela va comparer les données entre le maitre et l'esclave et mettre à jour l'esclave. Ce processus, une fois lancé, n'a pas besoin d'être relancé par la suite; il est inutile de le relancer au re-démarrage du PC ...)
Attendons quelques instants, puis nous pouvons vérifier l'état de la synchronisation avec la commande suivante :
SHOW SLAVE STATUS;
Dans le foullis de données qui apparaissent à l'écran, vous devriez trouver le nom de vos bases synchronisées ainsi que la mention Waiting for master to send event | www.thierrynardoux.com
. Le www.thierrynardoux.com est bien sur à remplacer par le nom de votre serveur maitre
En début de billet, je parlais de MySQL Administrator ... Je ne rentre pas dans le détail de l'installation et de la configuration de cet outil avancé, mais je veux juste signaler que celui-ci permet de contrôler l'état de la réplication.
Il vous suffit de le lancer, de vous connecter sur votre serveur esclave, puis de vous rendre dans la section nommée Catalogs
. Vous devriez y trouver la liste de vos bases de données et en cliquant sur l'une d'elles, vous verrez dans la colonne Update Time
l'heure exacte à laquelle chacune des tables de la base concernée à été synchronisée.
Avec cela, vous vous rendrez vite compte que lorsqu'une modification est faite sur une des bases du serveur maître, celle-ci est pratiquement instantanément dupliquée sur le serveur esclave ...
Cela confirme donc qu'il s'agit d'un très bon moyen pour mettre ses données à l'abri en cas de défaillances du serveur maitre ...
A noter qu'après avoir effectué des tests, il s'avère qu'il ne parait pas nécessaire de créer les tables à la main :hein: En effet, j'ai lancé le processus de synchronisation décrit ci-dessous et celui-ci m'a automatiquement créé les bases ...
Pourtant, dans la documentation officielle, cette étape de création est mentionnée ...
Je pense, mais je me trompe peut-être, qu'il y a un rapport avec le jeu de caractères utilisé sur chacun des serveurs MySQL (par exemple, UTF-8 sur l'un et Latin-1 sur l'autre). La création manuelle doit créer la table avec le jeu de caractères par défaut du serveur esclave qui peut être différent du serveur maître dans des cas bien particuliers, alors que si l'on ne les créé pas à la main, les bases sont dupliquées tel quel ...
De toute façon, cela ne s'applique pas à notre exemple, car comme je l'ai dit au départ, nous sommes partis sur l'hypothèse que les deux serveurs MySQL sont de même version et configurés à l'identique. Seuls, les paramètres de réplication étant différents entre les deux serveurs.
* Conclusion :
Et voilà ! Vous disposez de deux serveurs MySQL, dont un maitre qui traite les données dee vos applications et un esclave qui contient une copie conforme à quelques secondes près du maitre.
Si votre serveur MySQL venait à rendre l'âme, il vous suffirait par la suite de modifier vos programmes, DSN, ou scripts PHP pour qu'ils pointent sur le serveur esclave et pour remettre en route rapidement votre infrastructure.
Bien sur, il est possible de compliquer énormément plus la chose ! Il est possible de ne synchroniser que certaines tables de certaines bases, par exemple, mais cela demanderait bien plus long que ce simple billet et n'entre pas dans le cadre de l'aspect de sécurisation que je voulais présenter ici, mon but étant de retrouver toutes les tables de toutes mes bases intactes sur un autre serveur en cas de défaillance dur premier
Il est également possible, mais un peu plus compliqué de créer vune réplication de bases sur la même machine sur laquelle tournerait deux instances de MySQL Server, avec, par exemple, la première sur le port 3306 et la deuxième sur le 3307. Mais en cas de défaillance matérielle ... vous perdez tout quand même :grr:
Rien ne vous empêche de sortir une vielle machine de vos placards ( un PIII 500 avec 64 Mo de RAM et un Windows 2000 Pro, voire NT 4.0 suffit ...) et de configurer votre serveur de secours
A vos claviers !
Thierry.
Commentaires
Je ne l'avais jamais tente mais voila qui est fait. Bon tuto, merci Thierry. Aucun probleme lors de la realisation. :chope:
Salut,
J'ai mis longtemps à le publier car j'ai vérifié et re-vérifié la procédure plusieurs fois avant, pour m'assurer que tout fonctionnait
J'ai toutefois commis une énorme boulette :cache: sur le billet original que deux gentils lecteurs (que je remercie encore au passage) m'ont signalé rapidement, ce qui m'a permis de corriger.
Et comme j'ai un peu honte ... je ne dirais pas de quoi il s'agit :P
Bye.
Enfin, ce n'etait pas trop grave car le service n"etait pas disponible du Net.
(J'avoue que j'ai testé :S )
Oui, je n'ai ouvert que le strict nécessaire, tu penses bien ...
De plus, même si le port était ouvert, les serveurs MySQL sont configurés pour ne répondre qu'à eux-mêmes et aucune autre IP ...
Et dans ta position, j'avoue que j'aurais fait ... la même chose
Bye et merci.
?... il s'agit là de réplication et non de synchronisation !!!
@LudoTools : oui on peut parler de réplication également ... Toutefois, les deux bases sont synchrones entre elles. C'est pas toujours facile de traduire des mots qui sont simples en anglais et qui deviennent complexes en français

Donc, admettons, .... on peut dire réplication
@+