proxysql

proxysql


В настоящее время эта роль несовместима с ProxySQL >= v2.0.1.

Эта роль совместима только с Ansible 2.7.9 или выше из-за ошибки в миграции с MySQLdb на PyMySQL (#40123) в модуле MySQL utils.

Версия 0.3.0 совместима с Ansible 2.7.0 или ниже.


Эта роль устанавливает и настраивает ProxySQL - высокопроизводительный, высокодоступный прокси-сервер для MySQL с осознанием протоколов.

С версии 2.3.0 Ansible предоставляет модуль для настройки ProxySQL. Эта роль Ansible использует эту функциональность, добавляя некоторые (надеюсь, полезные) особенности:

Пожалуйста, также посмотрите раздел "Известные проблемы или: Полезно знать" в документе.

Требования

Эта роль требует Ansible 2.5.0 или выше.

Вы можете просто использовать pip для установки (и определения) стабильной версии:

pip install ansible==2.7.9

Все требования к платформе перечислены в файле метаданных.

Установка

ansible-galaxy install timorunge.proxysql

Переменные роли

Переменные, которые можно передать этой роли. Для всех переменных посмотрите defaults/main.yml.

# Включить / отключить ProxySQL как сервис.
# Тип: Bool
proxysql_service_enabled: True

# Перезапустить ProxySQL, если статические переменные изменяются. Для списка статических
# переменных посмотрите `proxysql_non_dynamic_variables` в `vars/main.yml`.
# Тип: Bool
proxysql_restart_on_static_variables_change: True

# Репозиторий

# Если оба параметра, `proxysql_use_official_repo` и `proxysql_use_percona_repo`, установлены
# в `False`, модуль автоматически загрузит определенную
# `proxysql_version` как пакет с GitHub и установит тот же.

# Использовать официальный репозиторий ProxySQL.
# Тип: Bool
proxysql_use_official_repo: True

# Использовать репозиторий Percona.
# Тип: Bool
proxysql_use_percona_repo: False

# Определить версию репозитория для репозитория Percona.
# Тип: Str
proxysql_percona_release: latest

# Версия ProxySQL, которая должна быть установлена, если не используется репозиторий ProxySQL.
# Тип: Int
proxysql_version: 1.4.15

# Конфигурация

# Путь, где ProxySQL должен сохранять свою базу данных и логи.
# Тип: Str
proxysql_datadir: /var/lib/proxysql

# Определить шаблон proxysql.cnf
# Тип: Str
proxysql_proxysql_cnf_template: proxysql.cnf.j2

# Определить шаблон proxysql-admin.cnf
# Тип: Str
proxysql_proxysql_admin_cnf_template: proxysql-admin.cnf.j2

# Переменные логина для конфигурации самого ProxySQL. Они используются только
# внутри файла `main.yml` и здесь для упрощения конфигурации.
# Тип: Str
proxysql_login_admin_host: 127.0.0.1
proxysql_login_admin_password: admin
proxysql_login_admin_port: 6032
proxysql_login_admin_user: admin

# Глобальные переменные
# `admin_variables` в `proxysql_global_variables_kv`: содержит глобальные
# переменные, которые управляют функциональностью администраторского интерфейса.
# `admin_variables` начинаются с `admin-`.
# `mysql_variables`: в `proxysql_global_variables_kv` содержит глобальные
# переменные, которые управляют функциональностью обработки входящего
# MySQL трафика.
# `mysql_variables` начинаются с `mysql-`.

# Переменные должны быть либо строкой, либо целым числом. Вы должны пометить
# логическое значение как строку, например, "True" или "False".

# Для полного справочника посмотрите на:
# https://github.com/sysown/proxysql/wiki/Global-variables

# Формат:
# Тип: 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 }}"
# Формат:
# Тип: Dict
# proxysql_global_variables_kv:
#   key: value
# например:
# 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: {}

# Серверы-бэкэнды
# `proxysql_backend_servers`: содержит строки для таблицы mysql_servers из
# администраторского интерфейса. В основном, они определяют серверы-бэкэнды,
# к которым направляется входящий MySQL трафик.

# Для полного справочника посмотрите на:
# https://docs.ansible.com/ansible/latest/modules/proxysql_backend_servers_module.html
# Важно: этот модуль использует `hostgroup` (что является правильным названием в
# базе данных) вместо `hostgroup_id` (что является стандартным в модуле Ansible)!

# Формат:
# Тип: 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: {}

# Серверы ProxySQL
# `proxysql_proxysql_servers`: содержит строки для таблицы proxysql_servers
# из администраторского интерфейса. В основном, они определяют серверы ProxySQL,
# которые используются для кластеризации.

# Для полного справочника посмотрите на:
# `library/proxysql_proxysql_servers.py`, так как это не часть
# официального пакета Ansible.

# Формат:
# Тип: 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: {}

# Группы репликации
# `proxysql_replication_hostgroups`: представляют собой пару writer_hostgroup
# и reader_hostgroup. ProxySQL будет отслеживать значение read_only для всех
# серверов в указанных группах, и исходя из значения read_only,
# сервер будет назначен в группы для записи или чтения.

# Для полного справочника посмотрите на:
# https://docs.ansible.com/ansible/latest/modules/proxysql_replication_hostgroups_module.html

# Формат:
# Тип: 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: {}

# Пользователи
# `proxysql_mysql_users`: содержит строки для таблицы mysql_users из
# администраторского интерфейса. В основном, они определяют пользователей, которые
# могут подключаться к прокси, и пользователей, с которыми прокси может подключаться
# к серверам-бэкэндам.

# Для полного справочника посмотрите на:
# http://docs.ansible.com/ansible/latest/proxysql_mysql_users_module.html

# Формат:
# Тип: 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: {}

# Правила запросов
# `proxysql_query_rules` содержит строки для таблицы mysql_query_rules из
# администраторского интерфейса. В основном, они определяют правила, используемые для классификации и
# маршрутизации входящего MySQL трафика по различным критериям (шаблоны
# совпадений, пользователи, использующие для выполнения запроса, и т. д.).

# Для полного справочника посмотрите на:
# http://docs.ansible.com/ansible/latest/proxysql_query_rules_module.html

# Формат:
# Тип: 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: {}

# Percona ProxySQL Admin
# Решение ProxySQL Admin (proxysql-admin) настраивает узлы кластера Percona
# XtraDB в ProxySQL.

# Для полного справочника посмотрите на:
# https://github.com/percona/proxysql-admin-tool

# Формат:
# Тип: 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 }}"

Примеры

1) Пример полной конфигурации

