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 использует эту функциональность и добавляет некоторые (надеемся полезные) функции:
- Автоматическая установка для различных операционных систем
- (Пред)генерация proxysql.cnf
- Управление ProxySQL-Cluster (с помощью кастомного модуля который добавляет функциональность для настройки серверов ProxySQL)
- Различение между динамическими и статическими
global_variables
- перезапуск ProxySQL, если это необходимо
Пожалуйста, также ознакомьтесь с разделом "Известные проблемы или: Полезно знать" в документе.
Требования
Эта роль требует 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)
Зависимости
- proxysql_proxysql_servers.py который добавляется в библиотечную папку этой роли.
Лицензия
Лицензия 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