timorunge.proxysql

proxysql


Derzeit ist dieses Rollenpaket nicht kompatibel mit ProxySQL >= v2.0.1.

Dieses Rollenpaket ist nur kompatibel mit Ansible 2.7.9 oder höher aufgrund eines Fehlers bei der Migration von MySQLdb zu PyMySQL (#40123) im MySQL-Modul Utils.

Die Version 0.3.0 ist kompatibel mit Ansible 2.7.0 oder niedriger.


Dieses Rollenpaket installiert und konfiguriert ProxySQL - den leistungsstarken, hochverfügbaren und protokollbewussten Proxy für MySQL.

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

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

Anforderungen

Dieses Rollenpaket 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 timorunge.proxysql

Rollenvariablen

Die Variablen, die an dieses Rollenpaket übergeben werden können. Für alle Variablen siehe defaults/main.yml.

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

# ProxySQL neu starten, wenn sich statische Variablen ändern. Eine Liste von 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.

# Das offizielle ProxySQL-Repository verwenden.
# Typ: Bool
proxysql_use_official_repo: True

# Das 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 Speicherort, an dem ProxySQL seine Datenbank und Protokolle 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 Anmeldedaten für die Konfiguration von ProxySQL selbst. Sie werden nur
# in der Datei `main.yml` 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 Administrationsoberfläche steuern.
# `admin_variables` beginnen mit `admin-`.
# `mysql_variables`: in `proxysql_global_variables_kv` enthält globale
# Variablen, die die Funktionalität zur Verarbeitung des eingehenden
# MySQL-Verkehrs steuern.
# `mysql_variables` beginnen mit `mysql-`.

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

# Für eine vollständige Referenz siehe:
# 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 von
# der Administrationsoberfläche. 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 die Standardbezeichnung 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
# von der Administrationsoberfläche. Diese definieren die ProxySQL-Server,
# die für das Clustering verwendet werden.

# Für eine vollständige Referenz siehe:
# `library/proxysql_proxysql_servers.py`, da dies nicht 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`: stellen ein Paar aus writer_hostgroup
# und reader_hostgroup dar. ProxySQL überwacht den Wert von read_only für alle
# Server in den angegebenen Hostgruppen und weist die 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 von der
# Administrationsoberfläche. Diese definieren im Grunde die Benutzer, die sich mit dem
# Proxy verbinden können, und die Benutzer, mit denen der Proxy 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 von
# der Administrationsoberfläche. Diese definieren die Regeln, die verwendet werden,
# um den eingehenden MySQL-Verkehr je nach verschiedenen Kriterien (gematchte Muster,
# Benutzer, die die Abfrage ausgeführt haben usw.) zu klassifizieren und routen.

# 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 (proxysql-admin) Lösung konfiguriert Percona
# XtraDB-Cluster-Knoten 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 für eine ProxySQL-Konfiguration. In diesem Fall wird das Rollenpaket das 1.4.15-Paket direkt herunterladen und nicht das Repository benutzen (proxysql_use_official_repo ist auf False gesetzt).

Dies ist im Grunde genommen (mit einigen kleinen Änderungen) die Datei test.yml, 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-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 aus dem offiziellen Repository

Verwenden Sie das ProxySQL-Repository (proxysql_use_official_repo ist auf True). 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 auf den Abschnitt Tests für die Abdeckung des offiziellen Repositories.

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

Werfen Sie einen Blick auf den Abschnitt Tests für die Abdeckung des Percona Repositories.

- 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 nicht schlimm ist. In diesem Fall werden die Tests zur Idempotenz fehlschlagen.

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

- 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 (behoben)

Auf Ubuntu 16.04 hat Ansible (die Version 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 folgende kleine Recherchen mit mysql-python, installiert über pip auf Ubuntu 16.04 durchgeführt. Keine Sorge, es schlägt auch mit python-mysqldb fehl.


In der Python-Bibliothek MySQLdb generiert 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 Klasse Connection und gibt einzelne Objekte als Zeichenkette und mehrere Objekte als Sequenz zurück, während sie jede Sequenz ebenfalls konvertiert.

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

self.escape sollte alle Sonderzeichen im gegebenen Objekt escapen und verwendet ein Mapping-Dictionary, um Zitatfunktionen für jeden Typ bereitzustellen. Dies sind self.encoders, die - standardmäßig und nicht anders gesetzt - MySQLdb.converters verwenden.

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

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

string_literal sollte unser Zeichenobjekt in ein SQL-Zeichenliterale umwandeln. Dies bedeutet, dass alle besonderen SQL-Zeichen escaped und in einfache Anführungszeichen eingeschlossen werden. Anders ausgedrückt, es führt Folgendes aus:

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

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

Da in den Tests nichts außer der Version von ProxySQL geändert wurde, 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 kann behoben werden, indem mysqlclient - ein Fork von MySQLdb - über pip installiert wird.

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

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

Ab Ubuntu >= 18.04 gibt es eine Paketabhängigkeit für libcrypto++6 und libssl1.0.0 (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). Das allein ist kein Problem, da dieses ProxySQL-Rollenpaket dies berücksichtigt (indem es proxysql.cnf generiert) und die Möglichkeit bereitstellt, automatisch neu zu starten, wenn eine solche Variable geändert wird (setzen Sie proxysql_restart_on_static_variables_change auf True).

Dieses Rollenpaket legt auch diesen Wert in der ProxySQL-Datenbank selbst fest und hier beginnt das Problem:

Wenn Sie mehr als einen statischen Wert ändern, ist im Grunde 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 selbst übernommen wird, aber Sie werden in der nächsten Ansible-Ausführung einen Änderungsdatensatz sehen, der:

  • ProxySQL erneut neu startet
  • Tests zur Idempotenz fehlschlagen, (wenn Sie es nicht von Grund auf bootstrappen).

Eine mögliche Lösung könnte sein, proxysql_non_dynamic_variables nicht in der ProxySQL-Datenbank zu setzen.

4) ProxySQL-Clustering

Das ProxySQL-Clustering ist noch experimentell. Ein Zitat aus der Clustering-Dokumentation: "da diese Funktionalität noch 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 (es nimmt nicht den Standardwert) definiert sind.

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

...funktioniert nicht aufgrund 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 treten die Paketabhängigkeiten für MySQL-python und mysql in Konflikt.

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

Transaktionszusammenfassung
============================================================================================
Installiere  1 Paket (+1 abhängiges Paket)
yum install mysql
...

============================================================================================
 Paket                          Arch    Version             Repository               Größe
============================================================================================
 Installation:
  Percona-Server-client-57         x86_64  5.7.24-27.1.el7    percona-release-x86_64  6.8 M
 Installation für 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

Transaktionszusammenfassung
============================================================================================
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ängt.

Tests

Build Status

Tests werden mit Docker und docker_test_runner gemacht, das die folgenden Container mit verschiedenen Umgebungsparametern erstellt:

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

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

Für weitere Details und zusätzliche Überprüfungen werfen Sie einen Blick auf die Konfiguration des docker_test_runner 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
# Lokale Tests:
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 Bauzeit bei Travis für öffentliche Repositories begrenzt ist, sind die automatisierten Tests auf:

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

Abhängigkeiten

Lizenz

BSD 3-Klausel "Neu" oder "Überarbeitet" Lizenz

Autor Informationen

  • Timo Runge
Über das Projekt

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

Installieren
ansible-galaxy install timorunge.proxysql
Lizenz
bsd-3-clause
Downloads
1.7k
Besitzer