25 avril 2024

Répartition des requêtes écritures/lectures au sein d’un cluster MariaDB pour vos applications Web PHP

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.

Laisser un commentaire

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