vdzhorov.proxysql

proxysql


Diese Rolle ist momentan für ProxySQL >= v2.0.1 kompatibel, wenn Sie RHEL 8 verwenden. Wenn Sie die ProxySQL-Version 1.4.x installieren möchten, müssen Sie RHEL 7 oder eine frühere Version verwenden.

Diese Rolle ist nur mit Ansible 2.7.9 oder höher kompatibel, aufgrund eines Fehlers beim Umstieg von MySQLdb zu PyMySQL (#40123) im MySQL-Modul.

Die Version 0.3.0 ist mit Ansible 2.7.0 oder niedriger kompatibel.


Diese Rolle installiert und konfiguriert ProxySQL - den hochleistungsfähigen, hochverfügbaren Proxy für MySQL, der Protokollbewusstsein hat.

Seit Version 2.3.0 bietet Ansible ein Modul zur Konfiguration von ProxySQL an. Diese Ansible-Rolle nutzt diese Funktionalität, fügt jedoch einige (hoffentlich nützliche) Funktionen hinzu:

Bitte werfen Sie auch einen Blick auf den Abschnitt "Bekannte Probleme oder: Gut zu wissen" in diesem Dokument.

Voraussetzungen

Diese Rolle benötigt Ansible 2.5.0 oder höher.

Sie können einfach pip verwenden, um eine stabile Version zu installieren (und zu definieren):

pip install ansible==2.7.9

Alle Plattformanforderungen sind in der Metadaten-Datei aufgeführt.

Installation

ansible-galaxy install vdzhorov.proxysql

Rollenvariablen

Die Variablen, die an diese Rolle übergeben werden können. Für alle Variablen schauen Sie in defaults/main.yml.

# ProxySQL als Dienst aktivieren / deaktivieren.
# Typ: Bool
proxysql_service_enabled: True

# ProxySQL neu starten, wenn sich statische Variablen ändern. Eine Liste der statischen
# Variablen finden Sie unter `proxysql_non_dynamic_variables` in `vars/main.yml`.
# Typ: Bool
proxysql_restart_on_static_variables_change: True

# Repository

# Wenn sowohl `proxysql_use_official_repo` als auch `proxysql_use_percona_repo` auf
# `False` gesetzt sind, wird das Modul automatisch die definierte
# `proxysql_version` als Paket von Github herunterladen und installieren.

# Offizielles ProxySQL-Repository verwenden.
# Typ: Bool
proxysql_use_official_repo: True

# Percona-Repository verwenden.
# Typ: Bool
proxysql_use_percona_repo: False

# Definieren Sie die Repository-Version für das Percona-Repository.
# Typ: Str
proxysql_percona_release: latest

# Die ProxySQL-Version, die installiert werden soll, wenn das ProxySQL-Repository
# nicht verwendet wird.
# Typ: Int
proxysql_version: 1.4.15

# Konfiguration

# Der Pfad, wo ProxySQL seine Datenbank und Logs speichern soll.
# Typ: Str
proxysql_datadir: /var/lib/proxysql

# Definieren Sie die proxysql.cnf-Vorlage
# Typ: Str
proxysql_proxysql_cnf_template: proxysql.cnf.j2

# Definieren Sie die proxysql-admin.cnf-Vorlage
# Typ: Str
proxysql_proxysql_admin_cnf_template: proxysql-admin.cnf.j2

# Die Anmeldevariablen für die Konfiguration von ProxySQL selbst. Sie werden nur
# innerhalb der `main.yml`-Datei und hier verwendet, um die Konfiguration zu vereinfachen.
# Typ: Str
proxysql_login_admin_host: 127.0.0.1
proxysql_login_admin_password: admin
proxysql_login_admin_port: 6032
proxysql_login_admin_user: admin

# Globale Variablen
# `admin_variables` in `proxysql_global_variables_kv`: enthält globale
# Variablen, die die Funktionalität der Admin-Schnittstelle steuern.
# `admin_variables` sind mit `admin-` vorangestellt.
# `mysql_variables`: in `proxysql_global_variables_kv` enthält globale
# Variablen, die die Funktionalität zur Verarbeitung des eingehenden
# MySQL-Verkehrs steuern.
# `mysql_variables` sind mit `mysql-` vorangestellt.

# Die Variablen sollten entweder eine Zeichenkette oder eine Ganzzahl sein. Sie sollten
# einen Booleschen Wert als Zeichenkette kennzeichnen, z.B. "True" oder "False".

# Für eine vollständige Referenz schauen Sie bitte unter:
# https://github.com/sysown/proxysql/wiki/Global-variables

# Format:
# Typ: 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:
# Typ: Dict
# proxysql_global_variables_kv:
#   key: value
# z.B.:
# 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-interfaces: 0.0.0.0:6033
#   mysql-commands_stats: "True"
#   mysql-threads: 4
proxysql_global_variables_kv: {}

# Backend-Server
# `proxysql_backend_servers`: enthält Zeilen für die mysql_servers-Tabelle aus
# der Admin-Schnittstelle. Diese definieren im Grunde die Backend-Server, zu
# denen der eingehende MySQL-Verkehr geleitet wird.

# Für eine vollständige Referenz siehe:
# https://docs.ansible.com/ansible/latest/modules/proxysql_backend_servers_module.html
# Wichtig: Dieses Modul verwendet `hostgroup` (was der korrekte Name in der
# Datenbank ist) anstelle von `hostgroup_id` (was der Standard im Ansible-Modul ist)!

# Format:
# Typ: 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
#   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
proxysql_backend_servers: {}

# ProxySQL-Server
# `proxysql_proxysql_servers`: enthält Zeilen für die proxysql_servers-Tabelle
# aus der Admin-Schnittstelle. Diese definieren im Grunde die ProxySQL-Server,
# die für Clustering verwendet werden.

# Für eine vollständige Referenz siehe:
# `library/proxysql_proxysql_servers.py`, da dies kein Teil des
# offiziellen Ansible-Pakets ist.

# Format:
# Typ: 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-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 }}"
#     weight: 0
proxysql_proxysql_servers: {}

# Replikations-Hostgruppen
# `proxysql_replication_hostgroups`: stellt ein Paar von writer_hostgroup
# und reader_hostgroup dar. ProxySQL überwacht den Wert von read_only für alle
# Server in den angegebenen Hostgruppen und weist den Server basierend auf dem Wert
# von read_only entweder der Writer- oder Reader-Hostgruppe zu.

# Für eine vollständige Referenz siehe:
# https://docs.ansible.com/ansible/latest/modules/proxysql_replication_hostgroups_module.html

# Format:
# Typ: 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: {}

# Benutzer
# `proxysql_mysql_users`: enthält Zeilen für die mysql_users-Tabelle aus der
# Admin-Schnittstelle. Diese definieren im Grunde die Benutzer, die sich mit dem
# Proxy verbinden können, und die Benutzer, mit denen der Proxy sich mit den Backend-Servern verbinden kann.

# Für eine vollständige Referenz siehe:
# http://docs.ansible.com/ansible/latest/proxysql_mysql_users_module.html

# Format:
# Typ: 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: {}

# Abfrage-Regeln
# `proxysql_query_rules` enthält Zeilen für die mysql_query_rules-Tabelle aus
# der Admin-Schnittstelle. Diese definieren im Grunde die Regeln, die verwendet werden, um den
# eingehenden MySQL-Verkehr entsprechend verschiedenen Kriterien (gematchte Muster, Benutzer,
die die Abfrage ausführen usw.) zu klassifizieren und zu leiten.

