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 走主库,验证事务一致性行为。