[Summer Camp] Etape 3.1 – MySQL Réplication

8 October 2011 | par | tuto, unix

Oct
08

mysql-repl

C’est plus trop l’été mais bon… On va le faire perdurer ici ! On a donc les frontaux… sur lesquels on a monté les partages de fichiers statiques. Mon PHP est bien fonctionnel… mais j’ai pas encore de bases pour stocker ma donnée.

Contrairement à ce que j’ai annoncé, nous n’allons pas utiliser un MySQL Cluster. Ce choix est justifié par la spécificité de MySQL Cluster qui demande un développement spécifique. En effet, le moteur de base est différent et n’est que très rarement supporté par des CMS ou même des développement spécifique. à la place, je vous propose de faire un Split Read/Write via MySQL Proxy. Il s’agit donc de répartir la lecture sur plusieurs bases (répliqués entre elles) mais de faire les insertions que sur une seule. Typiquement on écrit sur un serveur et on lit sur l’autre.

On attaque donc cette partie qui nous amènera un peu plus près de la fin du projet. Aujourd’hui on va faire de la réplication MySQL.

Prérequis

Nous allons donc utiliser dans ce tuto 2 machines sous Debian 6 :

  • 4vCPU
  • 1024Mo de RAM
  • Un disque (j’utilise des VMDK) 8Go pour le système
  • 1 carte réseau sur le VLAN Backend
  • Prévoir un disque supplémentaire de XGo en fonction du besoin

Installation des serveurs MySQL :

On attaque donc avec le premier serveur MySQL SQL01 (le maitre). Vous allez voir c’est très simple, on fait l’installation via le gestionnaire de paquets dont on met à jour la liste des paquets au préalable :

root@OAF-PRJ-SQL01:~# aptitude update
root@OAF-PRJ-SQL01:~# install mysql-server

Durant l’installation, je gestionnaire demande le mot de passe root de la base de données.

On réitère la même chose sur le SQL02 (l’esclave).

On sécurise un minimum le tout avant de poursuivre grâce à la commande suivante dont on répondra au question :

root@OAF-PRJ-SQL01:~# mysql_secure_installation

On a donc notre base de travail.

Mise en réplication des bases :