# Für eine vollständige Referenz siehe:
# http://docs.ansible.com/ansible/latest/proxysql_query_rules_module.html

# Format:
# Typ: 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
#   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
proxysql_query_rules: {}

# Percona ProxySQL Admin
# Die ProxySQL-Admin-Lösung (proxysql-admin) konfiguriert Percona
# XtraDB-Clusterknoten in ProxySQL.

# Für eine vollständige Referenz siehe:
# https://github.com/percona/proxysql-admin-tool

# Format:
# Typ: 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 }}"

Beispiele

1) Vollständiges Konfigurationsbeispiel

Hier sehen Sie ein vollständiges Beispiel einer ProxySQL-Konfiguration. In diesem Fall wird die Rolle das 1.4.15-Paket direkt herunterladen und nicht das Repository verwenden (proxysql_use_official_repo ist auf False gesetzt).

Dies ist im Grunde (mit einigen kleinen Änderungen) die test.yml Datei, die für Tests verwendet wird.

- 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-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 aus dem offiziellen Repository

Verwenden Sie das ProxySQL-Repository (proxysql_use_official_repo ist auf True gesetzt). ProxySQL selbst stellt keine Pakete im Repository für Ubuntu > 16.04 zur Verfügung.

Setzen Sie einfach proxysql_use_official_repo auf False für neuere Ubuntu-Versionen oder verwenden Sie das Percona-Repository.

Werfen Sie einen Blick in den Testabschnitt für die Abdeckung des offiziellen Repositorys.

- 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 aus dem Percona-Repository

Verwenden Sie das ProxySQL-Repository (proxysql_use_percona_repo ist auf True gesetzt).

Schauen Sie sich den Testabschnitt für die Abdeckung des Percona-Repositorys an.

