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:
- Automatische Installation für verschiedene Betriebssysteme
- (Vor-)Generierung der 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 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
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
- proxysql_proxysql_servers.py das im Bibliotheksordner dieser Rolle hinzugefügt wurde.
Lizenz
BSD 3-Klausel "Neue" oder "Überarbeitete" Lizenz
Autoreninformationen
- Timo Runge
This role is a fork from timorunge.proxysql. The role installs and configures ProxySQL - the high performance, high availability, protocol aware proxy for MySQL.
ansible-galaxy install vdzhorov.proxysql