timorunge.proxysql
proxysql
Ta rola nie jest kompatybilna z ProxySQL >= v2.0.1.
Ta rola jest kompatybilna tylko z Ansible 2.7.9 lub nowszym z powodu błędu przy migracji z MySQLdb do PyMySQL (#40123) w module MySQL utils.
Wersja 0.3.0 jest kompatybilna z Ansible 2.7.0 lub starszym.
Ta rola instaluje i konfiguruje ProxySQL - wysokowydajny, niezwykle dostępny, świadomy protokołu proxy dla MySQL.
Od wersji 2.3.0 Ansible dostarcza module do konfiguracji ProxySQL sama. Ta rola Ansible korzysta z tej funkcjonalności, dodając kilka (mam nadzieję, że przydatnych) funkcji dodatkowych:
- Automatyczna instalacja dla różnych systemów operacyjnych
- (Wstępne) generowanie proxysql.cnf
- Zarządzanie klastrem ProxySQL (z niestandardowym modułem który dodaje funkcjonalność konfigurowania serwerów ProxySQL)
- Rozróżnienie między dynamicznymi a statycznymi
global_variables
- ponowne uruchomienie ProxySQL w razie potrzeby
Proszę również zapoznać się z sekcją "Znane problemy lub: Dobrze wiedzieć" w tym dokumencie.
Wymagania
Ta rola wymaga Ansible 2.5.0 lub nowszego.
Możesz po prostu użyć pip, aby zainstalować (i zdefiniować) stabilną wersję:
pip install ansible==2.7.9
Wszystkie wymagania platformowe są wymienione w pliku metadanych.
Instalacja
ansible-galaxy install timorunge.proxysql
Zmienne roli
Zmienne, które mogą być przekazywane do tej roli. Po wszystkie zmienne, zapoznaj się z defaults/main.yml.
# Włącz / wyłącz ProxySQL jako usługę.
# Typ: Bool
proxysql_service_enabled: True
# Restartuj ProxySQL, jeśli zmieniają się zmienne statyczne. Lista statycznych
# zmiennych znajduje się w `proxysql_non_dynamic_variables` w `vars/main.yml`.
# Typ: Bool
proxysql_restart_on_static_variables_change: True
# Repozytorium
# Jeśli obydwa, `proxysql_use_official_repo` i `proxysql_use_percona_repo` są ustawione
# na `False`, moduł automatycznie pobierze zdefiniowaną
# `proxysql_version` jako pakiet z Github i zainstaluje to samo.
# Użyj oficjalnego repozytorium ProxySQL.
# Typ: Bool
proxysql_use_official_repo: True
# Użyj repozytorium Percona.
# Typ: Bool
proxysql_use_percona_repo: False
# Zdefiniuj wersję repozytorium dla repozytorium Percona.
# Typ: Str
proxysql_percona_release: latest
# Wersja ProxySQL, która powinna być zainstalowana, jeśli nie korzystasz z repozytorium ProxySQL.
# Typ: Int
proxysql_version: 1.4.15
# Konfiguracja
# Ścieżka, w której ProxySQL powinien zapisywać swoją bazę danych i logi.
# Typ: Str
proxysql_datadir: /var/lib/proxysql
# Zdefiniuj szablon proxysql.cnf
# Typ: Str
proxysql_proxysql_cnf_template: proxysql.cnf.j2
# Zdefiniuj szablon proxysql-admin.cnf
# Typ: Str
proxysql_proxysql_admin_cnf_template: proxysql-admin.cnf.j2
# Zmienne logowania do konfiguracji samego ProxySQL. Są używane wyłącznie
# wewnątrz pliku `main.yml` i tutaj, aby uprościć konfigurację.
# 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
# Zmienne globalne
# `admin_variables` w `proxysql_global_variables_kv`: zawiera globalne
# zmienne, które kontrolują funkcjonalność interfejsu admina.
# `admin_variables` mają prefiks `admin-`.
# `mysql_variables`: w `proxysql_global_variables_kv` zawiera globalne
# zmienne, które kontrolują funkcjonalność obsługi przychodzącego
# ruchu MySQL.
# `mysql_variables` mają prefiks `mysql-`.
# Zmienne powinny być albo napisem, albo liczbą całkowitą. Należy oznaczyć
# wartość logiczną jako ciąg, np. "True" lub "False".
# Aby uzyskać pełne odniesienie, zapoznaj się z:
# 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:
# klucz: wartość
# np.:
# proxysql_global_variables_kv:
# admin-admin_credentials: "{{ proxysql_login_admin_user }}:{{ proxysql_login_admin_password }}"
# admin-mysql_ifaces: "{{ proxysql_login_admin_host }}:{{ proxysql_login_admin_port }}"
# mysql-commands_stats: "True"
# mysql-threads: 4
proxysql_global_variables_kv: {}
# Serwery zaplecza
# `proxysql_backend_servers`: zawiera wiersze dla tabeli mysql_servers z
# interfejsu admina. Zasadniczo, definiują one serwery zaplecza, na które
# kierowany jest przychodzący ruch MySQL.
# Aby uzyskać pełne odniesienie, zapoznaj się z:
# https://docs.ansible.com/ansible/latest/modules/proxysql_backend_servers_module.html
# Ważne: Ten moduł używa `hostgroup` (co jest poprawną nazwą w
# bazie danych) zamiast `hostgroup_id` (co jest domyślnie w module Ansible)!
# 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: {}
# Serwery ProxySQL
# `proxysql_proxysql_servers`: zawiera wiersze dla tabeli proxysql_servers
# z interfejsu admina. Zasadniczo, definiują one serwery ProxySQL,
# które są używane do klastrowania.
# Aby uzyskać pełne odniesienie, zapoznaj się z:
# `library/proxysql_proxysql_servers.py`, ponieważ nie jest to część
# oficjalnego pakietu Ansible.
# 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: {}
# Hostgroupy replikacji
# `proxysql_replication_hostgroups`: reprezentują parę writer_hostgroup
# i reader_hostgroup. ProxySQL będzie monitorować wartość read_only we wszystkich
# serwerach w określonych grupach hostów, a na podstawie wartości read_only
# przypisze serwer do grupy hostów piszących lub czytających.
# Aby uzyskać pełne odniesienie, zapoznaj się z:
# 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: {}
# Użytkownicy
# `proxysql_mysql_users`: zawiera wiersze dla tabeli mysql_users z
# interfejsu admina. Zasadniczo, definiują one użytkowników, którzy mogą łączyć się z
# proxy, oraz użytkowników, za pomocą których proxy może łączyć się z serwerami zaplecza.
# Aby uzyskać pełne odniesienie, zapoznaj się z:
# 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: {}
# Reguły zapytań
# `proxysql_query_rules` zawiera wiersze dla tabeli mysql_query_rules z
# interfejsu admina. Zasadniczo, definiują one reguły używane do klasyfikacji i
# kierowania przychodzącym ruchem MySQL, zgodnie z różnymi kryteriami (wzorcami
# dopasowanymi, użytkownikiem używanym do uruchomienia zapytania itd.).
# Aby uzyskać pełne odniesienie, zapoznaj się z:
# 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: {}
# Narzędzie zarządzania ProxySQL Percona
# Rozwiązanie ProxySQL Admin (proxysql-admin) konfiguruje węzły klastra
# Percona XtraDB w ProxySQL.
# Aby uzyskać pełne odniesienie, zapoznaj się z:
# 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 }}"
Przykłady
1) Przykład pełnej konfiguracji
Tutaj możesz zobaczyć pełny przykład konfiguracji ProxySQL. W tym przypadku
rola pobierze pakiet 1.4.15
bezpośrednio i nie użyje repozytorium
(proxysql_use_official_repo
ustawione na False
).
Jest to zasadniczo (z pewnymi drobnymi zmianami) plik test.yml używany do testów.
- 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) Instalacja z oficjalnego repozytorium
Użyj repozytorium ProxySQL (proxysql_use_official_repo
ustawione na True
).
ProxySQL samodzielnie nie udostępnia pakietów w repozytorium dla Ubuntu > 16.04.
Po prostu ustaw proxysql_use_official_repo
na False
dla nowszych wydań Ubuntu
lub użyj repozytorium Percona.
Zobacz sekcję testowania dla zasięgu oficjalnego repozytorium.
- 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) Instalacja z repozytorium Percona
Użyj repozytorium ProxySQL (proxysql_use_percona_repo
ustawione na True
).
Zobacz sekcję testowania dla zasięgu repozytorium Percona.
- hosts: proxysql
vars:
proxysql_use_official_repo: False
proxysql_use_percona_repo: True
proxysql_login_admin_host: 127.0.0.1
proxysql_login_admin_password: admin
proxysql_login_admin_port: 6032
proxysql_login_admin_user: admin
...
4) Instalacja z pakietu deb lub rpm
Możesz zainstalować ProxySQL bezpośrednio z
release na GitHubie. Po prostu zdefiniuj
proxysql_version
. Ustaw proxysql_use_official_repo
oraz
proxysql_use_percona_repo
na 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) Nie restartuj ProxySQL po zmianie statycznej zmiennej
Jeśli chcesz zrestartować ProxySQL samodzielnie po zmianie konfiguracji statycznych
zmiennych, musisz ustawić proxysql_restart_on_static_variables_change
na
False
.
W tym przypadku napotykasz znany problem, który nie jest dramatyczny. W takim przypadku testy idempotencji będą nieudane.
Nie musisz ponownie stosować Ansible po ręcznym restarcie.
- 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
...
Znane problemy lub: Dobrze wiedzieć
1) ProxySQL > 1.4.7 na Ubuntu 16.04 (naprawione)
Na Ubuntu 16.04 Ansible (wersja nie ma znaczenia) / ProxySQL > 1.4.7 wydaje się
mieć problemy z poprawną komunikacją za pomocą mysql-python
/
python-mysqldb
.
Przykład błędu:
"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\"')"
Uwaga:
Przeprowadziłem małe badania z mysql-python
zainstalowanym za pomocą pip
na Ubuntu 16.04. Nie martw się, to samo występuje także z python-mysqldb
.
W bibliotece Pythona MySQLdb metoda execute
(klasa BaseCursor
)
generuje zapytanie w następujący sposób:
query = query % tuple([db.literal(item) for item in args])
db.literal
jest częścią klasy Connection
i zwraca pojedyncze obiekty jako ciąg,
a wiele obiektów jako sekwencję, jednocześnie konwertując każdą sekwencję.
def literal(self, o):
# ...
return self.escape(o, self.encoders)
self.escape
powinno uciekać wszystkie specjalne znaki w danym obiekcie, wykorzystując
słownik mapujący do zapewnienia funkcji cytujących dla każdego typu. To jest self.encoders
, który - domyślnie i bez ustawienia inaczej - korzysta z MySQLdb.converters
.
Mapowanie dla ciągu to StringType: Thing2Literal
. Więc ciąg będzie
ukrywany metodą Thing2Literal
.
def Thing2Literal(o, d):
# ...
return string_literal(o, d)
string_literal
powinno konwertować nasz obiekt ciągu na literał SQL. Oznacza to, że wszystkie
specjalne znaki SQL są ukrywane i jest on zamykany w pojedynczych cudzysłowach.
Innymi słowy, wykonuje:
"'%s'" % escape_string(str(obj))
Podczas uciekania ciągu, obiekty ciągów są usuwane i zwracają tylko pojedynczy cudzysłów ('
).
Ponieważ w testach zmieniła się tylko wersja ProxySQL, zakładam, że zmiana w ProxySQL (diff 1.4.7 vs. 1.4.8) powoduje, że Ansible nie działa. Ponieważ ProxySQL sam w sobie - jeśli nie jest wyzwalany przez Ansible - działa bardzo dobrze.
Na koniec...
Ten problem został rozwiązany przez zainstalowanie mysqlclient - który jest forkiem MySQLdb za pomocą pip.
2) Pakiety dla Ubuntu > 16.04 (naprawione)
ProxySQL samodzielnie nie udostępnia "aktualnych" pakietów dla Ubuntu > 16.04. Ta rola Ansible omija to, pobierając wydanie 16.04 dla Ubuntu > 16.04 i instalując to samo (ta funkcjonalność może się zmienić w przyszłości).
Istnieje zależność pakietu dla libcrypto++6
i libssl1.0.0
począwszy
od Ubuntu >= 18.04 (co jest sortowane automatycznie).
3) Niezdynamiczne zmienne globalne
ProxySQL ma niektóre global_variables
, które nie mogą być zmieniane w czasie rzeczywistym
(zobacz proxysql_non_dynamic_variables
w vars/main.yml).
To powiedziawszy, to samo w sobie nie jest problemem, ponieważ ta rola ProxySQL
zajmuje się tym (generując proxysql.cnf
) i zapewnia możliwość
automatycznego ponownego uruchomienia, jeśli taka zmienna zostanie zmieniona
(ustaw proxysql_restart_on_static_variables_change
na True
).
Ta rola ustawia również tę wartość w bazie danych ProxySQL, a tutaj zaczyna się problem:
Jeśli zmieniasz więcej niż jedną statyczną zmienną, technicznie wszystko jest w porządku.
ProxySQL uruchamia się ponownie, a nowa wartość jest brana z proxysql.cnf
.
Jednak tylko pierwsza wartość jest zmieniana w samej bazie danych.
Nie jest to "wielki problem", ponieważ rzeczywista wartość jest prawidłowo pobierana z samego pliku konfiguracyjnego, ale zauważysz zestaw zmian w następnym uruchomieniu Ansible, które:
- Ponownie uruchomią ProxySQL
- Testy idempotencji będą nieudane (jeśli nie uruchamiasz od nowa)
Potencjalnym rozwiązaniem mogłoby być nie ustalanie proxysql_non_dynamic_variables
w bazie danych ProxySQL.
4) Klasterowanie ProxySQL
Klasterowanie ProxySQL jest wciąż eksperymentalne. Cytat z dokumentacji klastrowania: "ponieważ ta funkcja jest wciąż eksperymentalna, tabela nie jest automatycznie ładowana z dysku."
Dla inicjalizacji z proxysql.cnf
ważne jest, aby zdefiniować hostname
(oczywiście) oraz port
(to nie przyjmuje domyślnej wartości).
5) ProxySQL i repozytorium Percona na CentOS...
...nie działa z powodu problemów z zależnościami.
Technicznie potrzebujemy następujących pakietów, aby poprawnie zastosować Ansible:
proxysql_dependency_pkgs:
- MySQL-python
- mysql
Przy włączonym repozytorium Percona zależności pakietów dla MySQL-python
i mysql
kolidują.
yum install MySQL-python
...
============================================================================================
Pakiet Arch Wersja Repozytorium Rozmiar
============================================================================================
Instalacja:
MySQL-python x86_64 1.2.5-1.el7 base 90 k
Instalowanie zależności:
Percona-Server-shared-56 x86_64 5.6.43-rel84.3.el7 percona-release-x86_64 619 k
Podsumowanie transakcji
============================================================================================
Zainstalować 1 pakiet (+1 zależny pakiet)
yum install mysql
...
============================================================================================
Pakiet Arch Wersja Repozytorium Rozmiar
============================================================================================
Instalacja:
Percona-Server-client-57 x86_64 5.7.24-27.1.el7 percona-release-x86_64 6.8 M
Instalowanie zależności:
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
Podsumowanie transakcji
============================================================================================
Zainstalować 1 pakiet (+2 zależne pakiety)
Jak widać, MySQL-python
zależy od Percona-Server-shared-56
, podczas gdy
mysql
zależy od Percona-Server-shared-57
.
Testowanie
Testy są przeprowadzane w Docker oraz docker_test_runner, które uruchamiają różne kontenery z różnymi ustawieniami środowiska:
- CentOS 7
- Debian 9 (Stretch)
- Ubuntu 16.04 (Xenial Xerus)
- Ubuntu 18.04 (Bionic Beaver)
Ansible 2.7.9 jest zainstalowane na wszystkich kontenerach, a testowy playbook jest stosowany.
W celu uzyskania dalszych szczegółów i dodatkowych kontroli, zapoznaj się z konfiguracją docker_test_runner i wejściem Docker. Wysokopoziomowy przegląd można znaleźć w poniższej tabeli:
Dystrybucja | Wersja | Oficjalne repozytorium | Repozytorium Percona | Pakiet |
---|---|---|---|---|
CentOS | 7 | tak | nie | 1.4.15 |
Debian | 9 | tak | tak | 1.4.15 |
Ubuntu | 16.04 | tak | tak | 1.4.15 |
Ubuntu | 18.04 | nie | tak | 1.4.15 |
# Testowanie lokalne:
curl https://raw.githubusercontent.com/timorunge/docker-test-runner/master/install.sh | sh
./docker_test_runner.py -f tests/docker_test_runner.yml
Ponieważ czas budowy na Travis jest ograniczony dla publicznych repozytoriów, automatyczne testy są ograniczone do:
- CentOS 7
- Debian 8 (Jessie)
- Debian 9 (Stretch)
- Ubuntu 16.04 (Xenial Xerus)
- Ubuntu 18.04 (Bionic Beaver)
Zależności
- proxysql_proxysql_servers.py który jest dodawany do folderu biblioteki tej roli.
Licencja
Licencja BSD 3-Clause "Nowa" lub "Zrewidowana"
Informacje o autorze
- Timo Runge
This role installs and configures ProxySQL - the high performance, high availability, protocol aware proxy for MySQL.
ansible-galaxy install timorunge.proxysql