Vous êtes sur la page 1sur 15

Mettre en place un cluster de base de donnes avec MariaDB, Galera Cluster et HaProxy sous Debian

Quest-ce que MariaDB?


Suite au rachat de MySQL par Sun Microsystems et des annonces du rachat de Sun
Microsystems par Oracle Corporation, Michael Widenius, fondateur de MySQL, quitte cette
socit pour lancer le projet MariaDB, dans une dmarche visant remplacer MySQL tout en
assurant linteroprabilit. Le nom vient de la 2e fille de Monty Widenius, Maria (la premire
sappelant My).

MariaDB est un systme de gestion de base de donnes dit sous licence GPL. Il sagit dun
fork communautaire de MySQL : la gouvernance du projet est assure par la
fondation MariaDB, et sa maintenance par la socit Monty Program AB, crateur du projet.
Cette gouvernance confre au logiciel lassurance de rester libre. MariaDB est en plein essor
depuis ces deux dernires annes, Wikipdia annonce, fin 2012, la migration de MySQL
MariaDB. Les distributions Linux, comme Fedora, CentOS ou OpenSuse, abandonnent elles
aussi MySQL. En septembre 2013 Google annonce ladoption de MariaDB en lieu et place de
MySQL.

Et Galera Cluster?
Galera Cluster est une solution cluster multi-matre synchrone pour MariaDB. Il est
disponible uniquement sous Linux. Cest solution permet de mettre en place avec un
minimum de trois serveurs un cluster de base de donnes auto-rpliquant et hautement
disponible. Pour faire simple, les trois serveurs de bases de donnes sont actifs et les
utilisateurs peuvent crire sur nimporte quel serveur, les donnes sont alors rpliques entre
les serveurs restant. Si un serveur devient injoignable, les deux autres serveurs sont toujours
disponibles afin dassurer la disponibilit des services. Galera Cluster est support par
MariaDB (Galera Cluster se trouve dailleurs dans les dpts de MariaDB). Une solution
commerciale Percona XtraDB Cluster utilise le moteur de rplication de Galera Cluster.

Voici la topologie que nous allons mettre en place


Topologie

Afin de mettre en place cette topologie nous allons commencer par mettre en place deux
serveur HaProxy.

Mise en place des machines virtuelles pour Haproxy et Galera Cluster

Important!

Dans Virtualbox, le rseau en 192.168.2.XXX est mon rseau local (mode pont) et pour
le rseau en 10.1.0.XXX la configuration de la carte est en mode Rseau interne.

Les serveurs sont configurs de la faon suivante:

Serveurs de rpartition de charge


hostname: lb1db
eth0: 10.1.0.41

hostname: lb2db
eth0: 10.1.0.42

Serveurs de bases de donnes


hostname: db1
eth0: 10.1.0.51

hostname: db2
eth0: 10.1.0.52
hostname: db3
eth0: 10.1.0.53

Commenons par mettre en place les deux serveur HaProxy

Important!

Attention les commandes suivantes sont faire dur les deux serveur

Installation de HaProxy
echo "deb http://ftp.debian.org/debian/ wheezy-backports main" >>
/etc/apt/sources.list
apt-get update
apt-get install haproxy

Une fois linstallation termine, nous devons diter la valeur ENABLED=0 ENABLED=1
dans les fichiers /etc/default/haproxy et /etc/init.d/haproxy.

Vouc pouvez le faire avec les commandes suivantes:

sed -i "s/ENABLED=0/ENABLED=1/g" /etc/default/haproxy


sed -i "s/ENABLED=0/ENABLED=1/g" /etc/init.d/haproxy

Configuration de HaProxy
La configuration de HaProxy est assez simple et se fait dans un seul fichier de configuration,
ce fichier se trouve dans /etc/haproxy/haproxy.cfg.

global
log /dev/log local0
log /dev/log local1 notice
chroot /var/lib/haproxy
user haproxy
group haproxy
daemon

defaults
log global
mode http
option dontlognull
contimeout 5000
clitimeout 50000
srvtimeout 50000
errorfile 400 /etc/haproxy/errors/400.http
errorfile 403 /etc/haproxy/errors/403.http
errorfile 408 /etc/haproxy/errors/408.http
errorfile 500 /etc/haproxy/errors/500.http
errorfile 502 /etc/haproxy/errors/502.http
errorfile 503 /etc/haproxy/errors/503.http
errorfile 504 /etc/haproxy/errors/504.http
#Configuration de l'ip balancs
listen cluster_db 10.1.0.40:3306
#Mysql
mode tcp

