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