« MySQL/Réplication » : différence entre les versions
Aucun résumé des modifications |
|||
Ligne 29 : | Ligne 29 : | ||
Dans <code>/etc/mysql/my.cnf</code>, section <code>[mysqld]</code> : |
Dans <code>/etc/mysql/my.cnf</code>, section <code>[mysqld]</code> : |
||
* Définir un identifiant de serveur ; par exemple <code>1</code> : |
* Définir un identifiant de serveur ; par exemple <code>1</code> : |
||
<source lang=bash> |
|||
server-id = 1 |
server-id = 1 |
||
</source> |
|||
* La réplication est basée sur les logs binaires, donc les activer : |
* La réplication est basée sur les logs binaires, donc les activer : |
||
<source lang=bash> |
|||
log-bin |
log-bin |
||
# ou log-bin = /var/log/mysql/mysql-bin.log |
# ou log-bin = /var/log/mysql/mysql-bin.log |
||
</source> |
|||
Créer un nouvel utilisateur pour que le slave puisse se connecter : |
Créer un nouvel utilisateur pour que le slave puisse se connecter : |
||
Ligne 50 : | Ligne 54 : | ||
Dans <code>/etc/mysql/my.cnf</code>, section <code>[mysqld]</code> : |
Dans <code>/etc/mysql/my.cnf</code>, section <code>[mysqld]</code> : |
||
* Définir un identifiant de serveur différent du master et des autres slaves : |
* Définir un identifiant de serveur différent du master et des autres slaves : |
||
<source lang=bash> |
|||
server-id = 2 |
server-id = 2 |
||
</source> |
|||
* Vérifier avec : |
* Vérifier avec : |
||
<source lang=sql> |
<source lang=sql> |
||
Ligne 56 : | Ligne 62 : | ||
</source> |
</source> |
||
* Il est aussi possible de déclarer le nom de la machine slave dans le master (cf. <code>SHOW SLAVE HOSTS</code>) : |
* Il est aussi possible de déclarer le nom de la machine slave dans le master (cf. <code>SHOW SLAVE HOSTS</code>) : |
||
<source lang=bash> |
|||
report-host=slave1 |
report-host=slave1 |
||
</source> |
|||
Déclarer le master : |
Déclarer le master : |
||
<source lang=sql> |
<source lang=sql> |
||
Ligne 85 : | Ligne 92 : | ||
</source> |
</source> |
||
Exemple : |
Exemple : |
||
<source lang= |
<source lang=sql> |
||
*************************** 1. row *************************** |
*************************** 1. row *************************** |
||
Slave_IO_State: |
Slave_IO_State: |
||
Ligne 94 : | Ligne 101 : | ||
</source> |
</source> |
||
Vérifier en particulier : |
Vérifier en particulier : |
||
<source lang= |
<source lang=sql> |
||
Slave_IO_Running: Yes |
Slave_IO_Running: Yes |
||
Slave_SQL_Running: Yes |
Slave_SQL_Running: Yes |
||
</source> |
</source> |
||
On peut supposer une nature réplication asynchrone : |
On peut supposer une nature réplication asynchrone : |
||
<source lang= |
<source lang=sql> |
||
Seconds_Behind_Master: 0 |
Seconds_Behind_Master: 0 |
||
</source> |
</source> |
||
Voir aussi : |
Voir aussi : |
||
<source lang= |
<source lang=sql> |
||
mysql> SHOW GLOBAL VARIABLES LIKE "%SLAVE%"; |
mysql> SHOW GLOBAL VARIABLES LIKE "%SLAVE%"; |
||
</source> |
</source> |
||
Ligne 109 : | Ligne 116 : | ||
==== Sur le master ==== |
==== Sur le master ==== |
||
Vérifier les connexions des slaves : |
Vérifier les connexions des slaves : |
||
<source lang= |
<source lang=sql> |
||
mysql> SHOW PROCESSLIST\G |
mysql> SHOW PROCESSLIST\G |
||
[...] |
[...] |
||
Ligne 144 : | Ligne 151 : | ||
Dans ce cas, regarder la trace dans le log (généralement <code>/var/log/syslog</code>) : |
Dans ce cas, regarder la trace dans le log (généralement <code>/var/log/syslog</code>) : |
||
<source lang= |
<source lang=sql> |
||
Oct 15 21:11:19 builder mysqld[4266]: 101015 21:11:19 [ERROR] Slave: Error 'Table 'mybase.form' |
Oct 15 21:11:19 builder mysqld[4266]: 101015 21:11:19 [ERROR] Slave: Error 'Table 'mybase.form' |
||
doesn't exist' on query. Default database: 'mybase'. Query: |
doesn't exist' on query. Default database: 'mybase'. Query: |
||
Ligne 168 : | Ligne 175 : | ||
Pour supprimer une réplication : |
Pour supprimer une réplication : |
||
<source lang= |
<source lang=sql> |
||
mysql> RESET SLAVE; |
mysql> RESET SLAVE; |
||
</source> |
</source> |
||
Ligne 175 : | Ligne 182 : | ||
Attention : <code>STOP SLAVE</code> arrêt la réplication. Elle peut être relancée manuellement ensuite, ou bien automatiquement lors de la relance du serveur MySQL. Pour éviter ce lancement automatique : |
Attention : <code>STOP SLAVE</code> arrêt la réplication. Elle peut être relancée manuellement ensuite, ou bien automatiquement lors de la relance du serveur MySQL. Pour éviter ce lancement automatique : |
||
<source lang= |
<source lang=sql> |
||
slave-skip-start |
slave-skip-start |
||
</source> |
</source> |
||
Pour arrêter d'utiliser la réplication, vérifier que la configuration est bien vide : |
Pour arrêter d'utiliser la réplication, vérifier que la configuration est bien vide : |
||
<source lang= |
<source lang=sql> |
||
mysql> SHOW SLAVE STATUS; |
mysql> SHOW SLAVE STATUS; |
||
Empty set (0.00 sec) |
Empty set (0.00 sec) |
Version du 12 août 2013 à 00:43
Principe
La réplication signifie que les données écrites sur le master MySQL sont envoyées à des slaves faisant office de copies.
Applications :
- sauvegardes
- accès en lecture de la même base depuis plusieurs serveurs : augmentation des performances
- failover
Il y a deux types de réplication :
- Asynchrone (master/slave)
- Semi-asynchrone (réplication asynchrone plus avec un slave avant de terminer la requête)
Configurations des réplications :
- standard : master->slave
- double maître : master<->master
En Master-Master les deux hôtes sont tour à tour master et slave : le serveur A se réplique sur le serveur B qui se réplique sur le serveur A.
Il n'y a pas de vérification de consistance des données, même si auto_increment_increment/auto_increment_offset
est configuré les deux serveurs ne doivent pas être utilisés pour des accès concurrents.
Réplication asynchrone
C'est le cas le plus simple, un master écrit un fichier de log binaire, et les slaves peuvent lire ce dernier (potentiellement sélectivement) pour rejouer les commandes de la requête.
Étant asynchrone, le master et les slaves peuvent avoir différents états au même moment. Cette configuration peut résister aux coupures réseau.
Configuration du master
Dans /etc/mysql/my.cnf
, section [mysqld]
:
- Définir un identifiant de serveur ; par exemple
1
:
server-id = 1
- La réplication est basée sur les logs binaires, donc les activer :
log-bin
# ou log-bin = /var/log/mysql/mysql-bin.log
Créer un nouvel utilisateur pour que le slave puisse se connecter :
CREATE USER 'myreplication';
SET PASSWORD FOR 'myreplication' = PASSWORD('mypass');
GRANT REPLICATION SLAVE ON *.* to 'myreplication';
Vérifier l'identifiant de serveur :
SHOW VARIABLES LIKE 'server_id';
Configuration de chaque slave
Dans /etc/mysql/my.cnf
, section [mysqld]
:
- Définir un identifiant de serveur différent du master et des autres slaves :
server-id = 2
- Vérifier avec :
SHOW VARIABLES LIKE 'server_id';
- Il est aussi possible de déclarer le nom de la machine slave dans le master (cf.
SHOW SLAVE HOSTS
) :
report-host=slave1
Déclarer le master :
CHANGE MASTER TO MASTER_HOST='master_addr', MASTER_USER='myreplication', MASTER_PASSWORD='mypass';
Si la réplication sert de backup, spécifier le point de départ :
MASTER_LOG_FILE='<binary_log_from_master>', MASTER_LOG_POS=<master_binary_log_position>;
Démarrer la réplication :
START SLAVE;
Cela va créer un fichier master.info
, typiquement dans /var/lib/mysql/master.info
; contenant la configuration et le statut.
Vérifier la réplication
Sur le slave
SHOW SLAVE STATUS;
Ou bien pour avoir un résultat formaté plus lisible :
SHOW SLAVE STATUS\G
Exemple :
*************************** 1. row ***************************
Slave_IO_State:
Master_Host: master_addr
Master_User: myreplication
Master_Port: 3306
...
Vérifier en particulier :
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
On peut supposer une nature réplication asynchrone :
Seconds_Behind_Master: 0
Voir aussi :
mysql> SHOW GLOBAL VARIABLES LIKE "%SLAVE%";
Sur le master
Vérifier les connexions des slaves :
mysql> SHOW PROCESSLIST\G
[...]
*************************** 6. row ***************************
Id: 14485
User: myreplication
Host: 10.1.0.106:33744
db: NULL
Command: Binlog Dump
Time: 31272
State: Has sent all binlog to slave; waiting for binlog to be updated
Info: NULL
If you enabled <code>report-host</code>, the slave is also visible in:
mysql> SHOW SLAVE HOSTS;
+-----------+---------+------+-------------------+-----------+
| Server_id | Host | Port | Rpl_recovery_rank | Master_id |
+-----------+---------+------+-------------------+-----------+
| 2 | myslave | 3306 | 0 | 1 |
+-----------+---------+------+-------------------+-----------+
1 row in set (0.00 sec)
Consistance
La réplication est une simple copie, similaire aux sorties mysqldump
dans le client mysql
.
par conséquent, pour maintenir cette consistance :
- Ne pas écrire sur le slave ;
- Démarrer la réplication avec des données initiales identiques sur le master et le slave ;
- Utiliser les mêmes versions de MySQL sur eux peut aider.
Réparer
Par défaut, la réplication stoppe en cas d'erreur (provenant du réseau ou d'une requête).
Dans ce cas, regarder la trace dans le log (généralement /var/log/syslog
) :
Oct 15 21:11:19 builder mysqld[4266]: 101015 21:11:19 [ERROR] Slave: Error 'Table 'mybase.form'
doesn't exist' on query. Default database: 'mybase'. Query:
'INSERT INTO `form` (`form_id`,`timestamp`,`user_id`) VALUES ('abed',1287172429,0)',
Error_code: 1146
La meilleure façon et de relancer la réplication entièrement.
On peut aussi tenter de réparer, par exemple faire sauter à MySQL la commande 1
:
STOP SLAVE;
SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;
START SLAVE;
Attention en définissant ce nombre car il contient toutes les commandes, pas seulement les erreurs.
Une autre façon est d'utiliser les outils Maatkit :
- mk-slave-restart (pour relancer la réplication du slave si
SQL_SLAVE_SKIP_COUNTER
ne peut pas aider) - mk-table-checksum (pour faire un checksum des tables sur le master et le slave)
- mk-table-sync (pour synchroniser le slave avec le master basé sur des statistiques générés par
mk-table-checksum
).
Désinstaller
Pour supprimer une réplication :
mysql> RESET SLAVE;
- MySQL me le slave en pause et remplace la configuration avec les valeurs par défaut.
master.info
est effacé. - Relancer MySQL pour effacer toute la configuration.
Attention : STOP SLAVE
arrêt la réplication. Elle peut être relancée manuellement ensuite, ou bien automatiquement lors de la relance du serveur MySQL. Pour éviter ce lancement automatique :
slave-skip-start
Pour arrêter d'utiliser la réplication, vérifier que la configuration est bien vide :
mysql> SHOW SLAVE STATUS;
Empty set (0.00 sec)