#Mode de balancement Round Robin


balance roundrobin

#Les serveurs mysql


server db1 10.1.0.51:3306 check
server db2 10.1.0.52:3306 check
server db3 10.1.0.53:3306 check

#Stats
listen stats 10.1.0.40:80
stats enable
stats hide-version
stats refresh 30s
stats show-node
stats auth admin:admin
stats uri /stats

Je vais analyser ce fichier de configuration:


listen cluster_db 10.1.0.40:3306: Cette directive nous permet de spcifier sur quelle adresse
IP HaProxy va fonctionner, nous allons accder aux bases de donnes depuis lIP 10.1.0.40.
mode tcp: permet de spcifier que le balancement de charge est utilis pour du contenu TCP
(http pour du contenu web).
balance roundrobin: permet de spcifier lalgorithme de rpartition de charge.

Enfin stats, permet de configurer la page de statistiques de HaProxy, dans cette


configuration,la page de statistiques sera disponibles via ladresse suivante
http://10.1.0.40/stats avec les identifiants admin/admin.

Pour ma part jai rajout une rgle dans le script de firewall des LB web afin de pouvoir
accder aux stats depuis adresse IP balanc Web.

#Stats pour les LB Mysql


iptables -t nat -A PREROUTING -p tcp -d 192.168.2.100 --dport 8080 -j DNAT
--to-destination 10.1.0.40:80

Je peux donc accder aux stats de Haproxy avec ladresse:


http://192.168.2.100:8080/stats

Maintenant, comme sur les serveur LB Web, il faut installer Heartbeat, afin de mettre en
place ladresse IP de balancement des bases de donnes que nous avons configurs dans
HaProxy.

Installation de HeartBeat
Important!

Les prochaines manipulation sont faire dur les deux serveurs


apt-get install heartbeat
Une fois HeartBeat install nous allons devoir crer trois fichiers dans le dossier /etc/ha.d/
ha.cf : Pour la configuration gnrale de HeartBeatv
haresources : Pour la configuration des ressources
authkeys : Pour la clef partag entre les serveurs du cluster

Voici le contenu du fichier ha.cf

mcast eth0 239.0.0.11 694 1 0

warntime 4
deadtime 5
initdead 15
keepalive 2

#Re-balance les services sur le lb primaire quand il revient en ligne


auto_failback on

#Serveurs du cluster
node lb1db
node lb2db

Important!

Attention! Pour que tout fonctionne bien il faut sassurer que vous puissiez ping lb2db depuis
lb1db et vice-versa.
Pensez donc rajouter les deux lignes suivantes sur le fichier /etc/hosts sur vos deux lb:

##LBDB
10.1.0.41 lb1db
10.1.0.42 lb2db

Nous allons maintenant crer le contenu du fichier haresources

lb1db IPaddr::10.1.0.40/24/eth0 haproxy

Explications:
lb1db = lb primaire du cluster
IPaddr::10.1.0.40/24/eth0 = Adresse IP balance pour HaProxy
haproxy = service que HeartBeat va dmarrer

Et pour finir nous allons crer le fichier authkeys. Ce fichier contient un clef partag entre les
deux serveurs. Cela peut tre un mot de passe, ou un simple mot.
Voici le mien:

auth 3
3 md5 cluster-db-key

Ce fichier la doit avoir les permissions 600. Donc sur les deux serveurs tapez:

chmod 600 /etc/ha.d/authkeys


Enfin nous allons dsactiver le dmarrage automatique de HaProxy sur les deux serveurs:

insserv -r haproxy

Finalisation du balancement
Sur les deux serveur arrtez HaProxy:

/etc/init.d/haproxy stop

Puis sur lb1db dmarrez HeartBeat

/etc/init.d/heartbeat start

Attendez quelques secondes et tapez la commande ifconfig:

root@lb1db:~# ifconfig
eth0 Link encap:Ethernet HWaddr 08:00:27:35:e5:19
inet addr:10.1.0.41 Bcast:10.1.0.255 Mask:255.255.255.0
inet6 addr: fe80::a00:27ff:fe35:e519/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:2234 errors:0 dropped:0 overruns:0 frame:0
TX packets:3670 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:292562 (285.7 KiB) TX bytes:692754 (676.5 KiB)

eth0:0 Link encap:Ethernet HWaddr 08:00:27:35:e5:19


inet addr:10.1.0.40 Bcast:10.1.0.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1

