La réplication avec MySQL 3.23.x


1-Introduction

La réplication a vu le jour avec MySQL version 3.23.15. Un serveur peut jouer le rôle de master alors que les autres serveurs sont esclaves de ce dernier (slaves). Le serveur maitre conserve un log binaire des mises à jour (binary log) et un fichier d'index pour les logs binaires (cf documentation concernant les fichiers de logs d'un serveur MySQL).

2- Généralités sur l'implémentation de la réplication

La réplication sous MySQL est entièrement basée sur la conservation de toutes les modifications effectuées sur une base de données (instructions update, delete etc...) dans le log binary du serveur maître (master), modifications qui seront lues par les serveurs esclaves (slaves) et exécutées.

Tous les serveurs esclaves mis en place nécessiteront des copies de toutes les données du serveur master existantes avant le démarrage du log binaire sur le serveur master. Si les serveurs esclaves démarrent avec des données qui ne correspondent pas à celles existant lorsque le log binaire a été mis en place sur le serveur master, les serveurs esclaves peuvent se retrouver en situation d'échec.

Une future version de MySQL (v 4.0) supprimera la nécesité de conserver une large photo des données pour les nouveaux serveurs esclaves. A l'heure actuelle il est encore nécessaire de bloquer toutes les écritures soit par un verrouillage global en lecture ou bien en arrêtant le serveur master durant la prise de la photo des données.

Une fois qu'un serveur esclave est configuré et en cours d'exécution, ce dernier se connecte au serveur master et attend des misesà jour à traiter. Si le serveur master tombe ou bien que le serveur esclace perd la connexion avec le serveur master, ce dernier serveur esclave tentera de se connecter selon un intervalle en secondes donné par le paramètre master-connect-retry jusqu'à ce que la reconnexion soit établie.

Chaque serveur esclave conserve la trace des dernières mises à jour traitées. En revanche le serveur master n'a aucune connaissance du nombre de serveurs esclaves ou combien de serveurs esclaves sont en cours sur le binary log du serveur master à un moment donné.

3- Mise en place de la réplication

Dans cet exemple, toutes les bases de données sont répliquées et la réplication n'a pas encore été configurée. Il est nécessaire dans un premier temps d'arrêt le serveur maître pour réaliser les étapes ci-dessous :

- S'assurer dans un premier temps que la version de MySQL est supérieure à la version 3.23.29.

- Créer un user destiné à la réplication sur le serveur master avec le privilège FILE et la permission de se connecter à partir de tous les serveurs esclaves. Si ce user est uniquement destiné à la réplication, aucun privilège additionnel n'est nécessaire. Par exemple, créer le user repl qui peut accéder au serveur master à partir de n'importe quel host :

GRANT FILE ON *.* TO repl@"%" IDENTIFIED BY '<password>';

- Arrêter le serveur MySQL Master :

mysqladmin -u root -p<password> shutdown

- Effectuer une photographie des données sur le serveur master. La méthode la plus simple consiste à utiliser la commande tar pour produire une archive de tout le répertoire data :

tar -cvf /tmp/mysql-snapshot.tar /path/data-dir

- Dans le fichier my.cnf du serveur master, ajouter les options log-bin et server-id=unique number dans le section [mysqld]. L'identifiant du serveur esclave doit être différent de l'identifiant du serveur master.

[mysqld]
       log-bin
       server-id=1

- Redémarrer le serveur MySQL

- Dans les fichiers my.cnf des serveurs esclaves, ajouter les données ci-dessous :

master-host=<hostname du master>
master-user=<user de la replication>
master-password=<mot de passe du user de la replication>
master-port=<port TCP/IP du serveur master>
server-id=<identifiant unique compris entre 2 et 2^32-1>

Chaque identifiant doit être unique pour server-id dans le système de réplication. Si le paramètre server-id n'est pas spécifié, il vaudra 1 si master-host n'est pas défini, sinon il vaudra 2. Dans le cas de l'omission de server-id, le serveur master refuse les connections à partir des serveurs esclaves et le serveur esclave refuse de se connecter au serveur master.

- Copier la photo des données dans les répertoires de données des serveurs esclaves en s'assurant des privilèges sur les fichiers et les répertoires.

- Démarrer en dernier lieu les serveurs esclaves.

Les serveurs esclaves se connectent par la suite au serveur master et prennent en compte les mises à jour effectuées depuis que la photographie a été prise.

Si le paramètre server-id a été omis, l'erreur ci-dessous est reportée dans le fichier de log des erreurs :

Warning: one should set server_id to a non-0 value if master_host is set.
The server will not act as a slave.

Tous les messages d'erreur sont reportés dans le log d'erreur du serveur esclave si le serveur esclave ne peut se connecter pour diverses raisons.

