proxysql

proxysql


В настоящее время эта роль совместима с ProxySQL >= v2.0.1, если вы используете RHEL 8. Если вы хотите установить серию ProxySQL 1.4.x, вам понадобится использовать RHEL 7 или ниже.

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

Релиз 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 vdzhorov.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 будет назначать сервер в группы writer или reader.

# Для полного справочника смотрите на:
# 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
# Решение 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-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.

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

"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\"')"

Примечание:

Я провел небольшое исследование, установив 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 должен экранировать все специальные символы в данном объекте и использует словарь сопоставлений для предоставления функций кавычек для каждого типа. Это 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 (разница 1.4.7 против 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 k
 Установка для зависимостей:
  Percona-Server-shared-56 x86_64        5.6.43-rel84.3.el7        percona-release-x86_64   619 k

Сводка транзакции
============================================================================================
Установить  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 установлен на всех контейнерах и используется тестовый плейбук.

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

Дистрибутив Версия Официальный репозиторий Репозиторий 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 "New" или "Revised"

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

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

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

Установить
ansible-galaxy install vdzhorov/ansible-proxysql
Лицензия
bsd-3-clause
Загрузки
98
Владелец
Sysadmin and DevOps enthusiast.