ProxySQL MySQL 代理中间件教程
ProxySQL 是一款高性能的 MySQL 代理中间件,支持智能查询路由、读写分离、连接池管理、查询缓存和实时配置变更。与传统的 MySQL Proxy 不同,ProxySQL 通过管理界面动态调整配置无需重启服务。本文将在搬瓦工 VPS 上完整演示 ProxySQL 的部署和配置。
一、安装 ProxySQL
# Ubuntu/Debian
apt update
apt install -y lsb-release gnupg2
# 添加 ProxySQL 仓库
wget -nv -O /etc/apt/trusted.gpg.d/proxysql-2.5.x-keyring.gpg \
'https://repo.proxysql.com/ProxySQL/proxysql-2.5.x/repo_pub_key.gpg'
echo "deb https://repo.proxysql.com/ProxySQL/proxysql-2.5.x/$(lsb_release -sc)/ ./" > \
/etc/apt/sources.list.d/proxysql.list
apt update
apt install proxysql mysql-client -y
# 启动 ProxySQL
systemctl start proxysql
systemctl enable proxysql
# 验证安装
proxysql --version
二、管理界面
ProxySQL 通过 MySQL 协议的管理接口进行配置,默认监听 6032 端口:
# 连接管理界面(默认用户 admin,密码 admin)
mysql -u admin -padmin -h 127.0.0.1 -P 6032 --prompt='ProxySQL> '
# 查看版本
ProxySQL> SELECT @@version;
# 查看所有数据库(配置表)
ProxySQL> SHOW DATABASES;
# main - 运行时配置
# disk - 持久化配置
# stats - 统计信息
# monitor - 监控数据
三、添加后端 MySQL 服务器
# 连接到管理界面
mysql -u admin -padmin -h 127.0.0.1 -P 6032
# 添加主库(hostgroup 10 = 写组)
INSERT INTO mysql_servers (hostgroup_id, hostname, port, weight, max_connections)
VALUES (10, '127.0.0.1', 3306, 1, 100);
# 添加从库(hostgroup 20 = 读组)
INSERT INTO mysql_servers (hostgroup_id, hostname, port, weight, max_connections)
VALUES (20, '127.0.0.1', 3307, 1, 100);
# 加载到运行时
LOAD MYSQL SERVERS TO RUNTIME;
# 保存到磁盘
SAVE MYSQL SERVERS TO DISK;
# 查看服务器列表
SELECT * FROM mysql_servers;
四、配置用户
# 在 MySQL 主库中创建 ProxySQL 使用的用户
# mysql -u root -p
# CREATE USER 'proxyuser'@'%' IDENTIFIED BY 'proxypass';
# GRANT ALL ON mydb.* TO 'proxyuser'@'%';
# 在 ProxySQL 中添加用户
INSERT INTO mysql_users (username, password, default_hostgroup, max_connections)
VALUES ('proxyuser', 'proxypass', 10, 200);
LOAD MYSQL USERS TO RUNTIME;
SAVE MYSQL USERS TO DISK;
# 查看用户列表
SELECT username, default_hostgroup, active FROM mysql_users;
五、读写分离
# 配置查询规则实现读写分离
# 规则 1:SELECT 语句发送到读组(hostgroup 20)
INSERT INTO mysql_query_rules (rule_id, active, match_pattern, destination_hostgroup, apply)
VALUES (1, 1, '^SELECT.*FOR UPDATE$', 10, 1);
INSERT INTO mysql_query_rules (rule_id, active, match_pattern, destination_hostgroup, apply)
VALUES (2, 1, '^SELECT', 20, 1);
# 其他写操作默认发送到写组(hostgroup 10,由用户的 default_hostgroup 决定)
LOAD MYSQL QUERY RULES TO RUNTIME;
SAVE MYSQL QUERY RULES TO DISK;
# 查看查询规则
SELECT rule_id, active, match_pattern, destination_hostgroup FROM mysql_query_rules;
六、查询缓存
# 启用查询缓存(缓存 SELECT 结果)
UPDATE mysql_query_rules SET cache_ttl = 5000 WHERE rule_id = 2;
LOAD MYSQL QUERY RULES TO RUNTIME;
SAVE MYSQL QUERY RULES TO DISK;
# 全局缓存参数
SET mysql-query_cache_size_MB = 256;
LOAD MYSQL VARIABLES TO RUNTIME;
SAVE MYSQL VARIABLES TO DISK;
# 查看缓存命中统计
SELECT * FROM stats_mysql_query_digest ORDER BY sum_time DESC LIMIT 10;
七、连接池管理
# 调整连接池参数
SET mysql-max_connections = 2048;
SET mysql-free_connections_pct = 10;
SET mysql-connection_max_age_ms = 0;
SET mysql-sessions_sort = 1;
LOAD MYSQL VARIABLES TO RUNTIME;
SAVE MYSQL VARIABLES TO DISK;
# 查看连接池状态
SELECT * FROM stats_mysql_connection_pool;
# 查看活跃连接
SELECT * FROM stats_mysql_processlist;
八、监控配置
# 在 MySQL 中创建监控用户
# CREATE USER 'monitor'@'%' IDENTIFIED BY 'monitorpass';
# GRANT USAGE, REPLICATION CLIENT ON *.* TO 'monitor'@'%';
# 配置监控
SET mysql-monitor_username = 'monitor';
SET mysql-monitor_password = 'monitorpass';
SET mysql-monitor_connect_interval = 2000;
SET mysql-monitor_ping_interval = 2000;
SET mysql-monitor_read_only_interval = 1500;
LOAD MYSQL VARIABLES TO RUNTIME;
SAVE MYSQL VARIABLES TO DISK;
# 查看监控日志
SELECT * FROM monitor.mysql_server_connect_log ORDER BY time_start_us DESC LIMIT 10;
SELECT * FROM monitor.mysql_server_ping_log ORDER BY time_start_us DESC LIMIT 10;
九、性能统计
# 查看查询统计摘要
SELECT hostgroup, schemaname, digest_text, count_star, sum_time
FROM stats_mysql_query_digest
ORDER BY sum_time DESC LIMIT 20;
# 查看全局统计
SELECT * FROM stats_mysql_global WHERE Variable_Name LIKE 'Query%';
# 查看连接统计
SELECT * FROM stats_mysql_global WHERE Variable_Name LIKE 'Client%';
# 重置统计
SELECT * FROM stats_mysql_query_digest_reset;
十、应用连接
# 应用通过 ProxySQL 连接数据库(默认端口 6033)
mysql -u proxyuser -pproxypass -h 127.0.0.1 -P 6033 -e "SELECT 1"
# 在应用配置中将数据库地址改为 ProxySQL
# host: 127.0.0.1
# port: 6033
# user: proxyuser
# password: proxypass
十一、最佳实践
- 始终修改默认的管理界面密码:
UPDATE global_variables SET variable_value='newpassword' WHERE variable_name='admin-admin_credentials'; - 根据后端 MySQL 的性能合理设置
max_connections。 - 配置完成后务必执行
LOAD ... TO RUNTIME和SAVE ... TO DISK。 - 定期检查
stats_mysql_query_digest表优化慢查询。 - ProxySQL 的配置可以在不重启的情况下动态生效。
总结
ProxySQL 是目前最强大的 MySQL 代理方案,其动态配置能力和丰富的查询路由规则使其成为生产环境的首选。PostgreSQL 用户可以参考 Pgpool-II 教程,Redis 代理可以参考 Twemproxy 教程。选购搬瓦工 VPS 请查看 全部方案,购买时使用优惠码 NODESEEK2026 可享受 6.77% 的折扣,通过 bwh81.net 访问官网。