Nous avons vu précédement comment mettre un place un Cluster Apache actif/passif avec DRBD et HeartBeat. Dans ce tutoriel nous allons voir comment faire la même chose mais avec MySQL.
La configuration de DRBD et de Heartbeat est la même que pour le tutoriel précédent.
Voilà ce que nous allons mettre en place
Donc pour faire ce tutoriel suivez le tutoriel suivant jusqu’a « Installation d’apache« :
Heartbeat est un logiciel de surveillance de la disponibilité des programmes, pour les systèmes d’exploitation Linux, FreeBSD, OpenBSD, Solaris et MacOS X. Il est distribué sous licence GPL.
Heartbeat écoute les battements de cœur – des signaux émis par les services d’une grappe de serveurs lorsqu’ils sont opérationnels. Lorsque qu’un serveur devient défaillant, Heartbeat le detecte (puisqu’il n’entend plus ses battements de coeurs) et bascule les services surveillés sur un autre serveur. Pour que cela soit transparent pour les utilisateurs, Heartbeat met en place une IP virtuelle unique qui est balancée entre les deux serveurs.
Voici ce que nous allons mettre en place
Mise en place de la solution
Pour ce tuto, nous allons partir du Cluster DRBD que nous avons mis en place dans le tutoriel précédent:
DRBD pour Distributed Replicated Block Device est comparable à un RAID 1 mais en réseau, c’est à dire que deux disques, partitions ou même un LVM peuvent être repliqué d’un disque à un autre via un réseau ethernet ou fibre optique. Cela permet donc d’assurer la disponibilité de vos données en cas de crash complet d’une machine. Ce que ne permet pas de faire un RAID classique.
Pour ce tuto nous allons donc utiliser deux machines virtuelles sous Debian 6.
on injecte la base: [maitre]# mysql -u root -pMDP votre_bdd.sql > votre_bdd.sql
Maintenant, on va activer la réplication de la base MySql du serveur maître sur l’esclave: sur le serveur maître: tout d’abord on va se connecter sur la base
[maitre]# mysql -u root -pMDP
Puis on bloque la base en lecture seule mysql>: FLUSH TABLES WITH READ LOCK;
On repère la position de la base:
mysql > SHOW MASTER STATUS;
------------------ ---------- -------------- --------------------------
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
------------------ ---------- -------------- --------------------------
| mysql-bin.000003 | 73 | test,bar | foo,manual,mysql |
------------------ ---------- -------------- --------------------------
1 row in set (0.06 sec)
et on note: mysql-bin.000003 ← le log bin à utiliser 73 ← la position du log évidemment à adapter suivant le cas.
sur le serveur esclave: on se connecte aussi à la base mysql [esclave]# mysql -u root -pMDP
on stoppe la réplication en cours mysql>stop slave;
on fait une RAZ de la réplication mysql>reset slave;
On va positionner le serveur esclave comme le maître: mysql> CHANGE MASTER TO MASTER_HOST = 'IP', MASTER_USER = 'repli', MASTER_PASSWORD = 'repli', MASTER_LOG_FILE = 'mysql-bin.000003', MASTER_LOG_POS = 73;
on démarre la réplication mysql> start slave;
on vérifie qu’on n’a pas d’erreur
mysql> show slave statusG*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 10.94.8.58
Master_User: repli
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000003
Read_Master_Log_Pos: 73
Relay_Log_File: GLPI_esclave-relay-bin.000024
Relay_Log_Pos: 660186
Relay_Master_Log_File: mysql-bin.000003
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
******
Last_Errno: 0
Last_Error:
******
Seconds_Behind_Master: 0
1 row in set (0.00 sec)
on se déconnecte de mysql mysql>exit;
sur le serveur maitre on déverrouille l’écriture sur la base mysql> UNLOCK TABLES;
on se déconnecte de mysql mysql>exit;
et pour finir on lance le script de lancement automatique des services heartbeat/mon/http/myslq:
[maitre]#./startHA
sur le serveur maitre c’est le même script sauf le service Mon en moins: [esclave]#./startHA
on vérifie que l’IP virtuel est actif sur le serveur maitre:
[maitre]#ifconfig
eth0:0 Link encap:Ethernet HWaddr 00:22:19:D7:73:48
inet adr:10.94.8.56 Bcast:10.94.15.255 Masque:255.255.248.0
UP BROADCAST RUNNING MULTICAST MTU:1492 Metric:1
Interruption:16
et dans le navigateur firefox, on fait un test de connection:
http://appliweb.com
SI TABLE CRASHED :
d’après le log, on repère la table dite crashed
connexion à mysql : #mysql -u root -pMDP ;
on sélectionne la base mysql>use votre_bdd ;
on répare la table mysql>repair table nomdelatable ;
Master / Slave replication in MySQL is a great way to store an exact replica of your database on another machine in another location as part of a disaster recovery plan. Before setting up Master / Slave replication there are a few things to remember.
Writes – Writes to the master database should make it to the slave. But writes to the slave will not make it to the master. If you do write records to the slave database directly, be prepared to have to either recreate the records or back them up separately and recover them if the replication breaks. Many times the only way to get the databases to replicate again is to backup the master and recover it over the top of the slave deleting anything that was in the slave database before.
Broken Replication – Writes made directly to the slave can cause the replication to break due to duplicate key rows, etc.. Always write to the master.
Reads – Reads should be possible from either server. Many organizations will use replication so as to create another database to read from thereby taking the load of all of their select statements and reports off the master server.
Master Slave MySQL Replication
Steps to Setup MySQL Master / Slave Replication
Prerequisites
We will be assuming that the following prerequisites are done prior to beginning the steps listed below:
MySQL has been installed on both the master and the slave servers
The slave server is able to communicate directly to the mysqld port (typically 3306) on the master server, meaning that there is no firewall, routing, NAT or other problems preventing communication.
You have an administrator MySQL user that can create users on both the master and the slave machines.
You have permissions to edit the /etc/my.cnf files on both machines and enough privileges to restart mysql.