
关于本译文:
1. ProxySQL官方手册:
https://github.com/sysown/proxysql/wiki
2. 本人译文(wiki)版:
https://github.com/malongshuai/proxysql/wiki
3. 本pdf版是根据wiki版的markdown文件导出整理而来,所以格式、排版和链接上
没有过多整理,如看着不舒服,强烈建议转至wiki版译文
4. 本人英语战五渣,翻译错误之处请邮件至mlongshuai@gmail.com指正
5. ProxySQL官方手册写的并不好,有点乱,估计是多个人合写的。所以译文看上去
可能也会有点乱
6. 本人博客区有ProxySQL的系列文章:
https://www.cnblogs.com/f-ck-need-u/p/7586194.html#middleware
ProxySQL v1.4.4
High-performance MySQL proxy
译者:马龙帅
博客:https://www.cnblogs.com/f-ck-need-u/

快速开始
安装
下载 ProxySQL 安装包: https://github.com/sysown/proxysql/releases
下载之后,使用操作系统的包管理器来安装它:
wget https://github.com/sysown/proxysql/releases/download/v1.4.9/proxysql_1.4.9-ubuntu16_amd64.deb
dpkg -i proxysql_1.4.9-ubuntu16_amd64.deb
也可以使用仓库来安装:
Ubuntu / Debian:
添加仓库:
apt-get install -y lsb-release
wget -O - 'http://repo.proxysql.com/ProxySQL/repo_pub_key' | apt-key add -
echo deb http://repo.proxysql.com/ProxySQL/proxysql-1.4.x/$(lsb_release -sc)/ ./ \
| tee /etc/apt/sources.list.d/proxysql.list
安装:
apt-get update
apt-get install proxysql OR apt-get install proxysql=version
Red Hat / CentOS:
添加仓库:
cat <<EOF | tee /etc/yum.repos.d/proxysql.repo
[proxysql_repo]
name= ProxySQL YUM repository
baseurl=http://repo.proxysql.com/ProxySQL/proxysql-1.4.x/centos/\$releasever
gpgcheck=1
gpgkey=http://repo.proxysql.com/ProxySQL/repo_pub_key
EOF
安装:
yum install proxysql OR yum install proxysql-version
ProxySQL 服务管理
ProxySQL 安装好后,可以使用 service 来启动和停止它:
启动 ProxySQL:
service proxysql start
停止 ProxySQL:
service proxysql stop
ProxySQL 升级
只需安装新的 ProxySQL 版本然后重启即可:
wget https://github.com/sysown/proxysql/releases/download/v1.4.9/proxysql_1.4.9-ubuntu16_amd64.deb
dpkg -i proxysql_1.4.9-ubuntu16_amd64.deb
service proxysql restart
查看 ProxySQL 的版本
$ proxysql --version
ProxySQL version v1.4.9-1.1, codename Truls
在版本号中有 _DEBUG 字符串的表示它是调试版本。 调试版本比非调试版本要慢,但是在出现故障时更容易调试。
$ proxysql --version
Main init phase0 completed in 0.000146 secs.
ProxySQL version v1.4.9-1.1_DEBUG, codename Truls

