14.1 ProxySQL概述与应用场景
ProxySQL 是位于应用与 MySQL 之间的高性能代理层,提供连接复用、查询路由、读写分离、负载均衡与故障切换等能力。它通过可编程规则实现细粒度流量控制,支持多后端与多用户策略,适用于读多写少、分库分表、跨机房访问、灰度发布与容量扩展等场景。典型应用包括:为主从集群实现透明读写分离;对热点业务进行分流与限流;在升级或迁移中进行流量切换;统一连接入口以降低应用侧复杂度。适合中大型业务数据库架构治理与性能优化。
原理与位置关系(草图):
快速安装示例(以 CentOS/RHEL 为例):
# 1) 添加官方仓库
cat >/etc/yum.repos.d/proxysql.repo <<'EOF'
[proxysql_repo]
name=ProxySQL YUM repository
baseurl=https://repo.proxysql.com/ProxySQL/proxysql-2.4.x/centos/\$releasever
gpgcheck=0
enabled=1
EOF
# 2) 安装并启动
yum install -y proxysql
systemctl enable --now proxysql
# 3) 验证监听端口(6032 管理端,6033 业务端)
ss -lntp | grep proxysql
最小可运行配置示例(包含主从、读写分离规则):
-- 连接管理端
mysql -uadmin -padmin -h127.0.0.1 -P6032
-- 1) 定义后端主从
INSERT INTO mysql_servers(hostgroup_id,hostname,port) VALUES
(10,'10.0.0.11',3306), -- 主库
(20,'10.0.0.12',3306), -- 从库1
(20,'10.0.0.13',3306); -- 从库2
-- 2) 定义用户(与后端 MySQL 用户一致)
INSERT INTO mysql_users(username,password,default_hostgroup,transaction_persistent)
VALUES('app','app_pwd',10,1);
-- 3) 读写分离规则:SELECT 走从库,其他走主库
INSERT INTO mysql_query_rules(rule_id,active,match_pattern,destination_hostgroup,apply)
VALUES(100,1,'^SELECT.*',20,1);
-- 4) 应用配置到运行层并持久化
LOAD MYSQL SERVERS TO RUNTIME; SAVE MYSQL SERVERS TO DISK;
LOAD MYSQL USERS TO RUNTIME; SAVE MYSQL USERS TO DISK;
LOAD MYSQL QUERY RULES TO RUNTIME; SAVE MYSQL QUERY RULES TO DISK;
业务验证示例(期望:SELECT 走从库,UPDATE 走主库):
# 连接业务端口 6033
mysql -uapp -papp_pwd -h127.0.0.1 -P6033 -e "SELECT @@hostname;"
mysql -uapp -papp_pwd -h127.0.0.1 -P6033 -e "UPDATE t SET v=1 WHERE id=1;"
# 查看路由统计(在管理端)
mysql -uadmin -padmin -h127.0.0.1 -P6032 -e \
"SELECT hostgroup, srv_host, Queries FROM stats_mysql_connection_pool;"
关键命令解释:
- LOAD ... TO RUNTIME:将配置加载到内存生效。
- SAVE ... TO DISK:将运行配置持久化到磁盘(避免重启丢失)。
- stats_* 表:查询流量、连接池、后端健康等统计信息。
常见排错与定位:
# 1) 代理端口是否监听
ss -lntp | grep 6033
# 2) 检查后端连通性(从 ProxySQL 主机发起)
mysql -uapp -papp_pwd -h10.0.0.11 -P3306 -e "SELECT 1;"
# 3) 查看 ProxySQL 日志(默认路径)
tail -f /var/log/proxysql.log
# 4) 查询后端状态与错误
mysql -uadmin -padmin -h127.0.0.1 -P6032 -e \
"SELECT hostgroup_id,hostname,status,ConnUsed,Latency_us FROM stats_mysql_connection_pool;"
练习:
1) 将 SELECT /*force_master*/ 走主库:新增规则匹配该注释并路由到主库。
2) 模拟从库故障:停止从库 MySQL 服务,观察 stats_mysql_connection_pool 中状态变化。
3) 将读规则调整为 ^SELECT.*FOR UPDATE 走主库,验证事务一致性行为。