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:

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

Status budowy

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

Licencja

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

Informacje o autorze

  • Timo Runge
O projekcie

This role installs and configures ProxySQL - the high performance, high availability, protocol aware proxy for MySQL.

Zainstaluj
ansible-galaxy install timorunge.proxysql
Licencja
bsd-3-clause
Pobrania
1.7k
Właściciel