Здесь вы можете увидеть полный пример конфигурации ProxySQL. В этом случае роль загрузит пакет 1.4.15 напрямую и не будет использовать репозиторий (proxysql_use_official_repo установлен в False).

Это, по существу (с некоторыми небольшими изменениями), файл test.yml который используется для тестирования.

- 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) Установка из официального репозитория

Используйте репозиторий ProxySQL (proxysql_use_official_repo установлен в True). ProxySQL сам не предоставляет пакеты в репозитории для Ubuntu > 16.04.

Просто установите proxysql_use_official_repo в False для более новых версий Ubuntu или используйте репозиторий Percona.

Посмотрите на раздел тестирования для покрытия официального репозитория.

- 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) Установка из репозитория Percona

Используйте репозиторий ProxySQL (proxysql_use_percona_repo установлен в True).

Посмотрите на раздел тестирования для покрытия репозитория 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) Установка из deb или rpm пакета

Вы можете установить ProxySQL напрямую из выпуска на GitHub. Просто определите proxysql_version. Установите proxysql_use_official_repo и proxysql_use_percona_repo в 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) Не перезапускать ProxySQL после изменения статических переменных

Если вы хотите перезапустить ProxySQL самостоятельно после изменения конфигурации статических переменных, вам необходимо установить proxysql_restart_on_static_variables_change в False.

В этом случае у вас возникнет известная проблема, что не является большой проблемой. В этом случае тесты идемпотентности потерпят неудачу.

Вам не нужно снова применять Ansible после ручного перезапуска.

- 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
    ...

Известные проблемы или: Полезно знать

1) ProxySQL > 1.4.7 на Ubuntu 16.04 (исправлено)

На Ubuntu 16.04 Ansible (версия не важна) / ProxySQL > 1.4.7, похоже, имеют проблемы с правильной коммуникацией через mysql-python / python-mysqldb.

Пример ошибки:

"невозможно изменить сервер.. (1045, 'неопознанный токен: \"\\'\\n  И сжатие = 0\\n  И вес = 1\\n  И use_ssl = 0\\n  И max_connections = 2000\\n  И max_latency_ms = 0\\n  И max_replication_lag = 5\"')"

Примечание:

Я провел небольшое исследование с mysql-python, установленным через pip на Ubuntu 16.04. Не волнуйтесь, это также происходит с python-mysqldb.


В библиотеке python MySQLdb метод execute (класс BaseCursor) генерирует запрос следующим образом:

query = query % tuple([db.literal(item) for item in args])

db.literal является частью класса Connection и возвращает отдельные объекты как строку, а множественные объекты как последовательность, при этом конвертируя каждую последовательность.

def literal(self, o):
  # ...
  return self.escape(o, self.encoders)

self.escape должен экранировать все специальные символы в заданном объекте и использует отображение dict, чтобы предоставить функции экранирования для каждого типа. Это self.encoders, который по умолчанию не установлен по-другому и использует MySQLdb.converters.

Отображение для строки - это StringType: Thing2Literal. Таким образом, строка будет экранирована с использованием метода Thing2Literal.

def Thing2Literal(o, d):
  # ...
  return string_literal(o, d)

string_literal должен конвертировать наш строковый объект в SQL строковый литерал. Это означает, что любые специальные SQL символы экранируются, и он заключен в одинарные кавычки. Иными словами, он выполняет:

"'%s'" % escape_string(str(obj))

