14.6.1 负载均衡策略与算法配置

本节聚焦 ProxySQL 在负载均衡中的策略与算法配置,结合 hostgroup 与调度算法实现连接与查询的均衡分配,并给出可执行示例、验证、排错与练习。

原理草图(调度与路由)#

文章图片

负载均衡算法与适用场景#

  • random:随机选择后端,适用于后端性能差异不大、请求分布均匀。
  • round-robin:轮询分发,适合后端性能相近、稳定性要求高。
  • least-connections:优先选择连接数最少后端,适用于连接时长不均、并发波动大。
  • weighted:结合权重与算法分配,适用于异构硬件、灰度流量控制。

关键配置表与字段说明#

  • mysql_servers:后端节点与 hostgroup 定义
  • hostgroup_id:后端组编号
  • weight:权重,数值越大分配流量越多
  • statusONLINE/OFFLINE_SOFT/OFFLINE_HARD
  • max_connections:单后端连接上限
  • mysql_query_rules:基于规则路由到不同 hostgroup
  • mysql_replication_hostgroups:读写分离关系(若启用)

安装与连接(本节示例的前置)#

# 安装(以 Debian/Ubuntu 为例)
sudo apt-get update
sudo apt-get install -y proxysql

# 连接 ProxySQL 管理端口(默认 6032)
mysql -u admin -padmin -h 127.0.0.1 -P 6032

命令说明
- -u admin -padmin:默认管理用户与密码
- -P 6032:管理端口
- 连接后进入 ProxySQL 管理 SQL 控制台

配置示例:权重 + 算法 + 规则#

目标:读组 10 内两台后端权重 2:1,写组 20 为单主;读请求走读组,写请求走写组。

-- 1) 配置后端
INSERT INTO mysql_servers(hostgroup_id,hostname,port,weight,max_connections,status)
VALUES
(10,'192.168.10.11',3306,200,2000,'ONLINE'),
(10,'192.168.10.12',3306,100,2000,'ONLINE'),
(20,'192.168.10.13',3306,1000,2000,'ONLINE');

-- 2) 设置读写路由规则(示例:SELECT 走读组,其他走写组)
INSERT INTO mysql_query_rules(rule_id,active,match_pattern,destination_hostgroup,apply)
VALUES
(100,1,'^SELECT',10,1),
(200,1,'.*',20,1);

-- 3) 应用与持久化
LOAD MYSQL SERVERS TO RUNTIME;
SAVE MYSQL SERVERS TO DISK;
LOAD MYSQL QUERY RULES TO RUNTIME;
SAVE MYSQL QUERY RULES TO DISK;

命令说明
- LOAD ... TO RUNTIME:立即生效
- SAVE ... TO DISK:持久化到磁盘配置

观察与验证#

-- 查看连接池分布与权重效果
SELECT hostgroup, srv_host, srv_port, ConnUsed, ConnFree, Status
FROM stats_mysql_connection_pool
ORDER BY hostgroup, srv_host;

预期效果
- 读组 10 内 192.168.10.11 的连接数约为 192.168.10.12 的 2 倍(非严格比例,视请求形态而定)。

故障排错清单(常见与处理)#

-- 1) 后端被标记为离线
SELECT hostgroup_id,hostname,status,comment
FROM mysql_servers;

-- 2) 路由规则未生效
SELECT rule_id,active,match_pattern,destination_hostgroup
FROM mysql_query_rules;

-- 3) 运行时与磁盘配置不一致
SELECT * FROM runtime_mysql_servers;
SELECT * FROM disk.mysql_servers;

排错思路
- status=OFFLINE_SOFT/HARD:检查后端 MySQL 可用性与健康检查
- rule_id 未生效:确认 active=1LOAD ... TO RUNTIME 已执行
- 运行时/磁盘不一致:执行 SAVELOAD 保持一致

练习#

  1. 将读组权重从 2:1 调整为 3:1,并观察连接池变化。
  2. least-connections 适配场景写入说明,并在高并发压测下对比 round-robin
  3. 模拟读组其中一台 MySQL 下线(OFFLINE_SOFT),验证读流量是否自动转移。