«

»

Sep 15 2014

[Tuto]HA: Mettre en place un cluster de base de données avec MariaDB, Galera Cluster et HaProxy sous Debian 7

Bonjour à tous, dans ce dernier tutoriel nous allons voir comment mettre en place un cluster de base de données avec MariaDB, Galera Cluster et Haproxy sous Debian 7.

Comme pour les tutoriels précédents , vous pouvez mettre en place ces serveurs dans le cluster mis en place dans les tutoriel précédents ou les mettre en place seul.

Qu’est-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 société pour lancer le projet MariaDB, dans une démarche visant à remplacer MySQL tout en assurant l’interopérabilité. Le nom vient de la 2e fille de Monty Widenius, Maria (la première s’appelant My).

MariaDB est un système de gestion de base de données édité sous licence GPL. Il s’agit d’un fork communautaire de MySQL : la gouvernance du projet est assurée par la
fondation MariaDB, et sa maintenance par la société Monty Program AB, créateur du projet. Cette gouvernance confère au logiciel l’assurance de rester libre. MariaDB est en plein essor depuis ces deux dernières années, Wikipédia 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 l’adoption de MariaDB en lieu et place de MySQL.

Et Galera Cluster?

Galera Cluster est une solution cluster multi-maître synchrone pour MariaDB. Il est disponible uniquement sous Linux. C’est solution permet de mettre en place avec un minimum de trois serveurs un cluster de base de données auto-répliquant et hautement disponible. Pour faire simple, les trois serveurs de bases de données sont actifs et les utilisateurs peuvent écrire sur n’importe quel serveur, les données sont alors répliquées entre les serveurs restant. Si un serveur devient injoignable, les deux autres serveurs sont toujours disponibles afin d’assurer la disponibilité des services. Galera Cluster est supporté par MariaDB (Galera Cluster se trouve d’ailleurs dans les dépôts de MariaDB). Une solution commerciale « Percona XtraDB Cluster » utilise le moteur de réplication de Galera Cluster.

Voici la topologie que nous allons mettre en place

Topologie

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

 

 

Commençons par mettre en place les deux serveur HaProxy

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 l’installation terminée, 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 balancés
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 spécifier sur quelle adresse IP HaProxy va fonctionner, nous allons accéder aux bases de données depuis l’IP 10.1.0.40.
mode tcp: permet de spécifier que le balancement de charge est utilisé pour du contenu TCP (http pour du contenu web).
balance roundrobin: permet de spécifier l’algorithme de répartition de charge.

Enfin stats, permet de configurer la page de statistiques de HaProxy, dans cette configuration,la page de statistiques sera disponibles via l’adresse suivante http://10.1.0.40/stats avec les identifiants admin/admin.

Pour ma part j’ai rajouté une règle dans le script de firewall des LB web afin de pouvoir accéder 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 accéder aux stats de Haproxy avec l’adresse: http://192.168.2.100:8080/stats

Maintenant, comme sur les serveur LB Web, il faut installer Heartbeat, afin de mettre en place l’adresse IP de balancement des bases de données que nous avons configurés dans HaProxy.

Installation de HeartBeat

apt-get install heartbeat

Une fois HeartBeat installé nous allons devoir créer trois fichiers dans le dossier /etc/ha.d/
ha.cf : Pour la configuration générale 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

 


Nous allons maintenant créer 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 balancée pour HaProxy
haproxy = service que HeartBeat va démarrer

Et pour finir nous allons créer 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 désactiver le démarrage automatique de HaProxy sur les deux serveurs:

insserv -r haproxy

Finalisation du balancement

Sur les deux serveur arrêtez HaProxy:

/etc/init.d/haproxy stop

Puis sur lb1db démarrez 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 l’IP 10.1.0.40 est configurée sur lb1db

Maintenant, démarrez heartbeat sur lb2db.

Le balancement entre les deux serveurs est maintenant pleinement fonctionnel.

Vous pouvez maintenant visualiser depuis l’IP 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 configurés pour le balancement Web soit actif.

