vdzhorov.proxysql
proxysql
Obecnie ta rola jest kompatybilna z ProxySQL >= v2.0.1, jeśli używasz RHEL 8. Jeśli chcesz zainstalować serię ProxySQL 1.4.x, musisz użyć RHEL 7 lub niższego.
Ta rola jest kompatybilna tylko z Ansible 2.7.9 lub wyższym z powodu błędu w migracji z MySQLdb do PyMySQL (#40123) w module MySQL utils.
Wydanie 0.3.0 jest kompatybilne z Ansible 2.7.0 lub niższym.
Ta rola instaluje i konfiguruje ProxySQL - wysokowydajny, dostępny proxy z rozpoznawaniem protokołów dla MySQL.
Od wersji 2.3.0 Ansible oferuje module do konfigurowania ProxySQL samodzielnie. Ta rola Ansible wykorzystuje tę funkcjonalność, dodając kilka (mam nadzieję, że użytecznych) funkcji:
- Automatyczna instalacja dla różnych systemów operacyjnych
- (Wstępna) generacja proxysql.cnf
- Zarządzanie klastrem ProxySQL (z niestandardowym modułem, który dodaje funkcjonalność konfigurowania serwerów ProxySQL)
- Rozróżnianie między dynamicznymi a statycznymi
global_variables
- ponowne uruchomienie ProxySQL, jeśli to konieczne
Zobacz również sekcję "Znane problemy lub: Dobrze wiedzieć" w tym dokumencie.
Wymagania
Ta rola wymaga Ansible 2.5.0 lub wyższego.
Możesz łatwo zainstalować (i zdefiniować) stabilną wersję za pomocą pip:
pip install ansible==2.7.9
Wszystkie wymagania platformowe są wymienione w pliku metadanych.
Instalacja
ansible-galaxy install vdzhorov.proxysql
Zmienne roli
Zmienne, które można przekazać do tej roli. Dla wszystkich zmiennych sprawdź defaults/main.yml.
# Włącz / wyłącz ProxySQL jako usługę.
# Typ: Bool
proxysql_service_enabled: True
# Ponownie uruchom 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 zarówno `proxysql_use_official_repo`, jak i `proxysql_use_percona_repo` są ustawione na `False`, moduł automatycznie pobierze zdefiniowaną wersję `proxysql_version` jako pakiet z GitHub i zainstaluje ją.
# 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 jest używane repozytorium ProxySQL.
# Typ: Int
proxysql_version: 1.4.15
# Konfiguracja
# Ścieżka, w której ProxySQL powinien zapisywać swoją bazę danych i dzienniki.
# 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 tylko w 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 administracyjnego.
# `admin_variables` są prefiksowane `admin-`.
# `mysql_variables`: w `proxysql_global_variables_kv` zawiera globalne zmienne, które kontrolują funkcjonalność obsługi przychodzącego ruchu MySQL.
# `mysql_variables` są prefiksowane `mysql-`.
# Zmienne powinny być albo łańcuchiem, albo liczbą całkowitą. Wartość logiczną powinieneś oznaczyć jako łańcuch, np. "True" lub "False".
# Pełny opis można znaleźć na:
# 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-interfaces: 0.0.0.0:6033
# mysql-commands_stats: "True"
# mysql-threads: 4
proxysql_global_variables_kv: {}
# Serwery zaplecza
# `proxysql_backend_servers`: zawiera wiersze dla tabeli mysql_servers z interfejsu administracyjnego. Zasadniczo definiują one serwery zaplecza, do których kierowany jest ruch MySQL.
# Pełny opis można znaleźć na:
# 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ślnym 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 administracyjnego. Zasadniczo definiują one serwery ProxySQL, które są używane do klastrowania.
# Pełny opis można znaleźć na:
# `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: {}
# Grupy hostów replikacji
# `proxysql_replication_hostgroups`: reprezentują parę writer_hostgroup i reader_hostgroup. ProxySQL będzie monitorować wartość read_only dla wszystkich serwerów w określonych grupach hostów i na podstawie wartości read_only przypisze serwer do grupy hostów piszących lub grupy hostów odczytujących.
# Pełny opis można znaleźć na:
# 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 administracyjnego. 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.
# Pełny opis można znaleźć na:
# 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 administracyjnego. Zasadniczo definiują one zasady używane do klasyfikacji i kierowania przychodzącym ruchem MySQL na podstawie różnych kryteriów (dopasowane wzory, użytkownik użyty do uruchomienia zapytania itp.).
# Pełny opis można znaleźć na:
# 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 administracyjne Percona ProxySQL
# Rozwiązanie ProxySQL Admin (proxysql-admin) konfiguruje węzły klastra Percona XtraDB w ProxySQL.
# Pełny opis można znaleźć na:
# 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
Oto 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
jest ustawione na False
).
To jest w zasadzie (z drobnymi zmianami) plik test.yml, który jest używany do testowania.
- 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) Instalacja z oficjalnego repozytorium
Użyj repozytorium ProxySQL (proxysql_use_official_repo
jest ustawione na True
). ProxySQL sam 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
jest 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 wydania GitHub. Po prostu zdefiniuj proxysql_version
. Ustaw proxysql_use_official_repo
i 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 zmiennej statycznej
Jeśli chcesz ponownie uruchomić ProxySQL samodzielnie po zmianie konfiguracji zmiennych statycznych, musisz ustawić proxysql_restart_on_static_variables_change
na False
.
W tym przypadku napotykasz znany problem, co nie jest dużym problemem. W tym przypadku testy idempotencji zawiodą.
Nie musisz ponownie stosować Ansible po manualnym 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 poprawnym komunikowaniem się przez mysql-python
/ python-mysqldb
.
Przykładowy błąd:
"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 przez pip
na Ubuntu 16.04. Nie martw się, występuje to również przy 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 łańcuch, a wiele obiektów jako sekwencję, przy czym każdą sekwencję konwertuje również.
def literal(self, o):
# ...
return self.escape(o, self.encoders)
self.escape
powinien uciekać przed wszystkimi znakami specjalnymi w danym obiekcie i używa słownika do mapowania, aby zapewnić funkcje cytowania dla każdego typu.
Mapowanie dla łańcucha to StringType: Thing2Literal
. Więc łańcuch będzie uciekał za pomocą metody Thing2Literal
.
def Thing2Literal(o, d):
# ...
return string_literal(o, d)
string_literal
powinien przekonwertować nasz obiekt łańcucha na literę SQL. To oznacza, że wszystkie specjalne znaki SQL są ucieczkowe, a łańcuch jest otoczony pojedynczymi cudzysłowami. Innymi słowy, wykonuje:
"'%s'" % escape_string(str(obj))
Podczas uciekania przed łańcuchem obiekty łańcuchowe zostają usunięte i zwracają tylko pojedynczy cudzysłów ('
).
Ponieważ w testach zmieniała się tylko wersja ProxySQL, przypuszczam, że zmiana w ProxySQL (diff 1.4.7 vs. 1.4.8) powoduje awarię Ansible. Ponieważ ProxySQL sam w sobie - jeśli nie jest wywoływany przez Ansible - działa idealnie.
Na koniec...
Problem ten rozwiązuje zainstalowanie mysqlclient, który jest forkiem MySQLdb, za pomocą pip.
2) Pakiety dla Ubuntu > 16.04 (naprawione)
ProxySQL sam nie udostępnia "aktualnych" pakietów dla Ubuntu > 16.04. Ta rola Ansible radzi sobie z tym poprzez pobranie wydania 16.04 dla Ubuntu > 16.04 i zainstalowanie tego (to zachowanie 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 rozwiązywane automatycznie).
3) Nie dynamiczne zmienne globalne
ProxySQL ma pewne global_variables
, które nie mogą być zmieniane w czasie rzeczywistym (patrz proxysql_non_dynamic_variables
w vars/main.yml). Mówiąc prościej, to nie jest problem, ponieważ ta rola ProxySQL zajmuje się tym (przez generowanie proxysql.cnf
) i zapewnia możliwość automatycznego ponownego uruchomienia, jeśli taka zmienna zostanie zmieniona (ustawić proxysql_restart_on_static_variables_change
na True
).
Ta rola również ustawia tę wartość w samej bazie danych ProxySQL i tu powstaje problem:
Jeśli zmienisz więcej niż jedną zmienną statyczną, technicznie wszystko jest w porządku. ProxySQL się restartuje i pobiera nową wartość z proxysql.cnf
. Ale tylko pierwsza wartość jest zmieniana w samej bazie danych.
To nie jest "duży problem", ponieważ rzeczywista wartość jest poprawnie pobierana z pliku konfiguracyjnego, ale zobaczysz zmiany w następnym uruchomieniu Ansible, co:
- Ponownie uruchamia ProxySQL
- Testy idempotencji zakończą się niepowodzeniem (jeśli nie rozpoczynasz procesu od nowa)
Potencjalnym rozwiązaniem może być nieustawianie proxysql_non_dynamic_variables
w bazie danych ProxySQL.
4) Klastrowanie ProxySQL
Klastrowanie ProxySQL jest wciąż eksperymentalne. Cytat z dokumentacji klastrowania: "ponieważ ta funkcja wciąż jest eksperymentalna, tabela nie jest automatycznie ładowana z dysku."
Przy inicjalizacji z proxysql.cnf
ważne jest, aby zdefiniować hostname
(oczywiście) oraz port
(nie bierze pod uwagę 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 prawidłowo zastosować Ansible:
proxysql_dependency_pkgs:
- MySQL-python
- mysql
Włączając repozytorium Percona, zależności pakietów dla MySQL-python
i mysql
kolidują.
yum install MySQL-python
...
============================================================================================
Pakiet Arch Wersja Repozytorium Rozmiar
============================================================================================
Instalowanie:
MySQL-python x86_64 1.2.5-1.el7 baza 90 k
Instalowanie w celu spełnienia zależności:
Percona-Server-shared-56 x86_64 5.6.43-rel84.3.el7 percona-release-x86_64 619 k
Podsumowanie transakcji
============================================================================================
Zainstaluj 1 Pakiet (+1 Pakiet zależny)
yum install mysql
...
============================================================================================
Pakiet Arch Wersja Repozytorium Rozmiar
============================================================================================
Instalowanie:
Percona-Server-client-57 x86_64 5.7.24-27.1.el7 percona-release-x86_64 6.8 M
Instalowanie w celu spełnienia 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
============================================================================================
Zainstaluj 1 Pakiet (+2 Pakiety zależne)
Jak widać, MySQL-python
zależy od Percona-Server-shared-56
, podczas gdy mysql
zależy od Percona-Server-shared-57
.
Testowanie
Testy są wykonywane z użyciem Docker oraz docker_test_runner, który uruchamia następujące 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 zainstalowany we wszystkich kontenerach, a testowy playbook jest stosowany.
Dla dalszych szczegółów i dodatkowych sprawdzeń zobacz konfigurację docker_test_runner oraz punkt wejścia Dockera. Wysoki poziom przeglądowy 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 lokalnie:
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, zautomatyzowane 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 "Poprawiona"
Informacje o autorze
- 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