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