Test du balancement

Pour tester le balancement, il vous suffit d’arrêter 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 l’IP balancée est maintenant sur ce serveur.

Relancer HeartBeat sur lb1db afin de remettre l’IP sur celui-ci.

Maintenant que les serveur de répartition de charge il est temps de mettre en place nos trois serveurs de bases de données.

Installation de MariaDB et de Galera Cluster.

Afin de mettre en place notre cluster de base de données MariaDB avec Galera Cluster, il faut ajouter les dépôt Debian nécessaire. Sur les trois serveurs de bases de données, 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 réplication 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 á configurée 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 démarrer le cluster :)

Mais tout d’abord 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 démarré, 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 démarrer 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)

 

 

Donc une fois MySQL démarrer sur db2 et db3, vous pouvez utliser la commande que nous avons utilisé plutôt 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 opérationnel :)

Test de la réplication:

Afin de tester la réplication entre les serveurs, nous allons créer une base de donnée « testreplication ».

Sur n’importe quel serveur de base de donnés (par exemple db2), je vais utiliser la commande suivante afin de créer une base de données:

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 vérifier que la base de données a bien été crée 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 données pleinement fonctionnel.

 

Test de la répartition de charge

Maintenant, nous allons vérifier que la répartition de charge fonctionne bien, nous allons donc, depuis le serveur HaProxy actif (lbd1 normalement), nous connecter au serveur de bases de donnés via l’adresse 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 d’installer 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 configurés mysql afin de pouvoir se connecter aux bases de donnés 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.

Arrêtez MySQL sur les trois serveurs de DB et redémarrez le service en n’oubliant pas d’utiliser la commande service mysql start –wsrep-new-cluster sur un des db afin d’initialiser le cluster.

Puis a partir d’un des serveurs de db, nous allons autoriser le réseau 10.1.0.0/24 à se connecter aux serveurs de base de donnés 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 données depuis n’importe 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 données 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 données je suis connecté?

Une simple commande suffit afin de savoir sur quel serveur de base de données nous nous connections.

Sur le serveur depuis lequel vous vous connectez au cluster de base de données, 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 données :)

Voila ce qui net fin à cette série de tutoriel sur la mise en place d’un cluster web et de de base de données de haute disponibilité, vous avez maintenant les clef en main afin de mettre en place la topologie décrite dans l’article Bientôt.

Amusez-vous bien :)

(7 commentaires)

Passer au formulaire de commentaire

  1. abdel

    c’est l’IP du haproxy qui apparait dans les logs mysql (cf show processlist).
    C’est naZ

  2. CopyPasteSucks

    Pour info,

    http://blog.dylanleborgne.ovh/?p=114

  3. Williams

    Salut Denis,

    merci pour ton super tuto.

    J’ai par contre un problème après avoir setup le heartbeat, lorsque je fais un ifconfig, j’ai pas eth0:0 et l’ip associé (chez moi, j’ai déclaré l’ip 10.10.10.225)

    En te remerciant pour ta réponse.

    Williams

    1. Williams

      Rectification, j’ai trouvé le problème, et, j’ai bien la NIC virtuelle pour l’IP de heartbeat qui est UP.
      Par contre, sur mon 2ième serveur HAProxy, cette NIC est activée en même temps que sur le 1ier HAProxy…

      C’est très bizarre…

  4. imars

    Merci super tuto encore une fois, mais du coup je ne vois pas ou mettre ce tutoriel avec les précédents 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

      Tu peux n’utiliser que deux serveurs Haproxy pour Apache et MariaDB c’est sur que em mettre 4 c’est un peut overkill.

  5. Alex

    Merci très bon boulot.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Lire les articles précédents :
NFS_Linux
[Tuto]HA: Mettre en place deux serveurs NFS actif / Passif avec DRBD et Heartbeat sous Debian 7

Bonjour à tous, dans ce nouveau tuto, nous allons voir comment mettre en place deux serveur NFS qui vont nous...

Fermer