- 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 aus deb- oder rpm-Paket

Sie können ProxySQL direkt von einer GitHub-Version installieren. Definieren Sie einfach die proxysql_version. Setzen Sie proxysql_use_official_repo und proxysql_use_percona_repo auf 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) ProxySQL nach Änderung statischer Variablen nicht neu starten

Wenn Sie ProxySQL nach einer Konfigurationsänderung statischer Variablen selbst neu starten möchten, müssen Sie proxysql_restart_on_static_variables_change auf False setzen.

In diesem Fall stoßen Sie auf ein bekanntes Problem, was keinen großen Stress verursacht. In diesem Fall werden die Idempotenztests fehlschlagen.

Sie müssen Ansible nach einem manuellen Neustart nicht erneut ausführen.

- 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
    ...

Bekannte Probleme oder: Gut zu wissen

1) ProxySQL > 1.4.7 auf Ubuntu 16.04 (behebt)

Auf Ubuntu 16.04 hat Ansible (Versionsnummer spielt keine Rolle) / ProxySQL > 1.4.7 anscheinend Probleme, korrekt über mysql-python / python-mysqldb zu kommunizieren.

Beispiel-Fehler:

"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\"')"

Hinweis:

Ich habe eine kleine Untersuchung mit mysql-python, das über pip auf Ubuntu 16.04 installiert wurde, durchgeführt. Keine Sorge, es schlägt auch mit python-mysqldb fehl.


In der MySQLdb-Python-Bibliothek erzeugt die Methode execute (Klasse BaseCursor) eine Abfrage auf folgende Weise:

query = query % tuple([db.literal(item) for item in args])

db.literal ist Teil der Connection-Klasse und gibt einzelne Objekte als Zeichenkette zurück und mehrere Objekte als Sequenz, während es jede Sequenz ebenso umwandelt.

def literal(self, o):
  # ...
  return self.escape(o, self.encoders)

self.escape sollte alle Sonderzeichen im gegebenen Objekt escapen und verwendet ein Mapping-Dict, um Quoting-Funktionen für jeden Typ bereitzustellen. Dieses ist self.encoders, das - standardmäßig und ohne unterschiedliche Setzung - MySQLdb.converters verwendet.

Die Zuordnung für eine Zeichenkette ist StringType: Thing2Literal. Somit wird die Zeichenkette mit der Methode Thing2Literal eskapiert.

def Thing2Literal(o, d):
  # ...
  return string_literal(o, d)

string_literal sollte unser Zeichenobjekt in einen SQL-Zeichenliteral umwandeln. Das bedeutet, dass alle speziellen SQL-Zeichen escaped werden und es wird in einfache Anführungszeichen eingeschlossen. Mit anderen Worten, es führt aus:

"'%s'" % escape_string(str(obj))

Beim Escapen der Zeichenfolge werden die Zeichenobjekte gelöscht und es bleibt nur ein einfaches Zitat (') zurück.

Da sich in den Tests nichts außer der Version von ProxySQL geändert hat, gehe ich davon aus, dass eine Änderung in ProxySQL (diff 1.4.7 vs. 1.4.8) dazu führt, dass Ansible fehlschlägt. Denn ProxySQL selbst - wenn es nicht über Ansible ausgelöst wird - funktioniert einwandfrei.


Zu guter Letzt...

Dieses Problem wird durch die Installation von mysqlclient geregelt – einer Abspaltung von MySQLdb – über pip.

2) Pakete für Ubuntu > 16.04 (behebt)

ProxySQL selbst bietet keine "aktuellen" Pakete für Ubuntu > 16.04 an. Diese Ansible-Rolle umgeht dies, indem sie die 16.04-Version für Ubuntu > 16.04 herunterlädt und diese installiert (dieses Verhalten könnte sich in Zukunft ändern).

Es gibt eine Paketabhängigkeit für libcrypto++6 und libssl1.0.0 ab Ubuntu >= 18.04 (was automatisch geklärt wird).

3) Nicht dynamische globale Variablen

ProxySQL hat einige global_variables, die zur Laufzeit nicht geändert werden können (siehe proxysql_non_dynamic_variables in vars/main.yml). Damit ist dies allein nicht problematisch, da diese ProxySQL-Rolle sich darum kümmert (indem sie proxysql.cnf generiert) und die Möglichkeit bietet, automatisch neu zu starten, wenn eine solche Variable geändert wird (setzen Sie proxysql_restart_on_static_variables_change auf True).

Diese Rolle setzt auch diesen Wert in der ProxySQL-Datenbank selbst, und hier beginnt das Problem:

