timorunge.proxysql

ProxySQL


当前该角色与 ProxySQL 版本 >= v2.0.1 不兼容。

由于 MySQL 模块工具在从 MySQLdb 迁移到 PyMySQL 过程中存在 bug (#40123),该角色仅与 Ansible 2.7.9 或更高版本兼容。

版本 0.3.0 兼容 Ansible 2.7.0 或更低版本。


该角色安装和配置 ProxySQL - 一个高性能、高可用性、支持协议的 MySQL 代理。

自 2.3.0 版开始,Ansible 提供了一个 用于配置 ProxySQL 的模块。 该 Ansible 角色利用此功能,并添加了一些(希望是有用的)功能:

请查看本文件中的 "已知问题或:需注意事项" 部分。

要求

该角色需要 Ansible 2.5.0 或更高版本。

您可以使用 pip 简单安装(并定义)一个稳定版本:

pip install ansible==2.7.9

所有平台要求列在元数据文件中。

安装

ansible-galaxy install timorunge.proxysql

角色变量

可以传递给此角色的变量。有关所有变量,请查看 defaults/main.yml

# 启用/禁用 ProxySQL 服务。
# 类型:布尔值
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:
#   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 模块中的默认名称)!

# 格式:
# 类型:字典
# 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
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_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

# 格式:
# 类型:字典
# 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 Admin (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-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 自身在 16.04 以后的 Ubuntu 上不提供软件包。

对于更新的 Ubuntu 版本,只需将 proxysql_use_official_repo 设置为 False,或者使用 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_repoproxysql_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  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.literalConnection 类的一部分,并将单个对象返回为字符串,而将多个对象作为序列返回,同时也会转换每个序列。

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 触发 - 工作得很好。


最后但并非最不重要的是...

通过通过 pip 安装 mysqlclient - 这是 MySQLdb 的一个分支 - 可以解决这个问题。

2) Ubuntu > 16.04 的软件包(已修复)

ProxySQL 本身并未为 Ubuntu > 16.04 提供 "最新" 软件包。此 Ansible 角色通过下载 16.04 版本并安装它来规避此问题(这种行为可能会在将来改变)。

从 Ubuntu >= 18.04 开始,libcrypto++6libssl1.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-pythonmysql 的软件包依赖关系会发生冲突。

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

测试

Build Status

测试使用 Dockerdocker_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 入口点。 以下表格提供了高层概述:

发行版 版本 官方仓库 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" or "Revised" License

作者信息

  • Timo Runge
关于项目

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

安装
ansible-galaxy install timorunge.proxysql
许可证
bsd-3-clause
下载
1.7k
拥有者