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.