Vous voyez que lIP 10.1.0.40 est configure sur lb1db

Maintenant, dmarrez heartbeat sur lb2db.

Le balancement entre les deux serveurs est maintenant pleinement fonctionnel.

Vous pouvez maintenant visualiser depuis lIP de balancement web les statisques de HaProxy
http://192.168.2.100:8080/stats, bien sur pou que cela fonctionne, il faut que au moins un
des serveur serveur LB configurs pour le balancement Web soit actif.

Test du balancement
Pour tester le balancement, il vous suffit darrter HeartBeat sur lb1db (ou le serveur) avec
la commande:

/etc/init.d/heartbeat stop

Patientez quelques secondes et faites un ifconfig sur lb2db et vous verrez que lIP balance
est maintenant sur ce serveur.

Relancer HeartBeat sur lb1db afin de remettre lIP sur celui-ci.


Maintenant que les serveur de rpartition de charge il est temps de mettre en place nos
trois serveurs de bases de donnes.

Installation de MariaDB et de Galera


Cluster.
Afin de mettre en place notre cluster de base de donnes MariaDB avec Galera Cluster, il
faut ajouter les dpt Debian ncessaire. Sur les trois serveurs de bases de donnes, faire les
manipulation suivantes:

apt-get install python-software-properties


apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 0xcbcb082a1bb943db
add-apt-repository 'deb http://mirror3.layerjet.com/mariadb/repo/5.5/debian
wheezy main'
apt-get update
DEBIAN_FRONTEND=noninteractive apt-get install -y rsync galera mariadb-
galera-server

Maintenant que MariaDb est install, il faut configurer Galera Cluster afin de mettre en
place la rplication entre les serveurs.

Nous allons donc diter le fichier de configuration de Galera se trouvant dans


/etc/mysql/conf.d/galera.cnf

Sur les trois serveurs, nous allons le configurer de la facon suivante:

[mysqld]
#mysql settings
binlog_format=ROW
default-storage-engine=innodb
innodb_autoinc_lock_mode=2
query_cache_size=0
query_cache_type=0
bind-address=0.0.0.0
#galera settings
wsrep_provider=/usr/lib/galera/libgalera_smm.so
wsrep_cluster_name="mon_cluster_dbr"
wsrep_cluster_address="gcomm://10.1.0.51,10.1.0.52,10.1.0.53"
wsrep_sst_method=rsync

La ligne la plus importante configure est la ligne:


wsrep_cluster_address= gcomm://10.1.0.51,10.1.0.52,10.1.0.53
Sur cette ligne il faut mettre les adresses IP de tous les serveurs de DB.

Une fois le fichier edit et sauvegard nous pouvons dmarrer le cluster :)

Mais tout dabord stopper mysql sur tous les serveurs de DB

service mysql stop

Sur le serveur db1 taper la commande suivante:


service mysql start --wsrep-new-cluster

Vous aurez en sortie ceci:

root@db1:~# service mysql start --wsrep-new-cluster


[ ok ] Starting MariaDB database server: mysqld . . ..
[info] Checking for corrupt, not cleanly closed and upgrade needing tables..

Une fois le cluster dmarr, faites la commande suivante sur db1:

root@db1:~# mysql -u root -e 'SELECT VARIABLE_VALUE as "cluster size" FROM


INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME="wsrep_cluster_size"'
+--------------+
| cluster size |
+--------------+
| 1 |
+--------------+

Comme vous le voyez, cette commande permet de savoir le nombre de serveur membre du
cluster.

Il est donc temps de dmarrer mysql sur les deux autres serveurs. Donc sur db2 et db3
faites la commande suivante: /etc/init.d/mysql start
Vous aurez ceci en sortie:

root@db2:~# /etc/init.d/mysql start


[ ok ] Starting MariaDB database server: mysqld . . . . . . . . ..
[info] Checking for corrupt, not cleanly closed and upgrade needing tables..
root@db2:~# ERROR 1045 (28000): Access denied for user 'debian-sys-
maint'@'localhost' (using password: YES)

Important!

Sous debian, vous aurez cett erreur: ERROR 1045 (28000): Access denied for user debian-
sys-maint@localhost (using password: YES)

Cest une erreur normal et nous allons la rgler bientt.

Donc une fois MySQL dmarrer sur db2 et db3, vous pouvez utliser la commande que nous
avons utilis plutt pour voir les serveur membres du cluster:

root@db1:~# mysql -u root -e 'SELECT VARIABLE_VALUE as "cluster size" FROM


INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME="wsrep_cluster_size"'
+--------------+
| cluster size |
+--------------+
| 3 |
+--------------+

Nous voyons bien 3 serveur donc notre cluster est oprationnel :)


Test de la rplication:
Afin de tester la rplication entre les serveurs, nous allons crer une base de donne
testreplication .

Sur nimporte quel serveur de base de donns (par exemple db2), je vais utiliser la commande
suivante afin de crer une base de donnes:

root@db2:~# mysql -e "create database testreplication"

Sur un autre serveur (db1 ou db3) vous pouvez utiliser la commande: mysql -e show
databases afin de vrifier que la base de donnes a bien t cre sur tous les serveurs.

root@db1:~# mysql -e "show databases"


+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| testreplication |
+--------------------+

A ce stade, nous avons un cluster de base de donnes pleinement fonctionnel.

Important!

Afin de rgler le problme : ERROR 1045 (28000): Access denied for user debian-sys-
maint@localhost (using password: YES) il suffit de copier le fichier /etc/mysql/debian.cnf
depuis db1 sur db2 et db3.

Test de la rpartition de charge


Maintenant, nous allons vrifier que la rpartition de charge fonctionne bien, nous allons
donc, depuis le serveur HaProxy actif (lbd1 normalement), nous connecter au serveur de bases
de donns via ladresse IP de balancement 10.1.0.40.

Sur lbd1, nous allons donc installer le client de MariaDB (si vous avez rajout ce cluster
dans le cluster web le mieux est dinstaller le client MySQL sur les serveurs webs).

Donc sur le serveur depuis lequel vous souhaitez vous connecer au cluster Galera tapez les
commandes suivantes:

apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 0xcbcb082a1bb943db


add-apt-repository 'deb http://mirror3.layerjet.com/mariadb/repo/5.5/debian
wheezy main'
apt-get update
apt-get install mariadb-client
Puis sur les trois serveurs de db nous allons configurs mysql afin de pouvoir se connecter
aux bases de donns a distance.

Donc sur les trois serveur de db, editez le fichier /etc/mysql/my.cnf, trouvez la ligne bind-
address = 127.0.0.1 et commentez la.

Arrtez MySQL sur les trois serveurs de DB et redmarrez le service en noubliant pas
dutiliser la commande service mysql start wsrep-new-cluster sur un des db afin
dinitialiser le cluster.

Puis a partir dun des serveurs de db, nous allons autoriser le rseau 10.1.0.0/24 se connecter
aux serveurs de base de donns avec la commande:

GRANT ALL PRIVILEGES ON *.* TO 'root'@'10.1.0.%' IDENTIFIED BY 'root' WITH


GRANT OPTION;

Ce qui nous donne:

root@db1:~# mysql
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 32
Server version: 5.5.39-MariaDB-1~wheezy-wsrep-log mariadb.org binary
distribution, wsrep_25.10.r4014

Copyright (c) 2000, 2014, Oracle, Monty Program Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> GRANT ALL PRIVILEGES ON *.* TO 'root'@'10.1.0.%'


IDENTIFIED BY 'root' WITH GRANT OPTION;
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> exit


Bye

A partir de la nous pouvons nous connecter notre cluster de base de donnes depuis
nimporte quel machine de notre cluster en utilisant le login root et le mot de passe root.

Donc sur le serveur depuis lequel vous souhaitez vous connecter a votre cluster de base de
donnes utilisez la commande suivante: mysql -u root -proot -h 10.1.0.40

ce qui donne (exemple depuis lbd1)

root@lb1db:~# mysql -u root -proot -h 10.1.0.40


Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 30
Server version: 5.5.39-MariaDB-1~wheezy-wsrep-log mariadb.org binary
distribution, wsrep_25.10.r4014

Copyright (c) 2000, 2014, Oracle, Monty Program Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> show databases;


+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| testreplication |
+--------------------+
4 rows in set (0.01 sec)

MariaDB [(none)]>

Mais comment savoir depuis quel serveur de base de donnes je suis connect?

Une simple commande suffit afin de savoir sur quel serveur de base de donnes nous nous
connections.

Sur le serveur depuis lequel vous vous connectez au cluster de base de donnes, utilisez la
commande suivante afin de savoir sur quel serveur la connexion se fait

mysql -u root -proot -h 10.1.0.40 -e "show variables where Variable_name


like '%hostname%';"

Ce qui me donne lorsque je me connecte depuis lbd1