Lors de la mise en place de la réplication sur un serveur esclave, le fichier master.info est créé dans le même répertoire que le fichier de log des erreurs. Le fichier master.info est utilisé par le serveur esclave pour le traitement du log binaire du serveur master. Ne pas tenter de supprimer ou éditer ce fichier, la commande change master to est prévue à cet effet.

4- Commandes SQL pour la réplication

La réplication peut être gérée dans une interface SQL.

4-1- Commandes SQL pour le serveur esclave

4-1-1- Démarrage et arrêt du thread slave (SLAVE START, SLAVE STOP)

Démarrage du thread slave :

SLAVE START

Arrêt du thread slave :

SLAVE STOP

4-1-2- Statut du thread slave (SHOW SLAVE STATUS)

La commande SHOW SLAVE STATUS affiche le statut concernant le thread esclave.

4-1-3- Réinitialiser le thread dans la lecture des logs binaires (RESET SLAVE)

Il est possible de faire perdre au thread slave sa position dans le log binaire du serveur master avec la commande RESET SLAVE.

Anciennement, dans les versions antérieures à la version 3.23.26, la commande FLUSH SLAVE correspondait à la commande RESET SLAVE actuelle.

4-1-4- Suppression de lectures d'évènements dans le log binaire du serveur master

Avec la commande SET SQL_SLAVE_SKIP_COUNTER=n, il est possible d'empêcher la lecture de n évènements sur le log binaire du serveur master. Toutefois, le thread slave doit être arrêté, sinon une erreur est reportée.

4-1-5- Copie d'une table du serveur Master vers le serveur esclave (LOAD TABLE ... FROM)

Il est possible d'effectuer une copie d'une table du serveur master dans le serveur esclave avec la commande LOAD TABLE :

LOAD TABLE tbl_name FROM MASTER

4-1-6- Changement des paramètres du serveur master (CHANGE MASTER TO...)

La commande CHANGER MASTER TO master_def_list permet de changer les paramètres du serveur master et de redémarrer le thread slave avec ces modifications. master_def_list est une liste de paramètres séparés par des virgules, paramètres qui sont :

Exemple :

CHANGE MASTER TO
    MASTER_HOST='master2 ',
    MASTER_USER='replication',
    MASTER_PASSWORD='pwd_replication',
    MASTER_PORT=3306,
    MASTER_LOG_FILE='master2-bin.001',
    MASTER_LOG_POS=4;

Il est nécessaire de spécifier que les paramètres qui sont modifiés. Les valeurs resteront les mêmes si des paramètres sont omis, à l'exception d'un changement du host ou du port. Dans ce cas, le slave suppose que puisque le host ou le port diffère, le serveur master est différent, aussi les anciennes valeurs concernant le log ne sont plus appliquables et sont automatiquement initialisées à 0 ou à vide.

Si le thread slave, l'ancien master est alors pris en compte, ce qui n'est pas souhaitable, aussi il est nécessaire de supprimer le fichier master.info avant de redémarrer le thread slave.

4-2- Commandes SQL pour le serveur master

4-2-1- Activation et désactivation de l'écriture du log binaire du serveur master (SQL_LOG_BIN)

Si le user en a le privilège, il est possible de désactiver ou activer l'écriture du log binaire :

SET SQL_LOG_BIN = 0 (désactivation)

SET SQL_LOG_BIN = 1 (activation)

4-2-2- Suppression des logs binaires dans le fichier d'index (RESET MASTER)

La commande RESET MASTER supprime tous les log binaires dans le fichier d'index. Dans les versions antérieures à la version 3.23.26, la commande FLUSH MASTER était destiné à cet usage.

4-2-3- Listing des logs binaires du serveur master (SHOW MASTER LOGS)

La commande SHOW MASTER LOGS disponible depuis la version 3.23.28 permet de lister les logs binaires sur le serveur master, cette commande doit être invoquée avant la commande PURGE MASTER LOGS TO pour déterminer jusqu'ou aller dans la purge des logs binaires.

4-2-4- Information sur le statut dans les logs binaires du serveur master

La commande SHOW MASTER STATUS permet d'obtenir des informations concernant le log binaire du serveur master.

4-3- Suppression de logs binaires sur le serveur master (PURGE MASTER LOGS TO ...)

Depuis la version 3.23.28, la suppression des logs listés dans le fichier d'index avant un log spécifique peut simplement être réalisé avec la commande PURGE MASTER LOGS TO 'logname'.

Cette commande supprime tous les logs binaires antérieurs au log binaire spécifié ainsi que les entrées dans le fichier d'index pour ces derniers. Une erreur survient si un thread esclave est en lecture sur un log que la commande tente de supprimer. Il est impératif de vérifier avec la commande SHOW SLAVE STATUS sur quels logs binaires les threads esclaves sont positionnés, puis d'effectuer un listing des logs binaire avec la commande SHOW MASTER LOGS pour déterminer les logs binaires les plus anciens qu'il est sur et certain de supprimer en toute sécurité.

5- Options dans les fichiers *.cnf liées à la réplication

