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:
- Automatische Installation für verschiedene Betriebssysteme
- (Vor-)Erzeugung von proxysql.cnf
- Verwaltung eines ProxySQL-Clusters (mit einem benutzerdefinierten Modul das die Funktionalität zur Konfiguration von ProxySQL-Servern hinzufügt)
- Unterscheidung zwischen dynamischen und statischen
global_variables
- ProxySQL neu starten, falls erforderlich
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
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
- proxysql_proxysql_servers.py welches im Bibliotheksordner dieses Rollenpakets hinzugefügt wurde.
Lizenz
BSD 3-Klausel "Neu" oder "Überarbeitet" Lizenz
Autor Informationen
- Timo Runge
This role installs and configures ProxySQL - the high performance, high availability, protocol aware proxy for MySQL.
ansible-galaxy install timorunge.proxysql