Avant de mettre en place la réplication nous allons insérer une base factice qui nous servira pour les tests. Pour cela, sur le server SQL01, nous allons importer la base de test MySQL Sakila (http://dev.mysql.com/doc/sakila/en/sakila.html). Il s’agit d’une base fournies à des fins de test proposée par MySQL. Allons y, nous importons donc d’abord la structure, puis la donnée :

root@OAF-PRJ-SQL01:~# wget "http://downloads.mysql.com/docs/sakila-db.tar.gz"
root@OAF-PRJ-SQL01:~# tar xzf sakila-db.tar.gz
root@OAF-PRJ-SQL01:~# cd sakila-db/
root@OAF-PRJ-SQL01:~/sakila-db# mysql -p < sakila-schema.sql
root@OAF-PRJ-SQL01:~/sakila-db# mysql -p < sakila-data.sql

Nous pouvons donc maintenant mettre en place la réplication avec un support de test. Le mécanisme est simple : nous allons activer quelques options nécessaire au bon fonctionnement sur le master et le slave. Puis nous créerons un compte dédié à la réplication avec des droits spécifique. Pour finir, nous mettrons en place la réplication sur le slave.

Préparons donc la réplication en définissant un ID unique pour chaque serveur et en activant les log binaires sur la master. Ces log permettrons de transmettre les requêtes. Il faut éditer /etc/mysql/my.cnf et modifier les directives suivante dans la rubrique [mysqld] sur SQL01 :

root@OAF-PRJ-SQL01:~# vim /etc/mysql/my.cnf 
 
[mysqld]
.
.
.
bind-address            = 0.0.0.0
.
.
.
server_id               = 1
log-bin
binlog-format           = mixed
.
.
.

Puis sur SQL02 :

root@OAF-PRJ-SQL01:~# vim /etc/mysql/my.cnf 
 
[mysqld]
.
.
.
bind-address            = 0.0.0.0
.
.
.
server_id               = 2

Ne pas oublier de restarter le service MySQL sur SQL01 et SQL02.

Il faut maintenant créer le compte de réplication sur le master :

mysql> CREATE USER 'repl'@'%.mydomain.com' IDENTIFIED BY 'slavepasswordofroxxor';
Query OK, 0 ROWS affected (0.00 sec)
 
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%' IDENTIFIED BY 'slavepasswordofroxxor';
Query OK, 0 ROWS affected (0.00 sec)

Avant de finir, on execute un dump un peu spécial qui aura pour but de synchroniser les deux bases au niveau de la lecture des logs binaire (ceux qui permettent de rejouer les requêtes), puis on l’envoie sur le slave.

root@OAF-PRJ-SQL02:~# mysqldump -p --master-data sakila > dump.sql
root@OAF-PRJ-SQL02:~# scp dump.sql OAF-PRJ-SQL02:/root

Le compte est donc crée et le dump pret à importer. L’étape suivante est donc la configuration de la réplication sur le slave. Pour cela on commence à ajouter le hostname du slave dans le fichier host :

root@OAF-PRJ-SQL02:~# echo "192.168.20.11      OAF-SRV-SQL02" >> /etc/hosts

Puis on importe le dump du master :

root@OAF-PRJ-SQL02:~# mysql -p < dump.sql

Puis on configure le slave sur la base MySQL et on le lance ! :

mysql> CHANGE MASTER TO
    -> MASTER_HOST='OAF-SRV-SQL02',
    -> MASTER_USER='repl',
    -> MASTER_PASSWORD='slavepasswordofroxxor',
    -> MASTER_PORT=3306,
    -> MASTER_CONNECT_RETRY=10;
Query OK, 0 ROWS affected (0.02 sec)
mysql> slave START;

pour finir on test le bon fonctionnement de la réplication. Pour cela, on vérifie que la commande qui suit retourne bien “Yes” pour les variable Slave_IO_Running et Slave_SQL_Running :

mysql> SHOW slave STATUS \G;
*************************** 1. ROW ***************************
               Slave_IO_State: Waiting FOR master TO send event
                  Master_Host: OAF-PRJ-SQL01
                  Master_User: repl
                  Master_Port: 3306
                Connect_Retry: 10
              Master_Log_File: mysqld-bin.000018
          Read_Master_Log_Pos: 247
               Relay_Log_File: mysqld-relay-bin.000033
                Relay_Log_Pos: 393
        Relay_Master_Log_File: mysqld-bin.000018
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB:
          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: 247
              Relay_Log_Space: 593
              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)

Et voilà ! Parfait ! La prochaine étape, c’est le MySQL proxy, dans le prochain billet ;)

A lire aussi :

  1. [Summer Camp] Infra Web Haute Disponibilité
  2. [Summer Camp] Etape 2 – Serveur de Fichiers NFS + ZFS
  3. [Summer Camp] Étape 1 – Frontaux Web (Nginx + PHP5)
  4. HowTo Puppet : Administration et industrialisation de masse

Rédigé par

IT pro et passionné d'UNIX âgé de 22 ans, je cherche à partager quelques points de vu et mon savoir faire. N'hésitez pas à laisser un commentaire ou votre avis, ça enrichira le débat !

2 réponses to “[Summer Camp] Etape 3.1 – MySQL Réplication”

Afficher / Masquer les commentaires
  1. guigui says:

    Dans la config, y’a une erreur je pense :

    mysql> CHANGE MASTER TO
    -> MASTER_HOST=’OAF-SRV-SQL02′,
    -> MASTER_USER=’repl’,
    -> MASTER_PASSWORD=’slavepasswordofroxxor’,
    -> MASTER_PORT=3306,
    -> MASTER_CONNECT_RETRY=10;
    Query OK, 0 ROWS affected (0.02 sec)
    mysql> slave START;

    master host c’est OAF-SRV-SQL01

Laisser un commentaire