通过 admin interface 配置 ProxySQL
首先,请记住,配置 ProxySQL 的最佳方式是通过它的管理接口(admin interface)。这样可以通过 SQL 查询它的管理数据库实现在线配置(无需
重启 ProxySQL)。这种配置方式非常有效。
第二种配置方式是使用配置文件。
通过管理接口配置 ProxySQL
可以使用 mysql 客户端来连接管理接口,以下是使用 admin 凭据连接到本地 6032 端口的管理接口:
$ mysql -u admin -padmin -h 127.0.0.1 -P6032 --prompt='Admin> '
Warning: Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 4
Server version: 5.5.30 (ProxySQL Admin Module)
Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
Admin>
注意:如果你的 MySQL 客户端版本为 8.04 或更高版本,需要在上面连接到管理接口的命令行上加上--default-
auth=mysql_native_password。
连接到管理界面后,可以列出你允许使用 SQL 语言进行查询的数据库和表的列表:
Admin> SHOW DATABASES;
+-----+---------+-------------------------------+
| seq | name | file |
+-----+---------+-------------------------------+
| 0 | main | |
| 2 | disk | /var/lib/proxysql/proxysql.db |
| 3 | stats | |
| 4 | monitor | |
+-----+---------+-------------------------------+
4 rows in set (0.00 sec)
这些是你能控制的后端服务器节点,一些请求以及设置(如缓存、访问控制列表等)会路由到这些节点上。当在内存中修改了这些数据结构,必须
为运行时环境加载新的配置,或者将设置持久化到磁盘(这样即使重启 ProxySQL,这些配置也都还在)。关于管理接口配置 ProxySQL 更详细的
内容,参见:here。
通过配置文件配置 ProxySQL
尽管通过配置文件配置 ProxySQL 只是一种辅助方式,我们也无法忽略它的价值,因为引导新安装的 ProxySQL 的启动,需要它。
让我们快速浏览一下配置文件的主要部分(这个概述是对 ProxySQL 配置的一个非常高级的概述)。
顶级 sections:
• admin_variables:包含控制管理接口功能的全局变量。
• mysql_variables:包含控制"处理 MySQL 流入流量功能"的全局变量。
• mysql_servers:包含管理接口中 mysql_servers 表的行。它们定义了 MySQL 流量要路由到的后端服务器。行按照.cfg 文件格式进
行编写,例如:
• mysql_servers =
• (
• {
• address="127.0.0.1"
• port=3306
• hostgroup=0
• max_connections=200
• }
• )
• mysql_users:包含管理接口中 mysql_users 表的行。它们定义了谁可以连接到 ProxySQL,以及 ProxySQL 用哪个用户连接后端服务
器。行按照.cfg 文件格式进行编写,例如:
• mysql_users:
• (
• {
• username = "root"
• password = "root"
• default_hostgroup = 0
• max_connections=1000
• default_schema="information_schema"
• active = 1

• }
• )
• mysql_query_rules:包含管理接口中 mysql_query_rules 表的行。它们根据各种标准(pattern 匹配,执行查询的用户身份,等等)定
义了对 MySQL 流量的分类和路由规则。行按照.cfg 文件格式进行编写,例如(注意:这个示例是一个非常通用的查询路由规则,强烈
建议创建专门的查询规则替代这个通用规则):
• mysql_query_rules:
• (
• {
• rule_id=1
• active=1
• match_pattern="^SELECT .* FOR UPDATE$"
• destination_hostgroup=0
• apply=1
• },
• {
• rule_id=2
• active=1
• match_pattern="^SELECT"
• destination_hostgroup=1
• apply=1
• }
• )
• 顶级配置项:datadir 指定数据目录的路径。
多层次配置系统
ProxySQL 使用复杂但易于使用的配置系统以便满足以下几个需求:
• 能够简单地动态更新配置文件(主要是为了让 ProxySQL 在大型生产环境下实现 0 宕机时间)。兼容 MySQL 的管理接口可以实现这个目
标。
• 能够动态修改尽可能多的配置项,无需重启 ProxySQL。
• 能够轻松地回滚无效的配置项。
通过一个多级配置系统,将配置从运行时环境移到内存,并在有需求时持久化到磁盘上,这样就能实现上面的需求。
这 3 个层次的组成如下:
+-------------------------+
| RUNTIME |
+-------------------------+
/|\ |
| |
[1] | [2] |
| \|/
+-------------------------+
| MEMORY |
+-------------------------+ _
/|\ | |\
| | \
[3] | [4] | \ [5]
| \|/ \
+-------------------------+ +-------------------------+
| DISK | | CONFIG FILE |
+-------------------------+ +-------------------------+
RUNTIME 表示的是 ProxySQL 线程处理请求时使用的数据结构。
runtime 类变量包含:
• 在全局类变量中定义的实际值。
• 后端服务器节点分组后,组中的服务器节点列表。
• 允许连接到 ProxySQL 的 MySQL 用户列表。
注意:无法直接修改 RUNTIME 的配置内容,它们总是从下面的层次一层一层应用到 runtime 上的。
MEMORY (有时也称为 main) 表示的是通过 MySQL 兼容接口公开的内存数据库。用户可以用 MySQL 的客户端连接到该接口,并查询
ProxySQL 的各种配置表或库。
通过该接口可获得的配置表包括:
• mysql_servers -- ProxySQL 需要连接的后端服务器节点列表。
• mysql_users -- 连接到 ProxySQL 的用户及对应密码的列表。注意,ProxySQL 也会按照该列表中的用户配置去连接后端服务器节点。
• mysql_query_rules -- ProxySQL 根据这些规则将请求路由到后端服务器。这些规则有时会重写查询语句或者将已执行的结果进行缓存。
• global_variables -- ProxySQL 使用的全局变量列表,以及允许谁可以在 runtime 环境下进行调整。
例如:
mysql> select * from global_variables limit 3;