La version 3.23.30 est au minimum recommandée pour la mise en place de la réplication avec MySQL.

5-1- Options dans le fichier *.cnf pour le serveur master

Dans le tableau ci-dessous sont répertoriées les options pour le serveur master :

Paramètre Description
log-bin=filename Ecrit un log binaire dans le chemin spécifié
log-bin-index=filename L'utilisateur peut lancer la commande FLUSH LOGS, et il est donc nécessaire de savoir quel est log couramment actif et lesquels sont obsolètes. Cette information est donnée dans le fichier d'index des logs binaires ('hostname'.index). Ce dernier fichier peut être renommé avec l'option log-bin-index
sql-bin-update-same Si cette option est appliquée, la valeur appliquée pour SQL_LOG_BIN sera automatiquement appliquée à SQL_LOG_UPDATE.
binlog-do-db=database_name Cette option permet de désigner sur quelle base de données du serveur master les mises à jour sont consignées dans le log binaire. Toutes les autres bases de données sont ignorées.
binlog-ignore-db=database_name Cette option permet d'indiquer quelle base de données doit être ignorée pour l'écriture dans le log binaire.

5-2- Options dans le fichier *.cnf pour le serveur slave

Dans le tableau ci-dessous sont répertoriées les options pour le serveur slave :

Paramètre Description
master-host=host Nom du host ou adresse IP du serveur master. Si ce paramètre n'est pas appliqué, le thread ne peut démarrer.
master-user=username User que le thread slave utilise pour se connecter au serveur master. Ce user doit avoir le privilège FILE. Si ce user n'est pas créé, le user test est pris par défaut.
master-password=password Mot de passe du user utilisé par le thread slave pour se connecter au serveur master.
master-port=portnumber Port d'écouter du serveur master. Si ce paramètre n'est pas appliqué, MYSQL_PORT est pris en compte.
master-connect-retry=seconds Le nombre en secondes au bout duquel le slave thread réiterera ses tentatives de connexions après un échec de connexion vers le serveur master.
master-info-file=filename Localisation du fichier qui stocke le dernier point d'arrêt dans le process de réplication. Par défaut ce dernier est nomenclature master.info.
replicate-do-table=db_name.table_name Permet d'indiquer au thread slave de restreindre la réplication à une table spécifique. Pour spécifier plusieurs tables, inscrire cette option plusieurs fois pour chaque table
replicate-ignore-table=db_name.table_name Permet d'indiquer au thread slave d'ignorer certaines tables dans le système de réplication. Pour spécifier plusieurs tables, inscrire cette options plusieurs fois pour chaque table
replicate-wild-do-table=db_name.table_name Permet d'indiquer au thread slave de restreindre la réplication aux tables respectant les critères données. Exemple : replicate-wild-do-table=db%.tb_%. La réplication ne s'appliquera que pour les tables dont le nom commence par tb_ et pour les bases de données dont le nom commence par db_.
replicate-wild-ignore-table=db_name.table_name Permet d'indiquer au thread slave d'ignorer dans la réplication les tables respectant les critères données. Exemple : replicate-wild-ignore-table=db%.tb_%. La réplication ne s'appliquera pas pour les tables dont le nom commence par tb_ et pour les bases de données dont le nom commence par db_.
replicate-ignore-db=database_name Permet de spécifier au thread slave d'ignorer une base de données pour la réplication. Pour spécifier plus d'une base de données, inscrire cette option pour chaque base de données à ignorer
replicate-do-db=database_name Permet de spécifier au thread slave de restreindre la réplication à une base de données. Pour spécifier plus d'une base de données, inscrire cette option pour chaque base de données.
log-slave-updates Permet d'indiquer au thread slave d'écrire dans le log binaire les mises à jour. Par défaut cette option est appliquée à off.
replicate-rewrite-db=from_name-> to_name Cette option permet d'effectuer une mise à jour d'une base de données du serveur master vers une autre base de données du serveur esclave portant un nom différent
slave-skip-errors=err_code1,err_code2 Disponible seulement depuis la version 3.23.47. Cette option permet d'indiquer au thread slave de poursuivre la réplication lorsque la requête renvoie une erreur. Normalement, la réplication s'arrête à la première erreur rencontrée. Utiliser la commande SHOW SLAVE STATUS pour de plus amples informations. Tous les codes erreur sont recensés dans le fichier /docs/mysqld_error.txt. Exemple : slave-skip-errors=1062,1053 | all
skip-slave-start Permet d'indiquer au serveur esclave de ne pas démarrer le thread slave au démarrage. L'utilisateur démarre ce dernier avec la commande SLAVE START
slave_read_timeout=# Nombre de secondes que le thread slave doit attendre les données du serveur master avant d'aborter la lecture

Annexe

Historique

Version Date Commentaires
1.0 08/2002 Version initiale

Liens

MySQL Books OnLine 3.23, 4.0, 4.1 : Replication