Le but de cet article est d’avoir 2 serveurs MySQL synchronisés. Par la suite, je mettrais en place un système de sauvegarde à froid du serveur Slave, on pourra donc laisser notre serveur principal tourné H24, sans interruption de service.
Pré requis :
- 2 serveurs MySQL 😉
J’utilise dans cet article 2 serveurs qui tournent sous Ubuntu 9.10. Le premier qui sera le serveur principal a pour IP 192.168.224.129 et le second utilise l’adresse 192.168.224.130. Toutes les commandes effectuées dans cet article se font avec l’utilisateur root.
On commence par configurer le serveur maître, pour cela on édite le fichier ‘my.cnf’.
vi /etc/mysql/my.cnf |
Il faut décommenter cette partie dans le fichier, c’était entre les lignes 90/95 chez moi :
server-id=1 log-bin = /var/log/mysql/mysql-bin.log binlog-do-db=syncdb #nom de la db à synchroniser |
Il faut penser aussi à modifier la ligne :
bind-address = 0.0.0.0 |
Une fois ces modifications apportées, il faut redémarrer le service MySQL.
/etc/init.d/mysql restart |
Ensuite, on se connecte au serveur MySQL pour ajouter un utilisateur pour la synchronisation.
mysql -u root -p |
STOP SLAVE; GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%' IDENTIFIED BY 'slavepass'; FLUSH PRIVILEGES; CREATE DATABASE syncdb; USE syncdb; FLUSH TABLES WITH READ LOCK; SHOW MASTER STATUS; |
On passe maintenant à la configuration du second serveur, celui qui aura le rôle de « slave ». On va donc éditer le fichier ‘my.cnf’.
vi /etc/mysql/my.cnf |
Entre la ligne 90/95, on modifie ou on ajoute les informations suivantes :
server-id = 2 master-host = 192.168.224.129 master-user = slave master-password = slavepass master-connect-retry = 60 replicate-do-db = syncdb |
On redémarre le service MySQL :
/etc/init.d/mysql restart |
On se connecte à la console MySQL :
mysql -u root -p |
STOP SLAVE; CREATE DATABASE syncdb; CHANGE MASTER TO MASTER_HOST='192.168.224.129', MASTER_USER='slave', MASTER_PASSWORD='slavepass', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=106; START SLAVE; quit; |
mysql> SHOW SLAVE STATUS\G; *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.224.129 Master_User: slave Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000003 Read_Master_Log_Pos: 106 Relay_Log_File: mysqld-relay-bin.000006 Relay_Log_Pos: 251 Relay_Master_Log_File: mysql-bin.000003 Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_Do_DB: syncdb Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0 Last_Error: Skip_Counter: 0 Exec_Master_Log_Pos: 106 Relay_Log_Space: 407 Until_Condition: None Until_Log_File: Until_Log_Pos: 0 Master_SSL_Allowed: No Master_SSL_CA_File: Master_SSL_CA_Path: Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_Key: Seconds_Behind_Master: 0 Master_SSL_Verify_Server_Cert: No Last_IO_Errno: 0 Last_IO_Error: Last_SQL_Errno: 0 Last_SQL_Error: 1 row in set (0,00 sec) |
On peut voir que tout est ok ;).
On peut tester maintenant, on va créer un table sur le ‘Master’.
mysql> create table test( id int); Query OK, 0 rows affected (0,07 sec) mysql> show tables; +------------------+ | Tables_in_syncdb | +------------------+ | test | +------------------+ 1 row in set (0,00 sec) |
On peut va vérifier si notre table est présente sur le ‘Slave’ :
mysql> use syncdb; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed mysql> show tables; +------------------+ | Tables_in_syncdb | +------------------+ | test | +------------------+ 1 row in set (0,00 sec) |
Notre table est bien présente sur notre serveur ‘Slave’. On peut donc dire que l’objectif est atteint 😀