vdzhorov.proxysql
ProxySQL
目前该角色与 ProxySQL >= v2.0.1 版本兼容(如果您使用 RHEL 8)。 如果您希望安装 ProxySQL 1.4.x 系列,您需要使用 RHEL 7 或更低版本。
由于在从 MySQLdb 迁移到 PyMySQL 时存在一个错误(在 MySQL 模块实用工具中的 #40123),此角色只与 Ansible 2.7.9 或更高版本兼容。
版本 0.3.0 与 Ansible 2.7.0 或更低版本兼容。
此角色用于安装和配置 ProxySQL - 一个高性能、高可用性、了解协议的 MySQL 代理。
自 2.3.0 版本以来,Ansible 提供了一个 用于配置 ProxySQL 的模块。此 Ansible 角色利用了该功能,但在此基础上添加了一些(希望有用的)功能:
- 为 不同操作系统 自动安装
- (预)生成 proxysql.cnf
- 管理一个 ProxySQL 集群(包含一个 自定义模块,该模块添加了配置 ProxySQL 服务器的功能)
- 区分动态和静态
global_variables
- 如果需要,则重启 ProxySQL
请查看本文件中的 "已知问题或:需要注意的事项" 部分的内容。
要求
此角色需要 Ansible 2.5.0 或更高版本。
您可以简单地使用 pip 安装(并定义)一个稳定版本:
pip install ansible==2.7.9
所有平台要求列在元数据文件中。
安装
ansible-galaxy install vdzhorov.proxysql
角色变量
可以传递给此角色的变量。有关所有变量,请查看 defaults/main.yml。
# 启用/禁用 ProxySQL 作为服务。
# 类型:布尔值
proxysql_service_enabled: True
# 如果静态变量发生变化,则重启 ProxySQL。有关静态变量的列表,请查看 `vars/main.yml` 中的 `proxysql_non_dynamic_variables`。
# 类型:布尔值
proxysql_restart_on_static_variables_change: True
# 仓库
# 如果 `proxysql_use_official_repo` 和 `proxysql_use_percona_repo` 都设置为 `False`,模块将自动从 Github 下载定义的 `proxysql_version` 作为包并安装。
# 使用官方的 ProxySQL 仓库。
# 类型:布尔值
proxysql_use_official_repo: True
# 使用 Percona 仓库。
# 类型:布尔值
proxysql_use_percona_repo: False
# 定义 Percona 仓库的版本。
# 类型:字符串
proxysql_percona_release: latest
# 如果不使用 ProxySQL 仓库,则应安装的 ProxySQL 版本。
# 类型:整数
proxysql_version: 1.4.15
# 配置
# ProxySQL 应保存其数据库和日志的路径。
# 类型:字符串
proxysql_datadir: /var/lib/proxysql
# 定义 proxysql.cnf 模板
# 类型:字符串
proxysql_proxysql_cnf_template: proxysql.cnf.j2
# 定义 proxysql-admin.cnf 模板
# 类型:字符串
proxysql_proxysql_admin_cnf_template: proxysql-admin.cnf.j2
# ProxySQL 自身配置的登录变量。它们仅在 `main.yml` 文件内部使用,在此处简化配置。
# 类型:字符串
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
# 格式:
# 类型:字典
# 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 }}"
# 格式:
# 类型:字典
# proxysql_global_variables_kv:
# 关键:值
# 例如:
# 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 模块中的默认值)!
# 格式:
# 类型:字典
# 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 包的一部分。
# 格式:
# 类型:字典
# 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`:表示写主机组和读主机组的配对。ProxySQL 将监控指定主机组中所有服务器的 read_only 值,并根据 read_only 的值将服务器分配到写或读主机组。
# 完整参考请查看:
# https://docs.ansible.com/ansible/latest/modules/proxysql_replication_hostgroups_module.html
# 格式:
# 类型:字典
# 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
# 格式:
# 类型:字典
# 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
# 格式:
# 类型:字典
# 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 管理 (proxysql-admin) 解决方案将 Percona XtraDB 集群节点配置到 ProxySQL 中。
# 完整参考请查看:
# https://github.com/percona/proxysql-admin-tool
# 格式:
# 类型:字典
# 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 软件包安装
您可以直接从 GitHub 发行版 安装 ProxySQL。只需定义 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\"')"
注意:
我在 Ubuntu 16.04 上通过 pip
安装的 mysql-python
进行了小规模的研究。别担心,与 python-mysqldb
的情况也是一样。
在 MySQLdb python 库中,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
应该转义给定对象中的所有特殊字符,并使用映射字典提供每种类型的引号功能。默认情况下未设置为不同值,使用 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 安装该版本来解决此问题(这一行为可能在未来发生变化)。
从 Ubuntu >= 18.04 开始,需要 libcrypto++6
和 libssl1.0.0
的软件包依赖关系(已自动解决)。
3) 非动态全局变量
ProxySQL 中有一些 global_variables
,在运行时无法更改(请参见 vars/main.yml 中的 proxysql_non_dynamic_variables
)。尽管如此,仅凭这一点不是问题,因为此 ProxySQL 角色会通过生成 proxysql.cnf
并提供在这些变量更改时自动重启的可能性(将 proxysql_restart_on_static_variables_change
设置为 True
)。
此角色还在 ProxySQL 数据库中设置该值,但问题就开始了:
如果您更改多个静态变量,技术上来说一切都很好。ProxySQL 会重新启动并从 proxysql.cnf
中获取新值。但是,仅第一个值会在数据库中更改。
这不是一个 “大问题”,因为真实的值会从配置文件中正确获取,但您将在下次 Ansible 运行中看到一个更改集,它将:
- 再次重启 ProxySQL
- 幂等性测试将失败(如果您没有从头开始引导)
一种潜在的解决方案是不要在 ProxySQL 数据库中设置 proxysql_non_dynamic_variables
。
4) ProxySQL 集群
ProxySQL 集群仍处于试验阶段。摘录自 集群文档:"由于这个功能仍然是实验性的,表不会自动从磁盘加载"。
对于从 proxysql.cnf
的初始化,重要的是定义 hostname
(显然)和 port
(它不会采用默认值)。
5) ProxySQL 和 CentOS 上的 Percona 仓库...
...由于一些依赖问题而无法工作。
技术上我们需要以下软件包以便正确应用 Ansible:
proxysql_dependency_pkgs:
- MySQL-python
- mysql
启用 Percona 仓库后,对 MySQL-python
和 mysql
的软件包依赖关系发生冲突。
yum install MySQL-python
...
============================================================================================
Package Arch Version Repository Size
============================================================================================
Installing:
MySQL-python x86_64 1.2.5-1.el7 base 90 k
Installing for dependencies:
Percona-Server-shared-56 x86_64 5.6.43-rel84.3.el7 percona-release-x86_64 619 k
Transaction Summary
============================================================================================
Install 1 Package (+1 Dependent package)
yum install mysql
...
============================================================================================
Package Arch Version Repository Size
============================================================================================
Installing:
Percona-Server-client-57 x86_64 5.7.24-27.1.el7 percona-release-x86_64 6.8 M
Installing for dependencies:
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
Transaction Summary
============================================================================================
Install 1 Package (+2 Dependent packages)
如您所见,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
由于公共仓库上的构建时间有限,因此自动化测试仅限于:
- 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" or "Revised" License
作者信息
- Timo Runge
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.proxysql