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
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 réseau en 192.168.2.XXX est mon réseau local (mode pont) et pour le réseau en 10.1.0.XXX la configuration de la carte est en mode Réseau interne.
Les serveurs sont configurés de la façon suivante:
Serveurs de répartition de charge
hostname: lb1db
eth0: 10.1.0.41
hostname: lb2db
eth0: 10.1.0.42
Serveurs de bases de données
hostname: db1
eth0: 10.1.0.51
hostname: db2
eth0: 10.1.0.52
hostname: db3
eth0: 10.1.0.53
Commençons par mettre en place les deux serveur HaProxy
Important!
Attention les commandes suivantes sont á faire dur les deux serveurInstallation 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
Important!
Les prochaines manipulation sont á faire dur les deux serveursapt-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
Important!
Attention! Pour que tout fonctionne bien il faut s’assurer 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 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)
Important!
Sous debian, vous aurez cett erreur: ERROR 1045 (28000): Access denied for user ‘debian-sys-maint’@’localhost’ (using password: YES)
C’est une erreur normal et nous allons la régler bientôt.
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.
Important!
Afin de régler le probléme : 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 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 :)
(13 commentaires)
Passer au formulaire de commentaire
Excellent tuto ! Merci.
Que conseillerais-tu comme interface graphique pour la gestion de la base de données (autre que phpmyadmin) ?
Merci
Super tuto, qui m’a 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 c’est maintenant galera_new_cluster
mais encore merci pour le tuto, excellent !
Bonjour,
J’ai un souci avec votre tuto qui me semble bien fait.
J’arrive a créer une base de donnée qui est bien répliqué sur les autres serveurs myslq, par contre, lorsque je fais un insert dans une table de la bdd créée, la donnée n’est pas répliquée sur les autres serveurs MySQL…
bizarre…
si vous avez déjà eu le cas, pouvez-vous svpn m’aider.
merci.
personne n’a le même souci??
Salut,
vérifie que tes tables utilise bien le moteur innodb et non pas du myisam (https://mariadb.com/kb/en/mariadb/mariadb-galera-cluster-known-limitations/)
Merci pout le tuto.
Petite question, tu parle de réseau privé, tu configure les VM avec 2 cartes réseaux ?
La première sur une IP qui permet d’accéder en SSH et la seconde sur le réseau privé pour la conf du LB ?
c’est l’IP du haproxy qui apparait dans les logs mysql (cf show processlist).
C’est naZ
Pour info,
http://blog.dylanleborgne.ovh/?p=114
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
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…
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 ?
Author
Tu peux n’utiliser que deux serveurs Haproxy pour Apache et MariaDB c’est sur que em mettre 4 c’est un peut overkill.
Merci très bon boulot.