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:

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

Status budowy

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

Licencja

Licencja BSD 3-Clause "Nowa" lub "Poprawiona"

Informacje o autorze

  • Timo Runge
O projekcie

This role is a fork from timorunge.proxysql. The role installs and configures ProxySQL - the high performance, high availability, protocol aware proxy for MySQL.

Zainstaluj
ansible-galaxy install vdzhorov.proxysql
Licencja
bsd-3-clause
Pobrania
114
Właściciel
Sysadmin and DevOps enthusiast.