timorunge.proxysql
proxysql
Actuellement, ce rôle n'est pas compatible avec ProxySQL >= v2.0.1.
Ce rôle est seulement compatible avec Ansible 2.7.9 ou supérieur en raison d'un bug dans la migration de MySQLdb à PyMySQL (#40123) dans les utilitaires du module MySQL.
La version 0.3.0 est compatible avec Ansible 2.7.0 ou inférieur.
Ce rôle installe et configure ProxySQL - le proxy haute performance et haute disponibilité, conscient des protocoles pour MySQL.
Depuis la version 2.3.0, Ansible propose un module pour configurer ProxySQL lui-même. Ce rôle Ansible utilise cette fonctionnalité tout en ajoutant quelques (espérons-le) fonctionnalités utiles :
- Installation automatique pour différents systèmes d'exploitation
- (Pré-)génération de proxysql.cnf
- Gérer un Cluster ProxySQL (avec un module personnalisé qui ajoute la fonctionnalité de configurer les serveurs ProxySQL)
- Différencier entre les
global_variables
dynamiques et statiques - redémarrer ProxySQL si nécessaire
Veuillez également consulter la section "Problèmes connus ou : Bon à savoir" dans ce document.
Exigences
Ce rôle nécessite Ansible 2.5.0 ou supérieur.
Vous pouvez simplement utiliser pip pour installer (et définir) une version stable :
pip install ansible==2.7.9
Tous les besoins de plate-forme sont listés dans le fichier des métadonnées.
Installation
ansible-galaxy install timorunge.proxysql
Variables du rôle
Les variables qui peuvent être passées à ce rôle. Pour toutes les variables, consultez defaults/main.yml.
# Activer / désactiver ProxySQL en tant que service.
# Type : Bool
proxysql_service_enabled: True
# Redémarrer ProxySQL si les variables statiques changent. Pour une liste de variables statiques,
# jetez un œil à `proxysql_non_dynamic_variables` dans `vars/main.yml`.
# Type : Bool
proxysql_restart_on_static_variables_change: True
# Référentiels
# Si les deux, `proxysql_use_official_repo` et `proxysql_use_percona_repo` sont définis
# sur `False`, le module téléchargera automatiquement la version définie
# `proxysql_version` en tant que package depuis Github et l'installera.
# Utiliser le référentiel ProxySQL officiel.
# Type : Bool
proxysql_use_official_repo: True
# Utiliser le référentiel Percona.
# Type : Bool
proxysql_use_percona_repo: False
# Définir la version du référentiel pour le référentiel Percona.
# Type : Str
proxysql_percona_release: latest
# La version de ProxySQL qui doit être installée si le référentiel ProxySQL
# n'est pas utilisé.
# Type : Int
proxysql_version: 1.4.15
# Configuration
# Le chemin où ProxySQL doit enregistrer sa base de données et ses logs.
# Type : Str
proxysql_datadir: /var/lib/proxysql
# Définir le modèle proxysql.cnf
# Type : Str
proxysql_proxysql_cnf_template: proxysql.cnf.j2
# Définir le modèle proxysql-admin.cnf
# Type : Str
proxysql_proxysql_admin_cnf_template: proxysql-admin.cnf.j2
# Les variables de connexion pour la configuration de ProxySQL lui-même. Elles sont juste
# utilisées à l'intérieur du fichier `main.yml` pour simplifier la configuration.
# Type : Str
proxysql_login_admin_host: 127.0.0.1
proxysql_login_admin_password: admin
proxysql_login_admin_port: 6032
proxysql_login_admin_user: admin
# Variables globales
# `admin_variables` dans `proxysql_global_variables_kv` : contient les variables
# globales qui contrôlent la fonctionnalité de l'interface admin.
# `admin_variables` sont préfixées par `admin-`.
# `mysql_variables` : dans `proxysql_global_variables_kv` contient des variables
# globales qui contrôlent la fonctionnalité de traitement du trafic MySQL entrant.
# `mysql_variables` sont préfixées par `mysql-`.
# Les variables devraient être soit une chaîne, soit un entier. Vous devez
# marquer une valeur booléenne en tant que chaîne, par exemple, "True" ou "False".
# Pour une référence complète, consultez :
# https://github.com/sysown/proxysql/wiki/Global-variables
# Format :
# Type : Dict
# proxysql_global_variables:
# load_to_runtime: "True"
# save_to_disk: "True"
# login_host: "{{ proxysql_login_admin_host }}"
# login_password: "{{ proxysql_login_admin_password }}"
# login_port: "{{ proxysql_login_admin_port }}"
# login_user: "{{ proxysql_login_admin_user }}"
proxysql_global_variables:
login_host: "{{ proxysql_login_admin_host }}"
login_password: "{{ proxysql_login_admin_password }}"
login_port: "{{ proxysql_login_admin_port }}"
login_user: "{{ proxysql_login_admin_user }}"
# Format :
# Type : Dict
# proxysql_global_variables_kv:
# clé: valeur
# par exemple :
# proxysql_global_variables_kv:
# admin-admin_credentials: "{{ proxysql_login_admin_user }}:{{ proxysql_login_admin_password }}"
# admin-mysql_ifaces: "{{ proxysql_login_admin_host }}:{{ proxysql_login_admin_port }}"
# mysql-commands_stats: "True"
# mysql-threads: 4
proxysql_global_variables_kv: {}
# Serveurs backend
# `proxysql_backend_servers` : contient des lignes pour la table mysql_servers
# de l'interface admin. Essentiellement, ces lignes définissent les serveurs backend
# vers lesquels le trafic MySQL entrant est orienté.
# Pour un aperçu complet, consultez :
# https://docs.ansible.com/ansible/latest/modules/proxysql_backend_servers_module.html
# Important : Ce module utilise `hostgroup` (qui est le nom correct dans la
# base de données) au lieu de `hostgroup_id` (qui est le défaut dans le
# module Ansible) !
# Format :
# Type : Dict
# proxysql_backend_servers:
# mysql-srv1-hg1:
# comment: mysql-srv1-hg1
# hostgroup: 1
# hostname: 172.16.77.101
# login_host: "{{ proxysql_login_admin_host }}"
# login_password: "{{ proxysql_login_admin_password }}"
# login_port: "{{ proxysql_login_admin_port }}"
# login_user: "{{ proxysql_login_admin_user }}"
# max_connections: 1000
# max_replication_lag: 0
# status: ONLINE
# weight: 1
proxysql_backend_servers: {}
# Serveurs ProxySQL
# `proxysql_proxysql_servers` : contient des lignes pour la table proxysql_servers
# de l'interface admin. Essentiellement, ces lignes définissent les serveurs ProxySQL
# qui sont utilisés pour le clustering.
# Pour un aperçu complet, consultez :
# `library/proxysql_proxysql_servers.py` car cela ne fait pas partie du
# package Ansible officiel.
# Format :
# Type : Dict
# proxysql_proxysql_servers:
# proxysql-srv-1:
# comment: proxysql-srv-1
# hostname: 172.16.77.201
# login_host: "{{ proxysql_login_admin_host }}"
# login_password: "{{ proxysql_login_admin_password }}"
# login_port: "{{ proxysql_login_admin_port }}"
# login_user: "{{ proxysql_login_admin_user }}"
# weight: 0
proxysql_proxysql_servers: {}
# Groupes de réplication
# `proxysql_replication_hostgroups` : représentent une paire de writer_hostgroup
# et reader_hostgroup. ProxySQL surveillera la valeur de read_only pour tous
# les serveurs dans les hostgroups spécifiés et, en fonction de la valeur de read_only,
# assignera le serveur aux groupes hostwriter ou reader.
# Pour un aperçu complet, consultez :
# https://docs.ansible.com/ansible/latest/modules/proxysql_replication_hostgroups_module.html
# Format :
# Type : Dict
# proxysql_replication_hostgroups:
# Cluster:
# comment: Cluster
# login_host: "{{ proxysql_login_admin_host }}"
# login_password: "{{ proxysql_login_admin_password }}"
# login_port: "{{ proxysql_login_admin_port }}"
# login_user: "{{ proxysql_login_admin_user }}"
# reader_hostgroup: 2
# writer_hostgroup: 1
proxysql_replication_hostgroups: {}
# Utilisateurs
# `proxysql_mysql_users` : contient des lignes pour la table mysql_users de
# l'interface admin. Essentiellement, ces lignes définissent les utilisateurs qui
# peuvent se connecter au proxy et les utilisateurs avec lesquels le proxy
# peut se connecter aux serveurs backend.
# Pour un aperçu complet, consultez :
# http://docs.ansible.com/ansible/latest/proxysql_mysql_users_module.html
# Format :
# Type : Dict
# proxysql_mysql_users:
# user1:
# active: 1
# backend: 1
# default_hostgroup: 1
# fast_forward: 0
# frontend: 1
# login_host: "{{ proxysql_login_admin_host }}"
# login_password: "{{ proxysql_login_admin_password }}"
# login_port: "{{ proxysql_login_admin_port }}"
# login_user: "{{ proxysql_login_admin_user }}"
# max_connections: 10000
# password: Passw0rd
# transaction_persistent: 1
# username: user1
# user2:
# active: 1
# backend: 1
# default_hostgroup: 2
# fast_forward: 0
# frontend: 1
# login_host: "{{ proxysql_login_admin_host }}"
# login_password: "{{ proxysql_login_admin_password }}"
# login_port: "{{ proxysql_login_admin_port }}"
# login_user: "{{ proxysql_login_admin_user }}"
# max_connections: 1000
# password: dr0wssaP
# transaction_persistent: 1
# username: user2
proxysql_mysql_users: {}
# Règles de requête
# `proxysql_query_rules` contient des lignes pour la table mysql_query_rules de
# l'interface admin. Essentiellement, ces lignes définissent les règles utilisées
# pour classifier et router le trafic MySQL entrant, selon divers critères
# (motifs correspondants, utilisateur ayant exécuté la requête, etc.).
# Pour un aperçu complet, consultez :
# http://docs.ansible.com/ansible/latest/proxysql_query_rules_module.html
# Format :
# Type : Dict
# proxysql_query_rules:
# catchall:
# active: 1
# apply: 1
# destination_hostgroup: 1
# flagIN: 0
# login_host: "{{ proxysql_login_admin_host }}"
# login_password: "{{ proxysql_login_admin_password }}"
# login_port: "{{ proxysql_login_admin_port }}"
# login_user: "{{ proxysql_login_admin_user }}"
# match_pattern: .*@.*
# negate_match_pattern: 0
# rule_id: 1
proxysql_query_rules: {}
# Outil d'administration ProxySQL de Percona
# La solution ProxySQL Admin (proxysql-admin) configure les nœuds du cluster Percona XtraDB
# dans ProxySQL.
# Pour un aperçu complet, consultez :
# https://github.com/percona/proxysql-admin-tool
# Format :
# Type : Dict
# proxysql_percona_admin_tool:
# PROXYSQL_DATADIR: "{{ proxysql_datadir }}"
# PROXYSQL_USERNAME: "{{ proxysql_login_admin_user }}"
# PROXYSQL_PASSWORD: "{{ proxysql_login_admin_password }}"
# PROXYSQL_HOSTNAME: "{{ proxysql_login_admin_host }}"
# PROXYSQL_PORT: "{{ proxysql_login_admin_port }}"
# CLUSTER_USERNAME: admin
# CLUSTER_PASSWORD: admin
# CLUSTER_HOSTNAME: localhost
# CLUSTER_PORT: 3306
# MONITOR_USERNAME: monitor
# MONITOR_PASSWORD: monit0r
# CLUSTER_APP_USERNAME: proxysql_user
# CLUSTER_APP_PASSWORD: passw0rd
# WRITE_HOSTGROUP_ID: 10
# READ_HOSTGROUP_ID: 11
# MODE: singlewrite
proxysql_percona_admin_tool:
PROXYSQL_DATADIR: "{{ proxysql_datadir }}"
PROXYSQL_USERNAME: "{{ proxysql_login_admin_user }}"
PROXYSQL_PASSWORD: "{{ proxysql_login_admin_password }}"
PROXYSQL_HOSTNAME: "{{ proxysql_login_admin_host }}"
PROXYSQL_PORT: "{{ proxysql_login_admin_port }}"
Exemples
1) Exemple complet de configuration
Voici un exemple complet de configuration de ProxySQL. Dans ce cas,
le rôle téléchargera directement le package 1.4.15
et n'utilisera pas le référentiel
(proxysql_use_official_repo
est défini sur False
).
Ceci est essentiellement (avec quelques petites modifications) le fichier test.yml utilisé pour les tests.
- hosts: proxysql
gather_facts: True
vars:
proxysql_version: 1.4.15
proxysql_service_enabled: True
proxysql_use_official_repo: True
proxysql_login_admin_host: 127.0.0.1
proxysql_login_admin_password: admin
proxysql_login_admin_port: 6032
proxysql_login_admin_user: admin
proxysql_global_variables:
login_host: "{{ proxysql_login_admin_host }}"
login_password: "{{ proxysql_login_admin_password }}"
login_port: "{{ proxysql_login_admin_port }}"
login_user: "{{ proxysql_login_admin_user }}"
proxysql_global_variables_kv:
admin-admin_credentials: "{{ proxysql_login_admin_user }}:{{ proxysql_login_admin_password }}"
admin-mysql_ifaces: "{{ proxysql_login_admin_host }}:{{ proxysql_login_admin_port }}"
mysql-commands_stats: "True"
mysql-connect_retries_on_failure: 10
mysql-connect_timeout_server: 3000
mysql-default_charset: utf8
mysql-default_query_delay: 0
mysql-default_query_timeout: 300000
mysql-default_schema: information_schema
mysql-default_sql_mode: >
STRICT_TRANS_TABLES,
ERROR_FOR_DIVISION_BY_ZERO,
NO_AUTO_CREATE_USER,
NO_ENGINE_SUBSTITUTION
mysql-interfaces: 127.0.0.1:6033
mysql-max_connections: 8192
mysql-monitor_read_only_interval: 1500
mysql-monitor_read_only_timeout: 500
mysql-ping_timeout_server: 500
mysql-poll_timeout: 2000
mysql-query_retries_on_failure: 1
mysql-sessions_sort: "True"
mysql-threads: 4
proxysql_backend_servers:
mysql-srv1-hg1:
comment: mysql-srv1-hg1
hostgroup: 1
hostname: 172.16.77.101
login_host: "{{ proxysql_login_admin_host }}"
login_password: "{{ proxysql_login_admin_password }}"
login_port: "{{ proxysql_login_admin_port }}"
login_user: "{{ proxysql_login_admin_user }}"
max_connections: 1000
max_replication_lag: 0
status: ONLINE
weight: 1
mysql-srv1-hg2:
comment: mysql-srv1-hg2
hostgroup: 2
hostname: 172.16.77.101
login_host: "{{ proxysql_login_admin_host }}"
login_password: "{{ proxysql_login_admin_password }}"
login_port: "{{ proxysql_login_admin_port }}"
login_user: "{{ proxysql_login_admin_user }}"
max_connections: 1000
max_replication_lag: 0
status: ONLINE
weight: 1
mysql-srv2-hg2:
comment: mysql-srv2-hg2
hostgroup: 2
hostname: 172.16.77.102
login_host: "{{ proxysql_login_admin_host }}"
login_password: "{{ proxysql_login_admin_password }}"
login_port: "{{ proxysql_login_admin_port }}"
login_user: "{{ proxysql_login_admin_user }}"
max_connections: 2000
max_replication_lag: 5
status: ONLINE
weight: 1
mysql-srv3-hg2:
comment: mysql-srv3-hg2
hostgroup: 2
hostname: 172.16.77.103
login_host: "{{ proxysql_login_admin_host }}"
login_password: "{{ proxysql_login_admin_password }}"
login_port: "{{ proxysql_login_admin_port }}"
login_user: "{{ proxysql_login_admin_user }}"
max_connections: 2000
max_replication_lag: 5
status: OFFLINE_HARD
weight: 1
proxysql_proxysql_servers:
proxysql-srv-1:
comment: proxysql-srv-1
hostname: 172.16.77.201
login_host: "{{ proxysql_login_admin_host }}"
login_password: "{{ proxysql_login_admin_password }}"
login_port: "{{ proxysql_login_admin_port }}"
login_user: "{{ proxysql_login_admin_user }}"
port: 6032
weight: 0
proxysql-srv-2:
comment: proxysql-srv-2
hostname: 172.16.77.202
login_host: "{{ proxysql_login_admin_host }}"
login_password: "{{ proxysql_login_admin_password }}"
login_port: "{{ proxysql_login_admin_port }}"
login_user: "{{ proxysql_login_admin_user }}"
port: 6032
weight: 0
proxysql_replication_hostgroups:
Cluster:
comment: Cluster
login_host: "{{ proxysql_login_admin_host }}"
login_password: "{{ proxysql_login_admin_password }}"
login_port: "{{ proxysql_login_admin_port }}"
login_user: "{{ proxysql_login_admin_user }}"
reader_hostgroup: 2
writer_hostgroup: 1
proxysql_mysql_users:
user1:
active: 1
backend: 1
default_hostgroup: 1
fast_forward: 0
frontend: 1
login_host: "{{ proxysql_login_admin_host }}"
login_password: "{{ proxysql_login_admin_password }}"
login_port: "{{ proxysql_login_admin_port }}"
login_user: "{{ proxysql_login_admin_user }}"
max_connections: 10000
password: Passw0rd
transaction_persistent: 1
username: user1
user2:
active: 1
backend: 1
default_hostgroup: 1
fast_forward: 0
frontend: 1
login_host: "{{ proxysql_login_admin_host }}"
login_password: "{{ proxysql_login_admin_password }}"
login_port: "{{ proxysql_login_admin_port }}"
login_user: "{{ proxysql_login_admin_user }}"
max_connections: 1000
password: dr0wssaP
transaction_persistent: 1
username: user2
proxysql_query_rules:
catchall:
active: 1
apply: 1
destination_hostgroup: 1
flagIN: 0
login_host: "{{ proxysql_login_admin_host }}"
login_password: "{{ proxysql_login_admin_password }}"
login_port: "{{ proxysql_login_admin_port }}"
login_user: "{{ proxysql_login_admin_user }}"
match_pattern: .*@.*
negate_match_pattern: 0
rule_id: 1
selectforupdate:
active: 1
apply: 1
destination_hostgroup: 1
flagIN: 0
login_host: "{{ proxysql_login_admin_host }}"
login_password: "{{ proxysql_login_admin_password }}"
login_port: "{{ proxysql_login_admin_port }}"
login_user: "{{ proxysql_login_admin_user }}"
match_pattern: ^SELECT.*FOR UPDATE
negate_match_pattern: 0
rule_id: 2
select:
active: 1
apply: 0
destination_hostgroup: 2
flagIN: 0
login_host: "{{ proxysql_login_admin_host }}"
login_password: "{{ proxysql_login_admin_password }}"
login_port: "{{ proxysql_login_admin_port }}"
login_user: "{{ proxysql_login_admin_user }}"
match_pattern: ^SELECT.*
negate_match_pattern: 0
rule_id: 3
roles:
- timorunge.proxysql
2) Installation à partir du référentiel officiel
Utilisez le référentiel ProxySQL (proxysql_use_official_repo
est défini sur True
).
ProxySQL lui-même ne fournit pas de packages dans le référentiel pour Ubuntu > 16.04.
Il vous suffit de définir proxysql_use_official_repo
sur False
pour les nouvelles versions d'Ubuntu ou d'utiliser le référentiel Percona.
Consultez la section de test pour la couverture du référentiel officiel.
- hosts: proxysql
vars:
proxysql_use_official_repo: True
proxysql_use_percona_repo: False
proxysql_login_admin_host: 127.0.0.1
proxysql_login_admin_password: admin
proxysql_login_admin_port: 6032
proxysql_login_admin_user: admin
...
3) Installation à partir du référentiel Percona
Utilisez le référentiel ProxySQL (proxysql_use_percona_repo
est défini sur True
).
Consultez la section de test pour la couverture du référentiel Percona.
- hosts: proxysql
vars:
proxysql_use_official_repo: False
proxysql_use_percona_repo: True
proxysql_login_admin_host: 127.0.0.1
proxysql_login_admin_password: admin
proxysql_login_admin_port: 6032
proxysql_login_admin_user: admin
...
4) Installation à partir du package deb ou rpm
Vous pouvez installer ProxySQL directement depuis une version GitHub. Il vous suffit de définir proxysql_version
. Définissez proxysql_use_official_repo
et proxysql_use_percona_repo
sur False
.
- hosts: proxysql
vars:
proxysql_version: 1.4.15
proxysql_use_official_repo: False
proxysql_use_percona_repo: False
proxysql_login_admin_host: 127.0.0.1
proxysql_login_admin_password: admin
proxysql_login_admin_port: 6032
proxysql_login_admin_user: admin
...
5) Ne pas redémarrer ProxySQL après un changement de variable statique
Si vous souhaitez redémarrer ProxySQL par vous-même après un changement de configuration de variables statiques, vous devez définir proxysql_restart_on_static_variables_change
sur False
.
Dans ce cas, vous rencontrerez un problème connu qui n'est pas dramatique. Dans ce cas, les tests d'idempotence échoueront.
Vous n'avez pas besoin d'appliquer Ansible à nouveau après un redémarrage manuel.
- hosts: proxysql
vars:
proxysql_use_official_repo: False
proxysql_restart_on_static_variables_change: False
proxysql_login_admin_host: 127.0.0.1
proxysql_login_admin_password: admin
proxysql_login_admin_port: 6032
proxysql_login_admin_user: admin
...
Problèmes connus ou : Bon à savoir
1) ProxySQL > 1.4.7 sur Ubuntu 16.04 (réglé)
Sur Ubuntu 16.04, Ansible (la version n'importe pas) / ProxySQL > 1.4.7 semble avoir des problèmes pour communiquer correctement via mysql-python
/ python-mysqldb
.
Erreur d'exemple :
"unable to modify server.. (1045, 'unrecognized token: \"\\'\\n AND compression = 0\\n AND weight = 1\\n AND use_ssl = 0\\n AND max_connections = 2000\\n AND max_latency_ms = 0\\n AND max_replication_lag = 5\"')"
Remarque :
J'ai effectué les petites recherches suivantes avec mysql-python
installé via pip
sur Ubuntu 16.04. Ne vous inquiétez pas, ça échoue aussi avec python-mysqldb
.
Dans la bibliothèque python MySQLdb, la méthode execute
(classe BaseCursor
) génère une requête de la manière suivante :
query = query % tuple([db.literal(item) for item in args])
db.literal
fait partie de la classe Connection
et renvoie des objets uniques sous forme de chaîne et plusieurs objets en tant que séquence tout en convertissant chaque séquence également.
def literal(self, o):
# ...
return self.escape(o, self.encoders)
self.escape
doit échapper tous les caractères spéciaux dans l'objet donné et utilise un dictionnaire de mappage pour fournir des fonctions de citation pour chaque type. C'est self.encoders
qui, par défaut et sans changement, utilise MySQLdb.converters
.
Le mappage pour une chaîne est StringType: Thing2Literal
. Ainsi, la chaîne sera échappée par la méthode Thing2Literal
.
def Thing2Literal(o, d):
# ...
return string_literal(o, d)
string_literal
doit convertir notre objet chaîne en littéral SQL. Cela signifie que tous les caractères SQL spéciaux sont échappés, et il est entouré de guillemets simples. En d'autres termes, il effectue :
"'%s'" % escape_string(str(obj))
En échappant la chaîne, les objets chaîne sont supprimés et renvoient juste un guillemet simple ('
).
Comme, dans les tests, rien d'autre que la version de ProxySQL n'a changé, je suppose qu'un changement dans ProxySQL (diff 1.4.7 vs. 1.4.8) est à l'origine de l'échec d'Ansible. Car ProxySQL lui-même - s'il n'est pas déclenché via Ansible - fonctionne parfaitement bien.
Enfin et surtout...
Ce problème est résolu en installant mysqlclient - qui est un fork de MySQLdb - via pip.
2) Packages pour Ubuntu > 16.04 (réglé)
ProxySQL lui-même ne fournit pas de "packages à jour" pour Ubuntu > 16.04. Ce rôle Ansible contourne cela en téléchargeant la version 16.04 pour Ubuntu > 16.04 et l'installant (ce comportement pourrait changer à l'avenir).
Il y a une dépendance de package pour libcrypto++6
et libssl1.0.0
à partir d'Ubuntu >= 18.04 (qui est résolu automatiquement).
3) Variables globales non dynamiques
ProxySQL a certaines global_variables
qui ne peuvent pas être modifiées pendant l'exécution (voir proxysql_non_dynamic_variables
dans vars/main.yml). Cela dit, ce n'est pas un problème puisque ce rôle ProxySQL s'en occupe (en générant proxysql.cnf
) et offre la possibilité de redémarrer automatiquement si une telle variable change (définissez proxysql_restart_on_static_variables_change
sur True
).
Ce rôle définit également cette valeur dans la base de données ProxySQL elle-même, et ici commence le problème :
Si vous changez plus d'une variable statique, techniquement tout va bien. ProxySQL redémarre et prend la nouvelle valeur de proxysql.cnf
. Mais seule la première valeur est changée dans la base de données elle-même.
Ce n'est pas un "gros problème" car la vraie valeur est correctement prise dans le fichier de configuration lui-même, mais vous verrez un ensemble de changements lors de la prochaine exécution d'Ansible qui va :
- Redémarrer ProxySQL une fois de plus
- Les tests d'idempotence échoueront (si vous ne démarrez pas à zéro)
Une solution potentielle pourrait être de ne pas définir proxysql_non_dynamic_variables
dans la base de données ProxySQL.
4) Clustering ProxySQL
Le clustering ProxySQL est toujours expérimental. Une citation de la documentation de clustering : "comme cette fonctionnalité est encore expérimentale, la table n'est pas automatiquement chargée depuis le disque".
Pour l'initialisation à partir du proxysql.cnf
, il est important que hostname
(évidemment) et port
(il ne prend pas la valeur par défaut) soient définis.
5) ProxySQL et le référentiel Percona sur CentOS...
...ne fonctionne pas en raison de quelques problèmes de dépendance.
Techniquement, nous avons besoin des packages suivants pour appliquer Ansible correctement :
proxysql_dependency_pkgs:
- MySQL-python
- mysql
Avec le référentiel Percona activé, les dépendances de package pour MySQL-python
et mysql
se chevauchent.
yum install MySQL-python
...
============================================================================================
Package Arch Version Repository Size
============================================================================================
Installing:
MySQL-python x86_64 1.2.5-1.el7 base 90 k
Installing for dependencies:
Percona-Server-shared-56 x86_64 5.6.43-rel84.3.el7 percona-release-x86_64 619 k
Transaction Summary
============================================================================================
Install 1 Package (+1 Dependent package)
yum install mysql
...
============================================================================================
Package Arch Version Repository Size
============================================================================================
Installing:
Percona-Server-client-57 x86_64 5.7.24-27.1.el7 percona-release-x86_64 6.8 M
Installing for dependencies:
Percona-Server-shared-57 x86_64 5.7.24-27.1.el7 percona-release-x86_64 748 k
Percona-Server-shared-compat-57 x86_64 5.7.24-27.1.el7 percona-release-x86_64 1.2 M
Transaction Summary
============================================================================================
Install 1 Package (+2 Dependent packages)
Comme vous pouvez le voir, MySQL-python
dépend de Percona-Server-shared-56
tandis que mysql
dépend de Percona-Server-shared-57
.
Tests
Des tests sont effectués avec Docker et docker_test_runner qui mettent en place les conteneurs suivants avec différents paramètres d'environnement :
- CentOS 7
- Debian 9 (Stretch)
- Ubuntu 16.04 (Xenial Xerus)
- Ubuntu 18.04 (Bionic Beaver)
Ansible 2.7.9 est installé sur tous les conteneurs et un playbook de test est appliqué.
Pour plus de détails et de vérifications supplémentaires, consultez la configuration de docker_test_runner et le point d'entrée Docker. Un aperçu général peut être trouvé dans le tableau suivant :
Distribution | Version | Référentiel officiel | Référentiel Percona | Package |
---|---|---|---|---|
CentOS | 7 | oui | non | 1.4.15 |
Debian | 9 | oui | oui | 1.4.15 |
Ubuntu | 16.04 | oui | oui | 1.4.15 |
Ubuntu | 18.04 | non | oui | 1.4.15 |
# Testez localement :
curl https://raw.githubusercontent.com/timorunge/docker-test-runner/master/install.sh | sh
./docker_test_runner.py -f tests/docker_test_runner.yml
Comme le temps de construction sur Travis est limité pour les dépôts publics, les tests automatisés sont limités à :
- CentOS 7
- Debian 8 (Jessie)
- Debian 9 (Stretch)
- Ubuntu 16.04 (Xenial Xerus)
- Ubuntu 18.04 (Bionic Beaver)
Dépendances
- proxysql_proxysql_servers.py qui est ajouté au dossier de la bibliothèque de ce rôle.
Licence
Licence BSD 3 clauses "Nouvelle" ou "Révisée"
Informations sur l'auteur
- Timo Runge
This role installs and configures ProxySQL - the high performance, high availability, protocol aware proxy for MySQL.
ansible-galaxy install timorunge.proxysql