Во время экранирования строки объекты строк удаляются и возвращают просто одну кавычку (').

Поскольку в тестах было изменено только значение ProxySQL, я предполагаю, что изменение в ProxySQL (diff 1.4.7 vs. 1.4.8) вызывает сбой Ansible. Потому что сам ProxySQL - если не активировать через Ansible - работает прекрасно.


Последнее, но не менее важное...

Эта проблема решается установкой mysqlclient - который является форком MySQLdb - через pip.

2) Пакеты для Ubuntu > 16.04 (исправлено)

ProxySQL сам не предоставляет "актуальные" пакеты для Ubuntu > 16.04. Эта роль Ansible обходит это, скачивая версию 16.04 для Ubuntu > 16.04 и устанавливая ту же (это поведение может измениться в будущем).

Существует зависимость пакета для libcrypto++6 и libssl1.0.0, начиная с Ubuntu >= 18.04 (которая автоматически разрешается).

3) Ненастраиваемые глобальные переменные

ProxySQL имеет некоторые global_variables, которые нельзя изменять во время выполнения (см. proxysql_non_dynamic_variables в vars/main.yml). С учетом сказанного, это само по себе не является проблемой, так как эта роль ProxySQL заботится об этом (создавая proxysql.cnf) и предоставляет возможность перезапустить автоматически, если такая переменная изменится (установите proxysql_restart_on_static_variables_change в True).

Эта роль также устанавливает это значение в самой базе данных ProxySQL, и вот где начинается проблема:

Если вы изменяете более одной статической переменной, технически все в порядке. ProxySQL перезапускается и принимает новое значение из proxysql.cnf. Но только первое значение изменяется в самой базе данных.

Это не "большая проблема", так как реальное значение правильно берется из конфигурационного файла, но вы увидите изменения в следующем запуске Ansible, которые убедят:

  • Перезапустите ProxySQL еще раз
  • Тесты идемпотентности потерпят неудачу (если вы не запускаете с нуля)

Потенциальное решение могло бы заключаться в том, чтобы не устанавливать proxysql_non_dynamic_variables в базе данных ProxySQL.

4) Кластеризация ProxySQL

Кластеризация ProxySQL все еще экспериментальна. Цитата из документации по кластеризации: "поскольку эта функция все еще экспериментальна, таблица не загружается автоматически с диска".

Для инициализации из proxysql.cnf важно, чтобы hostname (очевидно) и port (он не принимает значение по умолчанию) были определены.

5) ProxySQL и репозиторий Percona на CentOS...

...не работает из-за некоторых проблем с зависимостями.

В техническом плане нам нужны следующие пакеты, чтобы корректно применить Ansible:

proxysql_dependency_pkgs:
  - MySQL-python
  - mysql

С включенным репозиторием Percona зависимости пакетов для MySQL-python и mysql конфликтуют.

yum install MySQL-python
...
============================================================================================
 Установка:
  MySQL-python              x86_64   1.2.5-1.el7             base                      90 к
 Установка для зависимостей:
  Percona-Server-shared-56  x86_64   5.6.43-rel84.3.el7      percona-release-x86_64   619 к

Итог
============================================================================================
Установка  1 пакет (+1 зависимый пакет)
yum install mysql
...

============================================================================================
 Установка:
  Percona-Server-client-57         x86_64  5.7.24-27.1.el7    percona-release-x86_64  6.8 M
 Установка для зависимостей:
  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

Итог
============================================================================================
Установка  1 пакет (+2 зависимых пакета)

Как вы можете видеть, MySQL-python зависит от Percona-Server-shared-56, в то время как mysql зависит от Percona-Server-shared-57.

Тестирование

Статус сборки

Тесты проводятся с использованием Docker и docker_test_runner, который разворачивает следующие контейнеры с разными настройками окружения:

  • CentOS 7
  • Debian 9 (Stretch)
  • Ubuntu 16.04 (Xenial Xerus)
  • Ubuntu 18.04 (Bionic Beaver)

Ansible 2.7.9 установлен во всех контейнерах, и применяется test playbook.

Для получения дополнительных деталей и дополнительных проверок посмотрите на конфигурацию docker_test_runner и Docker entrypoint. Общая информация представлена в следующей таблице:

Дистрибутив Версия Официальный репозиторий Репозиторий Percona Пакет
CentOS 7 да нет 1.4.15
Debian 9 да да 1.4.15
Ubuntu 16.04 да да 1.4.15
Ubuntu 18.04 нет да 1.4.15
# Локальное тестирование:
curl https://raw.githubusercontent.com/timorunge/docker-test-runner/master/install.sh | sh
./docker_test_runner.py -f tests/docker_test_runner.yml

Поскольку время сборки на Travis ограничено для общедоступных репозиториев, автоматизированные тесты ограничены:

  • CentOS 7
  • Debian 8 (Jessie)
  • Debian 9 (Stretch)
  • Ubuntu 16.04 (Xenial Xerus)
  • Ubuntu 18.04 (Bionic Beaver)

Зависимости

Лицензия

Лицензия BSD 3-Clause "Новая" или "Переработанная"

Информация об авторе

  • Тимо Рунге
О проекте

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

Установить
ansible-galaxy install timorunge/ansible-proxysql
Лицензия
bsd-3-clause
Загрузки
1675
Владелец