background success stories

Installation et configuration de Maxscale pour MariaDB

Dans cet article, nous verrons comment mettre en œuvre MaxScale avec des Serveurs MariaDB en réplication master/slave afin de disposer d’un système de failover automatique.

La liste de nos serveurs :
mariadb1 -> MariaDB Master
mariadb2 -> MariaDB Slave
app1 -> serveur applicatif sur lequel sera installé MaxScale

Les serveurs sont sous CentOS 7 et les MariaDB en 10.2.

Pour rappel, MaxScale est un produit soumis à licence, vous devez disposer d’une souscription MariaDB pour en bénéficier.

Création des comptes pour MaxScale, un pour le monitoring (maxscale_monitor_user) et un pour les applications (maxscale) mais vous pouvez changer leur nom.

CREATE USER 'maxscale'@'%' IDENTIFIED BY '*************';
GRANT SELECT ON mysql.user TO 'maxscale'@'%';
GRANT SELECT ON mysql.db TO 'maxscale'@'%';
GRANT SELECT ON mysql.tables_priv TO 'maxscale'@'%';
GRANT SELECT ON mysql.roles_mapping TO 'maxscale'@'%';
GRANT SHOW DATABASES ON *.* TO 'maxscale'@'%';

CREATE USER maxscale_monitor_user IDENTIFIED BY '*************';
GRANT replication client ON *.* TO maxscale_monitor_user;
GRANT super, reload ON *.* TO maxscale_monitor_user;
GRANT replication slave ON *.* TO maxscale_monitor_user;

Installation des binaires MaxScale 2.2.13 sur le serveur app1 avec le lien direct :
[root@app1 ~]# yum install https://downloads.mariadb.com/MaxScale/2.2.13/centos/7/x86_64/maxscale-2.2.13-1.centos.7.x86_64.rpm

MaxScale se base sur un fichier de configuration assez conséquent, mais assez facile à faire.
Il fonctionne avec des encarts [ ].
Un encart [maxscale] est présent et il n’est pas nécessaire de le changer.
Ensuite nous avons les encarts « serveurs ».

Le nommage des encarts est libre :

[db1]
type=server
address=10.72.12.110
port=3306
protocol=MariaDBBackend

[db2]
type=server
address=10.72.12.111
port=3306
protocol=MariaDBBackend

On indique le type, l’adresse, le port et le protocol.

Pour surveiller les serveurs, nous avons besoin d’un « monitor ».

[Replication-Monitor]
type=monitor
module=mariadbmon
servers=db1, db2
user=maxscale_monitor_user
password=*********
monitor_interval=2000
auto_rejoin=true
auto_failover=true

On indique le type, les serveurs concernés par ce « monitor », l’utilisateur qui surveillera et qui gérera la réplication.
Attention, cet utilisateur sera aussi celui avec lequel la réplication fonctionnera après une bascule, peu importe le compte avec lequel vous aviez paramétré avant.
Le mot de passe peut être masqué pour éviter de l’avoir en clair dans le fichier, ainsi que l’intervalle de monitoring qui par défaut est à 2s.
Auto_rejoin permet à un ancien master qui a basculé de repasser automatiquement en slave quand il redémarre.
Auto_failover permet d’avoir un système de basculement en cas de perte du master.

Nous devons maintenant définir des services. Il existe plusieurs possibilités, mais nous ne nous occuperons que d’une connexion basique en mode failover dans cet article.

[Read-Write-Service]
type=service
router=readconnroute
router_options=master
servers=db1,db2
user=maxscale
passwd=*********

Nous pouvons voir ci-dessus un service qui pointera sur nos 2 serveurs avec un routage toujours vers le master. L’utilisateur maxscale sera connecté à l’instance finale. Ce n’est pas une simple redirection TCP.

Nous devons aussi définir un service d’administration qui s’appelle maxadmin sur le port 4006 :
[MaxAdmin-Service]
type=service
router=cli

Dernier point de configuration, nous devons définir des listeners pour chaque service défini précédemment.

Celui pour l’interface MaxAdmin qui pointe vers le nom du service défini précédemment :

[MaxAdmin-Listener]
type=listener
service=MaxAdmin-Service
protocol=maxscaled
socket=default

Nul besoin de modification sur ce dernier.
Ci-dessous celui pour notre service de basculement sur le port 4006 :

[Read-Write-Listener]
type=listener
service=Read-Write-Service
protocol=MariaDBClient
port=4006

On démarre le service :

[root@app1 ~]# systemctl start maxscale