root@lb1db:~# mysql -u root -proot -h 10.1.0.40 -e "show variables where


Variable_name like '%hostname%';"
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| hostname | db1 |
+---------------+-------+
root@lb1db:~# mysql -u root -proot -h 10.1.0.40 -e "show variables where
Variable_name like '%hostname%';"
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| hostname | db3 |
+---------------+-------+
root@lb1db:~# mysql -u root -proot -h 10.1.0.40 -e "show variables where
Variable_name like '%hostname%';"
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| hostname | db2 |
+---------------+-------+

Nous voyons donc bien que mode roundrobin fonctionne bien et que je me connecte
successivement sur un des serveurs de bases de donnes :)

Voila ce qui net fin cette srie de tutoriel sur la mise en place dun cluster web et de de base
de donnes de haute disponibilit, vous avez maintenant les clef en main afin de mettre en
place la topologie dcrite dans larticle Bientt.
1. Matth

15 mars 2017 11 h 46 min (UTC 2)

Rpondre

Super tuto, qui ma servi de base pour mon cluster cependant, suite aux nouvelles
version des softs il y a quelques petites adaptation faire dans la partie DB (pas HA)

le package est maintenant inclus dans mariadb-server (donc apt-get install mariadb-
server)
et pour lancer le cluster cest maintenant galera_new_cluster

mais encore merci pour le tuto, excellent !

2.

max

10 janvier 2017 16 h 44 min (UTC 2)

Rpondre

Bonjour,

Jai un souci avec votre tuto qui me semble bien fait.

Jarrive a crer une base de donne qui est bien rpliqu sur les autres serveurs myslq,
par contre, lorsque je fais un insert dans une table de la bdd cre, la donne nest pas
rplique sur les autres serveurs MySQL
bizarre
si vous avez dj eu le cas, pouvez-vous svpn maider.

merci.

1.

max

11 janvier 2017 17 h 59 min (UTC 2)

Rpondre

personne na le mme souci??

1.
david

30 janvier 2017 22 h 23 min (UTC 2)

Rpondre

Salut,

vrifie que tes tables utilise bien le moteur innodb et non pas du
myisam (https://mariadb.com/kb/en/mariadb/mariadb-galera-cluster-
known-limitations/)

3.

Kyslos

21 dcembre 2016 7 h 16 min (UTC 2)

Rpondre

Merci pout le tuto.

Petite question, tu parle de rseau priv, tu configure les VM avec 2 cartes rseaux ?
La premire sur une IP qui permet daccder en SSH et la seconde sur le rseau priv
pour la conf du LB ?

4.

abdel

25 octobre 2016 21 h 04 min (UTC 2)

Rpondre

cest lIP du haproxy qui apparait dans les logs mysql (cf show processlist).
Cest naZ

5.

CopyPasteSucks

24 juin 2016 15 h 06 min (UTC 2)

Rpondre

Pour info,
http://blog.dylanleborgne.ovh/?p=114

6.

Williams

16 juin 2016 14 h 41 min (UTC 2)

Rpondre

Salut Denis,

merci pour ton super tuto.

Jai par contre un problme aprs avoir setup le heartbeat, lorsque je fais un ifconfig,
jai pas eth0:0 et lip associ (chez moi, jai dclar lip 10.10.10.225)

En te remerciant pour ta rponse.

Williams

1.

Williams

16 juin 2016 16 h 38 min (UTC 2)

Rpondre

Rectification, jai trouv le problme, et, jai bien la NIC virtuelle pour lIP de
heartbeat qui est UP.
Par contre, sur mon 2ime serveur HAProxy, cette NIC est active en mme
temps que sur le 1ier HAProxy

Cest trs bizarre

7.

imars

3 janvier 2016 23 h 07 min (UTC 2)

Rpondre

Merci super tuto encore une fois, mais du coup je ne vois pas ou mettre ce tutoriel
avec les prcdents par rapport aux serveur Web (Apache, PHP) et ceux avec
MariaDB avec les serveurs avec HaProxy / HeartBeat.
Il y aurait dans ce cas 4 serveurs HaProxy pour les serveurs Apache et MariaDB ?

1.

Denis

8 janvier 2016 0 h 00 min (UTC 2) Lier vers ce commentaire

Rpondre

Tu peux nutiliser que deux serveurs Haproxy pour Apache et MariaDB cest
sur que em mettre 4 cest un peut overkill.

8.

Alex

22 avril 2015 12 h 10 min (UTC 2)

Rpondre

Merci trs bon boulot.