ProxySQL 基础
一、ProxySQL 介绍
ProxySQL 是基于MySQL的一款开源的中间件产品,是一个灵活的MySQL代理层,可以实现读写分离,支持Query路由功能,支持动态指定某个SQL进行缓存,支持动态加载(无需重新ProxySQL服务),故障切换和一些过滤功能。
ProxySQL相关网站:
https://www.proxysql.com/
https://github.com/sysown/proxysql/wiki
二、环境准备
IP | server-id | 数据库版本 | 备注 |
192.168.1.1 | 13306 | 5.7.28 | Master+ProxySQL |
192.168.1.2 | 23306 | 5.7.28 | slave |
192.168.1.3 | 33306 | 5.7.28 | slave |

ProxySQL 2.0.x 版本支持 MGR
三、ProxySQL 安装与启动
1.下载
wget https://github.com/sysown/proxysql/releases/download/v2.0.8/proxysql-2.0.8-1-centos7.x86_64.rpm
2.安装ProxySQL
# rpm -ivh proxysql-2.0.8-1-centos7.x86_64.rpm
查看安装路径及我文件
# rpm -ql proxysql /etc/logrotate.d/proxysql /etc/proxysql.cnf /etc/systemd/system/proxysql.service /usr/bin/proxysql /usr/share/proxysql/tools/proxysql_galera_checker.sh /usr/share/proxysql/tools/proxysql_galera_writer.pl
/etc/proxysql.cnf 是 ProxySQL 的配置文件
3.启动ProxySQL
# systemctl start proxysql.service 查看是否启动 # netstat -anlp | grep proxysql
6032 是 ProxySQL 的管理端口号,6033是对外服务的端口号
ProxySQL 的用户名和密码都是默认的 admin
4.管理登陆ProxySQL
# mysql -uadmin -padmin -h127.0.0.1 -P6032 mysql> show databases; +-----+---------------+---------------------------------------+ | seq | name | file | +-----+---------------+---------------------------------------+ | 0 | main | | | 2 | disk | /data/proxysql/data/proxysql.db | | 3 | stats | | | 4 | monitor | | | 5 | stats_history | /data/proxysql/data/proxysql_stats.db | +-----+---------------+---------------------------------------+
有五个数据库:main、disk、stats 、monitor 和 stats_history
A. main:内存配置数据库,即:MEMORY,表里存放后端DB实例、用户验证、路由规则等…
B.main库下的主要几张表:
mysql_servers:后端可以连接MySQL服务器的列表
mysql_users:配置后端数据库的账号和监控的账号
mysql_query_rules:指定query 路由到后端不同服务器的规则列表
注:表名以 runtime_开头的表示ProxySQL当前运行的配置内容,不能通过DML语句修改。
只能修改对应的不以 runtime 开头的表,然后 “LOAD” 使其生效,“SAVE” 使其存到硬盘以供下次重启加载。
C.disk:持久化磁盘的配置
D.stats:统计信息的汇总
E.monitor:一些监控的收集信息,比如数据库的健康状态等。
F.stats_history:这个库是ProxySQL收集有关其内部功能的历史指标
5.配置ProxySQL所需账户
在master(192.168.1.1)上的mysql上创建ProxySQL的监控账户和对外访问账户
# proxysql 监控账号 create user monitor@'192.%' identified by ‘Monitor@qq.com’; grant select on *.* to monitor@'192.%’; # proxysql 对外访问账号 create user yoon@'192.%' identified by ‘Yoon123!@#’; grant all privileges on *.* to yoon@'192.%'; flush privileges;
注意:8.0.X 用户认证需要修改mysql_native_password
在配置文件中添加用户认证方式:
[mysqld]
default_authentication_plugin=mysql_native_password
6.ProxySQL配置结构如下:

整套配置系统分为三层:
1.RUNTIME
2.MEMORY
3.DISK 和 CONFIG FILE
RUNTIME:代表proxysql当前生效的正在使用的配置,无法直接修改这里的配置,必须要从下一层load进来。
MEMORY:MEMORY层上面连接RUNTIME层,下面连接DISK持久层。这层可以操作proxysql配置,随便修改,不会影响生产环境。修改一个配置都是在MEMORY层完成的,确认正常之后在加载到RUNTIME和持久化的磁盘上。
DISK和CONFIG FILE:持久化配置信息,重启后内存中的数据会消失,所需要将配置信息保存到磁盘中,重启时,可从磁盘加载。
7.重新配置MySQL用户:
1、LOAD MYSQL USERS FROM MEMORY / LOAD MYSQL USERS TO RUNTIME
将内存数据库中的配置加载到 runtime 数据结构,反之亦然。
2、SAVE MYSQL USERS TO MEMORY / SAVE MYSQL USERS FROM RUNTIME
将 MySQL 用户从 runtime 持久化到内存数据库。
3、LOAD MYSQL USERS TO MEMORY / LOAD MYSQL USERS FROM DISK
从磁盘数据库中加载 MySQL 用户到内存数据库中。
4、SAVE MYSQL USERS FROM MEMORY / SAVE MYSQL USERS TO DISK
将内存数据库中的 MySQL 用户持久化到磁盘数据库中。
5、LOAD MYSQL USERS FROM CONFIG
从配置文件中加载 MySQL 用户到内存数据库中。
8.要处理MySQL Server:
1、LOAD MYSQL SERVERS FROM MEMORY / LOAD MYSQL SERVERS TO RUNTIME
将 MySQL server 从内存数据库中加载到 runtime。
2、SAVE MYSQL SERVERS TO MEMORY / SAVE MYSQL SERVERS FROM RUNTIME
将 MySQL server 从 runtime 持久化到内存数据库中。
3、LOAD MYSQL SERVERS TO MEMORY / LOAD MYSQL SERVERS FROM DISK
从磁盘数据库中加载 MySQL server 到内存数据库。
4、SAVE MYSQL SERVERS FROM MEMORY / SAVE MYSQL SERVERS TO DISK
从内存数据库中将 MySQL server 持久化到磁盘数据库中。
5、LOAD MYSQL SERVERS FROM CONFIG
从配置文件中加载 MySQL server 到内存数据库中
9.要处理MySQL的查询规则(mysql query rules):
1、 LOAD MYSQL QUERY RULES FROM MEMORY / LOAD MYSQL QUERY RULES TO RUNTIME
将 MySQL query rules 从内存数据库加载到 runtime 数据结构。
2、 SAVE MYSQL QUERY RULES TO MEMORY / SAVE MYSQL QUERY RULES FROM RUNTIME
将 MySQL query rules 从 runtime 数据结构中持久化到内存数据库。
3、 LOAD MYSQL QUERY RULES TO MEMORY / LOAD MYSQL QUERY RULES FROM DISK
从磁盘数据库中加载 MySQL query rules 到内存数据库中。
4、 SAVE MYSQL QUERY RULES FROM MEMORY / SAVE MYSQL QUERY RULES TO DISK
将 MySQL query rules 从内存数据库中持久化到磁盘数据库中。
5、 LOAD MYSQL QUERY RULES FROM CONFIG
从配置文件中加载 MySQL query rules 到内存数据库中。
10.要处理MySQL 变量(mysql variables):
1、 LOAD MYSQL VARIABLES FROM MEMORY / LOAD MYSQL VARIABLES TO RUNTIME
将 MySQL variables 从内存数据库加载到 runtime 数据结构。
2、 SAVE MYSQL VARIABLES TO MEMORY / SAVE MYSQL VARIABLES FROM RUNTIME
将 MySQL variables 从 runtime 数据结构中持久化到内存数据中。
3、 LOAD MYSQL VARIABLES TO MEMORY / LOAD MYSQL VARIABLES FROM DISK
从磁盘数据库中加载 MySQL variables 到内存数据库中。
4、 SAVE MYSQL VARIABLES FROM MEMORY / SAVE MYSQL VARIABLES TO DISK
将 MySQL variables 从内存数据库中持久化到磁盘数据库中。
5、 LOAD MYSQL VARIABLES FROM CONFIG
从配置文件中加载 MySQL variables 到内存数据库中。
11.要处理管理变量:
1、 LOAD ADMIN VARIABLES FROM MEMORY / LOAD ADMIN VARIABLES TO RUNTIME
将 admin variables 从内存数据库加载到 runtime 数据结构。
2、 SAVE ADMIN VARIABLES TO MEMORY / SAVE ADMIN VARIABLES FROM RUNTIME
将 admin variables 从 runtime 持久化到内存数据库中。
3、 LOAD ADMIN VARIABLES TO MEMORY / LOAD ADMIN VARIABLES FROM DISK
从磁盘数据库中加载 admin variables 到内存数据库中。
4、 SAVE ADMIN VARIABLES FROM MEMORY / SAVE ADMIN VARIABLES TO DISK
将 admin variables 从内存数据库中持久化到磁盘数据库。
5、 LOAD ADMIN VARIABLES FROM CONFIG
从配置文件中加载 admin variables 到内存数据库中。