+----------------------------------+----------------+
| variable_name | variable_value |
+----------------------------------+----------------+
| mysql-connect_retries_on_failure | 5 |
| mysql-connect_retries_delay | 1 |
| mysql-connect_timeout_server_max | 10000 |
+----------------------------------+----------------+
• mysql_collations -- ProxySQL 可用的 MySQL 排序规则列表。它们是直接从客户端库中提取出来的。
• [debug 版本专有] debug_levels -- ProxySQL 发出的调试语句的类型列表及其详细级别。这允许我们在运行时轻松配置日志中有哪些语
句,以便调试不同的问题。这只在调试版本中可用,因为它会影响性能。
DISK 和 CONFIG FILE
DISK 表示的是一个在磁盘上的 SQLite3 数据库,默认位置为$(DATADIR)/proxysql.db。重启时,那些没有持久化到磁盘的内存配置会丢失,
因此有必要将内存中的配置持久化到 DISK 。CONFIG 文件是传统的配置文件,下一节我们将看到其它和配置层的关系。
下面,我们将描述一些对 ProxySQL 的基本操作时,每个层次的生命周期。例如:第一次启动 ProxySQL(startup)、startup、restart、shutdown
等基础操作。
Startup
对于一次普通的启动,ProxySQL 会读取它的配置文件(如果存在的话)来决定它的 datadir。至于下一步会发生什么,取决于在 datadir 下是否存
在它的数据库文件(即那个 SQLite3 库)。
如果数据库文件存在,则 ProxySQL 根据该数据库文件中的内容初始化它的内存配置。如果数据库文件不存在,但配置文件存在,将解析配置文
件内容并加载到内存数据库中,然后将它持久化到数据库文件中,最后加载到 runtime
环境。需要注意的是,如果存在数据库文件,则不会解析
传统的配置文件。因此,对于普通的 ProxySQL 启动行为,ProxySQL 只从数据库文件来初始化它的运行环境。
注意:ProxySQL 1.4.4 引入了两个新的通用变量(general variables),它们一定会从配置文件中解析。以下是一定会从传统配置文件中解析的
变量,即使数据库文件已经存在。
• datadir:该变量定义 ProxySQL 的数据目录,数据库文件、日子还以及其它一些文件都会存放到这个目录下。
• restart_on_missing_heartbeats:(1.4.4 版本引入)如果 MySQL 线程丢失了心跳,ProxySQL 将发送一个 SIGABRT 信号并重启这个
线程。默认值为 10。见 watchdog。
• execute_on_exit_failure:(1.4.4 版本引入)如果设置了该变量,ProxySQL 父进程将在每次 ProxySQL 崩溃的时候执行已经定义好的
脚本。建议使用它来生成一些崩溃时的警告和日志。注意,ProxySQL 的重启速度可能只有几毫秒,因此很多其它的监控工具可能无法
探测到 ProxySQL 的一次普通故障,此时可使用该变量。
第一次 startup (或者使用--initial 选项)
第一次启动 ProxySQL 时,会从传统配置文件中加载配置项来初始化 memory 和 runtime 的配置。然后将内存中的配置持久化到 SQLite 数据库
中。可使用--initial 选项来强制初始化 ProxySQL,这会将 SQLite 数据库重置为最原始状态(即和传统配置文件里的配置保持一致的状态),
并在必要时重命名已存在的 SQLite 数据库文件名。
Reload(或--reload flag)
如果 proxysql 使用--reload 选项,则将尝试对传统配置文件和数据库文件进行合并,然后进入普通的启动过程。
ProxySQL 无法保证在两个配置源存在冲突时能成功合并,因此用户应该去验证合并行为是否达到预期合并结果。
在 runtime 下修改配置
要修改 runtime 的配置,需要使用 ProxySQL 的管理接口,端口号默认 6032。连接后,可用通过查询来获取相关表:
mysql> show tables;
+-------------------+
| tables |
+-------------------+
| mysql_servers |
| mysql_users |
| mysql_query_rules |
| global_variables |
| mysql_collations |
| debug_levels |
+-------------------+
6 rows in set (0.01 sec)
管理接口中的每个表是根据它们的角色进行定义命名的:
• mysql_servers:包含 ProxySQL 需要连接的后端服务器节点列表。
• mysql_users:包含 ProxySQL 用来连接后端节点时使用用户凭证列表。
• mysql_query_rules:包含 ProxySQL 将请求路由到后端节点、缓存、重写 SQL 时使用的规则。
• global_variables:包含 ProxySQL 进行初始化时所定义的 MySQL 变量以及管理变量。