background success stories

MySQL Group Replication et ProxySQL sur Docker Partie 2

Pour utiliser ProxySQL, nous allons mettre en place la version 1.4.0, (uniquement sur github lors de la rédaction de cet article).
C’est la première version qui gère nativement MySQL Group Replication. Il est possible de l’utiliser dans des versions antérieures mais cela nécessite des scripts et l’utilisation du scheduler, ce n’est pas idéal et les bascules ne sont pas immédiates.

Le dockerfile que nous allons utiliser n’est pas idéal, car il compile le binaire, les versions compilées ne sont pas encore disponibles.

Docker file pour l’image proxysql:

[bash]#Pour la mise en place sur docker, de proxysql et un MySQL Group Replication avec deux noeuds
#Une image contenant proxysql va être créé pour Group Replication, une image officiel mysql sera utilisée

#/Docker file pour l’image proxysql (une version compilé existe et elle supporte nativement group replication, je vous conseille donc de faire l’image avec la version 1.4.1) :
FROM debian:latest
#copy proxysql to /tmp
COPY proxysql-1.4.0-GR.zip /tmp

#expose default proxysql port
EXPOSE 6033
#install proxysql
#remove deb file
#RUN rm -rf /tmp/proxysql_1.3.3-debian8_amd64.deb
#install openssl needed for proxysql, and mysql for administration purposes only
RUN apt-get update
RUN apt-get –assume-yes install unzip automake bzip2 cmake make openssl libssl-dev mysql-client g++ gcc git patch gawk
RUN unzip /tmp/proxysql-1.4.0-GR.zip
RUN cd /proxysql-1.4.0-GR/;make;make install

RUN mkdir /etc/proxysql

#move configuration file to new volume
RUN mv /etc/proxysql.cnf /etc/proxysql/proxysql.cnf
#store configuration on volume accessible to host, always after setting content
VOLUME /etc/proxysql
#main process, launch it in foreground with default conf file in the new path
ENTRYPOINT ["/usr/local/bin/proxysql", "–foreground", "-c", "/etc/proxysql/proxysql.cnf"]
[/bash]

Création de l’image :

[bash]docker build –tag proxysql:1.4.0 -f Dockerfile_proxysql1_4_0 .
Création du container :
docker run –network=mynetwork –name proxy140 -d proxysql:1.4.0[/bash]

Connexion sur le proxysql via la commande suivante :
Le port d’administration est le 6032 et le port d’écoute principal est 6033

[bash highlight= »40,46″]root@bd8436fac827:/# mysql -uadmin -p -P 6032 –protocol=tcp

on peut voir les tables associées à group replication :
root@bd8436fac827:/# mysql -uadmin -padmin -P 6032 –protocol=tcp
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.5.30 (ProxySQL Admin Module)

Copyright (c) 2000, 2016, 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> show databases;
+—–+———+——————————-+
| seq | name | file |
+—–+———+——————————-+
| 0 | main | |
| 2 | disk | /var/lib/proxysql/proxysql.db |
| 3 | stats | |
| 4 | monitor | |
+—–+———+——————————-+
4 rows in set (0.00 sec)

mysql> use main;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed

mysql> show tables;
+——————————————–+
| tables |
+——————————————–+
| global_variables |
| mysql_collations |
| mysql_group_replication_hostgroups |
| mysql_query_rules |
| mysql_replication_hostgroups |
| mysql_servers |
| mysql_users |
| runtime_global_variables |
| runtime_mysql_group_replication_hostgroups |
| runtime_mysql_query_rules |
| runtime_mysql_replication_hostgroups |
| runtime_mysql_servers |
| runtime_mysql_users |
| runtime_scheduler |
| scheduler |
+——————————————–+
15 rows in set (0.00 sec)[/bash]

Ajout de nos 3 serveurs :

[bash] mysql> insert into mysql_servers (hostgroup_id, hostname, port) values (0, ‘node1’, 3306),
-> (0, ‘node2’, 3306), (0, ‘node3’, 3306);
Query OK, 3 rows affected (0.01 sec)[/bash]

Configuration du groupe :

[bash]insert into mysql_group_replication_hostgroups (writer_hostgroup,backup_writer_hostgroup,
reader_hostgroup, offline_hostgroup,active,max_writers,writer_is_also_reader,max_transactions_behind)
values (0,4,3,1,1,3,0,100);[/bash]

writer_hostgroup contiendra les serveurs en écritures, backup_writer_hostgroup est utile si on veut limiter le nombre de master en mode multimaster, reader_hostgroup correspond au slave, offline_hostgroup correspond aux serveurs offline, max_writers, le nombre de master etc.

Persistance des modifications :

[bash]mysql> save mysql servers to disk;
Query OK, 0 rows affected (0.11 sec)[/bash]

chargement de la configuration pour prise en compte :

[bash]mysql> load mysql servers to runtime;
Query OK, 0 rows affected (0.00 sec)[/bash]

Ajout supplémentaire pour SYS schema, nécessaire pour la proxysql 1.4.0 :

Voir ce gist sur GitHub

[powershell]
PS C:\Users\nicolas.moreau\docker\proxysql_1_4_0> docker cp .\addition_sys_gr.sql node1:/tmp
PS C:\Users\nicolas.moreau\docker\proxysql_1_4_0> docker exec -it node1 bash
root@b0caacf6750b:/# mysql -uroot -p select * from sys.gr_member_routing_candidate_status;
+——————+———–+———————+———————-+
| viable_candidate | read_only | transactions_behind | transactions_to_cert |
+——————+———–+———————+———————-+
| YES | NO | 0 | 0 |
+——————+———–+———————+———————-+
[/powershell]

Création de l’utilisateur pour proxysql (monitor/monitor permet de ne pas modifier les variables globales, ne pas reproduire en production) :

[sql]mysql> create user monitor@’%’ identified by ‘monitor’;
Query OK, 0 rows affected (0.04 sec)

mysql> grant select on sys.* to proxysqlmonitor;
Query OK, 0 rows affected (0.04 sec)
[/sql]

Création de l’utilisateur et de la base applicative sur le noeud master :

[sql]mysql> create user myapp identified by ‘MyAPP1!’;
Query OK, 0 rows affected (0.03 sec)

mysql> create database myapp;
Query OK, 1 row affected (0.01 sec)

mysql> grant all privileges on myapp.* to myapp;
Query OK, 0 rows affected (0.03 sec)[/sql]

Sur proxysql ajout de l’utilisateur applicatif :

[sql]insert into mysql_users (username, password, active, default_hostgroup, max_connections) values (‘myapp’, ‘MyAPP1!’, 1, 0, 200);

mysql> save mysql users to disk;
Query OK, 0 rows affected (0.06 sec)

mysql> load mysql users to runtime;
Query OK, 0 rows affected (0.00 sec)[/sql]

par défaut toutes les connexions sont envoyées sur le master, même en cas de bascule.
Pour faire du load balancing sur les slaves, il est nécessaire de faire une règle pour dispatcher sur le hostgroup de lecture, en l’occurrence le 3 dans notre cas.