Wenn Sie mehr als eine statische Variable ändern, ist technisch alles in Ordnung. ProxySQL wird neu gestartet und nimmt den neuen Wert aus proxysql.cnf. Aber nur der erste Wert wird in der Datenbank selbst geändert.

Es ist kein "großes Problem", da der tatsächliche Wert korrekt aus der Konfigurationsdatei entnommen wird, aber Sie werden im nächsten Ansible-Lauf einen Änderungsdatensatz sehen, der:

  • ProxySQL einmal mehr neu startet
  • Idempotenztests schlagen fehl (wenn Sie nicht von Grund auf neu starten)

Eine potenzielle Lösung könnte sein, proxysql_non_dynamic_variables nicht in der ProxySQL-Datenbank festzulegen.

4) ProxySQL-Clustering

Das ProxySQL-Clustering ist weiterhin experimentell. Ein Zitat aus der Clustering-Dokumentation: "da diese Funktion weiterhin experimentell ist, wird die Tabelle nicht automatisch von der Festplatte geladen".

Für die Initialisierung aus proxysql.cnf ist es wichtig, dass hostname (offensichtlich) und port (da er den Standardwert nicht annimmt) definiert sind.

5) ProxySQL und das Percona-Repository auf CentOS...

...funktioniert nicht wegen einiger Abhängigkeitsprobleme.

Technisch benötigen wir die folgenden Pakete, um Ansible korrekt anzuwenden:

proxysql_dependency_pkgs:
  - MySQL-python
  - mysql

Mit dem aktivierten Percona-Repository gibt es Konflikte bei den Paketabhängigkeiten für MySQL-python und mysql.

yum install MySQL-python
...
============================================================================================
 Paket                    Arch     Version                 Repository                Größe
============================================================================================
 Installiere:
  MySQL-python              x86_64   1.2.5-1.el7             base                      90 k
 Installiert aufgrund von Abhängigkeiten:
  Percona-Server-shared-56  x86_64   5.6.43-rel84.3.el7      percona-release-x86_64   619 k

Transaktionsübersicht
============================================================================================
Installiere 1 Paket (+1 abhängiges Paket)
yum install mysql
...

============================================================================================
 Paket                          Arch    Version             Repository               Größe
============================================================================================
 Installiere:
  Percona-Server-client-57         x86_64  5.7.24-27.1.el7    percona-release-x86_64  6.8 M
 Installiert aufgrund von Abhängigkeiten:
  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

Transaktionsübersicht
============================================================================================
Installiere 1 Paket (+2 abhängige Pakete)

Wie Sie sehen können, ist MySQL-python von Percona-Server-shared-56 abhängig, während mysql von Percona-Server-shared-57 abhängig ist.

Testen

Build Status

Tests werden mit Docker und docker_test_runner durchgeführt, die die folgenden Container mit unterschiedlichen Umgebungs Einstellungen hochfahren:

  • CentOS 7
  • Debian 9 (Stretch)
  • Ubuntu 16.04 (Xenial Xerus)
  • Ubuntu 18.04 (Bionic Beaver)

Ansible 2.7.9 ist auf allen Containern installiert und ein Test-Playbook wird angewendet.

Für weitere Details und zusätzliche Überprüfungen werfen Sie einen Blick auf die docker_test_runner-Konfiguration und den Docker-Entrypoint. Eine Übersicht finden Sie in der folgenden Tabelle:

Distribution Version Offizielles Repository Percona Repository Paket
CentOS 7 ja nein 1.4.15
Debian 9 ja ja 1.4.15
Ubuntu 16.04 ja ja 1.4.15
Ubuntu 18.04 nein ja 1.4.15
# Lokales Testen:
curl https://raw.githubusercontent.com/timorunge/docker-test-runner/master/install.sh | sh
./docker_test_runner.py -f tests/docker_test_runner.yml

Da die Build-Zeit auf Travis für öffentliche Repositories begrenzt ist, sind die automatisierten Tests auf Folgendes beschränkt:

  • CentOS 7
  • Debian 8 (Jessie)
  • Debian 9 (Stretch)
  • Ubuntu 16.04 (Xenial Xerus)
  • Ubuntu 18.04 (Bionic Beaver)

Abhängigkeiten

Lizenz

BSD 3-Klausel "Neue" oder "Überarbeitete" Lizenz

Autoreninformationen

  • Timo Runge
Über das Projekt

This role is a fork from timorunge.proxysql. The role installs and configures ProxySQL - the high performance, high availability, protocol aware proxy for MySQL.

Installieren
ansible-galaxy install vdzhorov.proxysql
GitHub Repository
Lizenz
bsd-3-clause
Downloads
114
Besitzer
Sysadmin and DevOps enthusiast.