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 :

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

Build Status

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

Licence

Licence BSD 3 clauses "Nouvelle" ou "Révisée"

Informations sur l'auteur

  • Timo Runge
À propos du projet

This role installs and configures ProxySQL - the high performance, high availability, protocol aware proxy for MySQL.

Installer
ansible-galaxy install timorunge.proxysql
Licence
bsd-3-clause
Téléchargements
1.7k
Propriétaire