[root@app1 ~]# netstat -plnt
Connexions Internet actives (seulement serveurs)
Proto Recv-Q Send-Q Adresse locale          Adresse distante        Etat        PID/Program name
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      2033/sshd
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      1998/master
tcp        0      0 127.0.0.1:8989          0.0.0.0:*               LISTEN      3068/maxscale
tcp6       0      0 :::3306                 :::*                    LISTEN      1871/mysqld
tcp6       0      0 :::22                   :::*                    LISTEN      2033/sshd
tcp6       0      0 ::1:25                  :::*                    LISTEN      1998/master
tcp6       0      0 :::4006                 :::*                    LISTEN      3068/maxscale

Le port 4006 est bien en écoute.

S’il ne démarre pas, regardez le log d’erreur dans /var/log/maxscale/maxscale.log

Pour aller plus loin, nous allons utiliser l’outil maxadmin qui est embarqué avec MaxScale.

Nous pouvons lister les services qui tournent sur MaxScale :

[root@app1 ~]# maxadmin list services
Services.
--------------------------+-------------------+--------+----------------+-------------------
Service Name              | Router Module     | #Users | Total Sessions | Backend databases
--------------------------+-------------------+--------+----------------+-------------------
Read-Write-Service        | readconnroute     |      1 |              1 | db1, db2
MaxAdmin-Service          | cli               |      2 |              4 |
--------------------------+-------------------+--------+----------------+-------------------

La liste des moniteurs :

[root@app1 ~]# maxadmin list monitors
---------------------+---------------------
Monitor              | Status
---------------------+---------------------
Replication-Monitor  | Running
---------------------+---------------------

Ci-dessous la liste de tous les éléments qui peuvent être listés !

clients    List all the client connections to MaxScale
    dcbs       List all active connections within MaxScale
    filters    List all filters
    listeners  List all listeners
    modules    List all currently loaded modules
    monitors   List all monitors
    services   List all services
    servers    List all servers
    sessions   List all the active sessions within MaxScale
    threads    List the status of the polling threads in MaxScale
    commands   List registered commands

Pour lister les serveurs :

[root@app1 ~]# maxadmin list servers
Servers.
-------------------+-----------------+-------+-------------+--------------------
Server             | Address         | Port  | Connections | Status
-------------------+-----------------+-------+-------------+--------------------
db1                | 10.72.12.110    |  3306 |           0 | Master, Running
db2                | 10.72.12.111    |  3306 |           0 | Slave, Running
-------------------+-----------------+-------+-------------+--------------------

Test de connexion sur MaxScale :

[root@app1 ~]# mysql -umaxscale -P 4006 -p --protocol=tcp
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 10
Server version: 5.5.5-10.2.12 2.2.13-maxscale MariaDB Server

Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

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

mysql> select @@hostname;
+-------------------------+
| @@hostname              |
+-------------------------+
| db1                     |
+-------------------------+
1 row in set (0,03 sec)

MaxScale renvoie bien sur le bon serveur.

Nous allons faire un test de basculement.

[root@app1 ~]# maxadmin list servers
Servers.
------------------------+-----------------+-------+-------------+--------------------
Server                  | Address         | Port  | Connections | Status
------------------------+-----------------+-------+-------------+--------------------
vs-centos7-maxscale-db1 | 10.72.12.110    |  3306 |           0 | Master, Running
vs-centos7-maxscale-db2 | 10.72.12.111    |  3306 |           0 | Slave, Running
------------------------+-----------------+-------+-------------+--------------------

On arrête le service (un kill -9 ne suffit pas car systemd le relance avant même que MaxScale détecte la bascule).

[root@db1 ~]# systemctl stop mysqld
[root@app1 ~]# maxadmin list servers
Servers.
-------------------+-----------------+-------+-------------+--------------------
Server             | Address         | Port  | Connections | Status
-------------------+-----------------+-------+-------------+--------------------
               db1 | 10.72.12.110    |  3306 |           0 | Down
               db2 | 10.72.12.111    |  3306 |           0 | Master, Running
-------------------+-----------------+-------+-------------+--------------------

On voit bien la bascule, cependant elle nécessite plusieurs secondes, si on relance db1 :

[root@db1 ~]# systemctl start mysqld
[root@app1 ~]# maxadmin list servers
Servers.
-------------------+-----------------+-------+-------------+--------------------
Server             | Address         | Port  | Connections | Status
-------------------+-----------------+-------+-------------+--------------------
               db1 | 10.72.12.110    |  3306 |           0 | Slave, Running
               db2 | 10.72.12.111    |  3306 |           0 | Master, Running
-------------------+-----------------+-------+-------------+--------------------

db1 devient slave après quelques secondes.

Cet article ne couvre que le fonctionnement de base, cependant MaxScale offre bien d’autres possibilités.