14.6.3 健康检查与后端状态探测
健康检查是ProxySQL判定后端MySQL实例可用性与角色状态的核心机制,直接影响路由与故障切换的准确性与稳定性。本节给出原理草图、可执行配置示例、验证与排错流程。
原理草图(探测流程与状态流转):
健康检查类型与关键点:
- 连接性检查:验证TCP连接、认证与最小权限,定位网络或账号问题。
- 可读性检查:从库读探测,防止路由到只读不可用实例。
- 可写性检查:主库写探测,保证写流量准确。
- 延迟探测:结合replication lag控制只读流量分配。
安装与初始化(示例环境):
# 1) 安装ProxySQL(Ubuntu示例)
sudo apt-get update
sudo apt-get install -y proxysql
# 2) 启动与登录
sudo systemctl enable --now proxysql
mysql -u admin -padmin -h 127.0.0.1 -P6032
配置监控用户与探测参数(完整可执行示例):
-- 进入ProxySQL管理端
-- 1) 配置监控用户(MySQL端需同步创建)
SET mysql-monitor_username='mon';
SET mysql-monitor_password='monpwd';
-- 2) 探测间隔与超时(毫秒)
SET mysql-monitor_connect_interval=2000;
SET mysql-monitor_connect_timeout=1000;
SET mysql-monitor_ping_interval=2000;
SET mysql-monitor_ping_timeout=1000;
-- 3) 失败与恢复阈值
SET mysql-monitor_ping_max_failures=3;
SET mysql-monitor_read_only_max_timeout=1000;
-- 4) 载入并持久化
LOAD MYSQL VARIABLES TO RUNTIME;
SAVE MYSQL VARIABLES TO DISK;
MySQL端创建监控账号(最小权限示例):
-- 在MySQL主/从库执行
CREATE USER 'mon'@'%' IDENTIFIED BY 'monpwd';
GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'mon'@'%';
FLUSH PRIVILEGES;
后端节点与读写组配置示例(含权重与状态):
-- 写组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, 50, 200),
(20, '10.0.0.13', 3306, 50, 200);
LOAD MYSQL SERVERS TO RUNTIME;
SAVE MYSQL SERVERS TO DISK;
探测SQL配置示例(轻量可读性检查):
-- 使用读只读变量作为探测依据
SET mysql-monitor_read_only='true';
LOAD MYSQL VARIABLES TO RUNTIME;
SAVE MYSQL VARIABLES TO DISK;
运行时观测与命令解释:
-- 查看运行时状态:ONLINE/OFFLINE/SHUNNED
SELECT hostgroup_id, hostname, port, status, weight
FROM runtime_mysql_servers;
-- 查看监控结果与错误原因
SELECT * FROM monitor.mysql_server_connect_log
ORDER BY time_start_us DESC LIMIT 5;
-- 查看复制延迟(若可用)
SELECT * FROM monitor.mysql_server_replication_lag_log
ORDER BY time_start_us DESC LIMIT 5;
解释:
- runtime_mysql_servers.status 表示当前路由状态。
- monitor.*_log 记录探测失败原因,如认证失败、超时。
验证流程(模拟故障与恢复):
# 1) 手动停止从库MySQL服务
sudo systemctl stop mysql
# 2) 在ProxySQL管理端观察状态变化
mysql -u admin -padmin -h 127.0.0.1 -P6032 -e \
"SELECT hostname, status FROM runtime_mysql_servers WHERE hostgroup_id=20;"
# 3) 恢复MySQL
sudo systemctl start mysql
# 4) 等待恢复阈值,确认状态回到ONLINE
mysql -u admin -padmin -h 127.0.0.1 -P6032 -e \
"SELECT hostname, status FROM runtime_mysql_servers WHERE hostgroup_id=20;"
排错清单(含命令与定位点):
-- 1) 探测失败:检查监控用户与权限
SELECT * FROM monitor.mysql_server_connect_log ORDER BY time_start_us DESC LIMIT 3;
-- 2) 频繁SHUNNED:检查超时与失败阈值
SELECT variable_name, variable_value FROM global_variables
WHERE variable_name LIKE 'mysql-monitor%';
-- 3) 从库读失败:查看read_only判定
SELECT * FROM monitor.mysql_server_read_only_log ORDER BY time_start_us DESC LIMIT 3;
# 4) 网络连通性检查
nc -vz 10.0.0.12 3306
# 5) 认证与SQL探测
mysql -u mon -pmonpwd -h 10.0.0.12 -e "SELECT @@read_only;"
练习与自测:
1. 将 mysql-monitor_ping_interval 从2000改为500,观察状态抖动是否增加,并记录*_log变化。
2. 修改从库为 read_only=OFF,验证ProxySQL是否将其从只读组中摘除。
3. 设定 mysql-monitor_ping_max_failures=1,模拟短暂网络丢包,评估误判概率并给出合理参数。