一般在内存层修改,然后保存到运行系统,保存到磁盘数据库系统
load xxx to runtime;
save xxx to disk;
管理配置:
disk and config file 持久化配置文件
disk -> 是sqlite3 数据库 ,默认位置是$DATADIR/proxysql.db( /var/lib/proxysql/proxysql.db)
config file 是一个传统配置文件:一般不更改
三者关系:
1.ProxySQL启动时,首先去找/etc/proxysql.cnf配置文件,找到它的datadir,如果datadir下有proxysql.db,就加载proxysql.db
2.如果启动时,带有—init标志,会用/etc/proxysql.cnf的配置,把runtime、disk全部初始化一下
3.在调用是调用-reload会把/etc/proxysql.cnf和disk中配置进行合并。如果冲突需要用户干预。disk会覆盖config file
传统配置文件:
传统配置文件默认路径为/etc/proxysql.cnf,也可以在二进制程序proxysql上使用-c或–config来手动指定配置文件
小结:
几个常用的命令:(只要不加载到runtime,修改的配置就不会生效)
LOAD MYSQL USERS TO RUNTIME; 将内存数据库中的配置加载到 runtime 数据结构
SAVE MYSQL USERS TO DISK; 将内存数据库中的 MySQL 用户持久化到磁盘数据库中。
LOAD MYSQL SERVERS TO RUNTIME; 将 MySQL server 从内存数据库中加载到 runtime。
SAVE MYSQL SERVERS TO DISK; 从内存数据库中将 MySQL server 持久化到磁盘数据库中。
LOAD MYSQL QUERY RULES TO RUNTIME; 将 MySQL query rules 从内存数据库加载到 runtime 数据结构。
SAVE MYSQL QUERY RULES TO DISK; 将 MySQL query rules 从内存数据库中持久化到磁盘数据库中。
LOAD MYSQL VARIABLES TO RUNTIME; 将 MySQL variables 从内存数据库加载到 runtime 数据结构。
SAVE MYSQL VARIABLES TO DISK; 将 MySQL variables 从内存数据库中持久化到磁盘数据库中。
LOAD ADMIN VARIABLES TO RUNTIME; 将 admin variables 从内存数据库加载到 runtime 数据结构。
SAVE ADMIN VARIABLES TO DISK; 将 admin variables 从内存数据库中持久化到磁盘数据库。
注意:只有加载到 runtime 状态时才会去做最后的有效性验证。在保存到内存数据库或持久化到磁盘上时,都不会发生任何警告或错误。当加载到 runtime 时,如果出现错误,将恢复为之前保存得状态,这时可以去检查错误日志。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
2019-06-27 运行python脚本后台执行