14.6.4 故障切换机制与自动恢复
故障切换机制与自动恢复在 ProxySQL 中依赖“健康检查 + 状态机 + 路由规则”的联动。核心原则是:探测失败即下线、恢复健康再上线,并在最小影响范围内重定向连接。
示例:配置故障切换与自动恢复#
假设 ProxySQL 已安装并可访问 admin 端口 6032,后端 MySQL 两节点。
-- 1) 登录 admin
mysql -u admin -padmin -h 127.0.0.1 -P6032
-- 2) 定义后端节点与分组(10 写,20 读)
INSERT INTO mysql_servers(hostgroup_id, hostname, port, weight, max_connections)
VALUES
(10,'10.0.0.11',3306,100,200),
(20,'10.0.0.12',3306,100,200);
-- 3) 健康检查与故障阈值(关键参数)
UPDATE global_variables SET variable_value='2000' WHERE variable_name='mysql-monitor_interval';
UPDATE global_variables SET variable_value='1000' WHERE variable_name='mysql-monitor_timeout';
UPDATE global_variables SET variable_value='3' WHERE variable_name='mysql-monitor_history';
UPDATE global_variables SET variable_value='2' WHERE variable_name='mysql-monitor_connect_interval';
UPDATE global_variables SET variable_value='2' WHERE variable_name='mysql-monitor_ping_interval';
-- 4) 载入与持久化
LOAD MYSQL SERVERS TO RUNTIME;
SAVE MYSQL SERVERS TO DISK;
LOAD MYSQL VARIABLES TO RUNTIME;
SAVE MYSQL VARIABLES TO DISK;
命令解释:
- mysql-monitor_interval:健康检查周期(毫秒),越小切换越快但易误判。
- mysql-monitor_timeout:单次探测超时(毫秒),避免慢探测阻塞。
- mysql-monitor_history:失败历史窗口,降低抖动误判。
- LOAD ... TO RUNTIME:立即生效;SAVE ... TO DISK:持久化。
示例:模拟故障与观察切换#
# 在故障节点上停止 MySQL(模拟宕机)
sudo systemctl stop mysqld
# 回到 ProxySQL admin 查看状态
mysql -u admin -padmin -h 127.0.0.1 -P6032 -e \
"SELECT hostgroup_id,hostname,port,status FROM runtime_mysql_servers;"
预期效果: 宕机节点状态变为 OFFLINE_HARD/SHUNNED,新连接路由到健康节点。
示例:自动恢复与渐进式上线#
# 恢复后端 MySQL
sudo systemctl start mysqld
# 降低权重先观察
mysql -u admin -padmin -h 127.0.0.1 -P6032 -e \
"UPDATE mysql_servers SET weight=10 WHERE hostname='10.0.0.11';
LOAD MYSQL SERVERS TO RUNTIME; SAVE MYSQL SERVERS TO DISK;"
预期效果: 节点恢复为 ONLINE,但初始分配少量流量,验证稳定后再逐步恢复权重。
排错清单与命令#
# 1) 检查监控账户是否可用(连接失败会导致误判)
mysql -u monitor -p'pass' -h 10.0.0.11 -P3306 -e "SELECT 1;"
# 2) 查看监控日志与状态表
mysql -u admin -padmin -h 127.0.0.1 -P6032 -e \
"SELECT * FROM monitor.mysql_server_connect_log ORDER BY time_start DESC LIMIT 5;"
常见问题:
- 状态反复跳变:提高 mysql-monitor_history,增大 mysql-monitor_timeout。
- 恢复后不回 Online:检查监控账户权限与 MySQL 只读状态。
- 写库切换引发事务失败:应用需具备重试与幂等。
安装/环境检查(简要)#
# 确认 ProxySQL 服务与管理端口
systemctl status proxysql
ss -lntp | grep 6032
练习#
- 调整
mysql-monitor_interval为 1000ms,重复宕机测试,记录切换时间。 - 使用
OFFLINE_SOFT模式将读节点平滑下线,观察现有连接变化。 - 为写库设置更严格阈值(增加 history),验证误判率下降。