Dans un de mes articles (Cluster MariaDB), j’explique comment mettre en place un cluster MariaDB avec, en Frontal, HAproxy.
Dans ce dernier, je configure un serveur en principal et les autres en backup, pour la simple et bonne raison que je n’aime pas faire des écritures sur plusieurs serveurs. Bon, il parait qu’un cluster MariaDB gère plutôt bien les écritures sur plusieurs serveurs, mais j’ai de vieilles habitudes issues de l’époque ou je pratiquais une réplication Master-Slave plus classique
J’ai décidé d’optimiser tout cela et de faire en sorte que mes deux autres serveurs travaillent un peu plus et cessent de se tourner les pouces.
Bref, voila une solution élégante pour y arriver. Attention cependant, cela ne servira que pour vos applications Web (avec PHP).
L’idée est d’avoir une pièce en plus, au niveau de vos machines Web (un petit module PHP), qui remplacera la connexion SQL que vous effectuiez jusqu’à présent.
Celui ci adressera par défaut les opérations d’écritures a(ux) serveur(s) déclaré(s) Master et les opérations de lectures a(ux) serveur(s) déclaré(s) Slave.
I – Prérequis
Un Cluster MariaDB avec un Failover HAProxy en amont (représenté ici par IPFO) déjà prêt et fonctionnel.
On va effectuer quelques changement au niveau de ce HAproxy d’ailleurs.
Dans le fichier de configuration /etc/haproxy/haproxy.cfg , vous avez quelque chose de la sorte :
[...] frontend sql-front bind *:3306 mode tcp default_backend sql-back backend sql-back mode tcp balance leastconn option mysql-check user haproxy server sql1 IPNOEUD1:3306 check port 3306 server sql2 IPNOEUD2:3306 check port 3306 backup server sql3 IPNOEUD3:3306 check port 3306 backup
Vous allez supprimer cela et mettre à la place :
[...] frontend sql-front-write bind *:3306 mode tcp default_backend sql-back-write backend sql-back-write mode tcp balance leastconn option mysql-check user haproxy server sql1 IPNOEUD1:3306 check port 3306 server sql2 IPNOEUD2:3306 check port 3306 backup server sql3 IPNOEUD3:3306 check port 3306 backup frontend sql-front-read bind *:3307 mode tcp default_backend sql-back-read backend sql-back-read mode tcp balance leastconn option mysql-check user haproxy server sql2 IPNOEUD2:3306 check port 3306 server sql3 IPNOEUD3:3306 check port 3306 server sql1 IPNOEUD1:3306 check port 3306 backup
Nous rajoutons un port en écoute (3307), sur lequel, seul le serveur 1 est déclaré Backup.
Du coup, en communiquant sur 3306, nous n’aurons que le noeud1 qui répond, et en communiquant sur 3307, les deux autres nœuds répondront, à tour de rôle. Bien évidement, tout cela si l’ensemble des nœuds est opérationnel. Sinon, les backups prennent le relai.
Ce loadbalancing aurait pu être fait dans le module que nous allons installer (déclaration de plusieurs slaves), mais je préfère garder HAProxy pour cela.
II – Préparatifs
On installe quelques dépendances :
# apt-get install php7.0-dev php7.0-json libmemcached-dev libxml2-dev
Ensuite, installons git :
# apt-get install git
Si vous êtes derrière un proxy (probable si suivez en parallèle mon tutoriel sur la virtualisation…) et que votre serveur n’a pas un accès direct à Internet.
# git config --global http.proxy http://IP:PORT
III – Compilation
Ensuite, on va se mettre dans le répertoire root et cloner le dépôt.
# cd# git clone https://github.com/sergiotabanelli/mysqlnd_ms.git # cd mysqlnd_ms/
Puis on compile et on installe :
# phpize # ./configure # make # make install
IV – Configuration
Éditez le fichier /etc/php/7.0/fpm/conf.d/10-mysqlnd.ini et ajoutez :
extension=mysqlnd_ms.so mysqlnd_ms.enable=1 mysqlnd_ms.config_file=/etc/mysqlnd_ms.ini
Puis créez le fichier /etc/mysqlnd_ms.ini pour y insérer :
{ "sqlbal": { "master": { "master_0": { "host": "10.20.1.150", "port": "3306" } }, "slave": { "slave_0": { "host": "10.20.1.150", "port": "3307" } } } }
On relance et on vérifie la présence du module
# service php7.0-fpm restart # php -m
V – Côté Application PHP
Rien de compliqué, il vous suffit juste de remplacer l’adresse de connexion à votre base par le nom donné dans le fichier de configuration, ici sqlbal.
Et voila ! Automatiquement, votre application PHP verra ses requêtes distribuées sur les différents serveurs, en fonction de leur nature.