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 RUNTIMESAVE ... TO DISK
  • 定期检查 stats_mysql_query_digest 表优化慢查询。
  • ProxySQL 的配置可以在不重启的情况下动态生效。

总结

ProxySQL 是目前最强大的 MySQL 代理方案,其动态配置能力和丰富的查询路由规则使其成为生产环境的首选。PostgreSQL 用户可以参考 Pgpool-II 教程,Redis 代理可以参考 Twemproxy 教程。选购搬瓦工 VPS 请查看 全部方案,购买时使用优惠码 NODESEEK2026 可享受 6.77% 的折扣,通过 bwh81.net 访问官网。

关于本站

搬瓦工VPS中文网(bwgvps.com)是非官方中文信息站,整理搬瓦工的方案、优惠和教程。我们不销售主机,不提供技术服务。

新手必读
搬瓦工优惠码

NODESEEK2026(优惠 6.77%)

购买时填入即可抵扣。