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 角色利用了该功能,但在此基础上添加了一些(希望有用的)功能:

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

要求

此角色需要 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_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 正确通信时遇到了问题。

示例错误:

"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.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 触发 - 正常工作。


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

安装 mysqlclient(这是 MySQLdb 的一个分支)通过 pip 解决了这个问题。

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

ProxySQL 本身未针对 Ubuntu > 16.04 提供“最新”软件包。此 Ansible 角色通过下载 16.04 版本并为 Ubuntu > 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
...
============================================================================================
 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

测试

Build Status

测试在 Dockerdocker_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)

依赖关系

许可证

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
许可证
bsd-3-clause
下载
114
拥有者
Sysadmin and DevOps enthusiast.