在 ProxySQL 中配置读写分离后,若备节点(Replica)挂了,可以通过以下机制自动将读请求路由到主库(Primary),确保服务可用性:
1. 健康检查与自动故障转移
ProxySQL 会定期对后端节点进行健康检查(通过 mysql_servers
表配置)。如果备节点不可用,ProxySQL 会自动将其标记为 OFFLINE_HARD
并从读组中移除。
关键配置步骤:
启用健康检查:
UPDATE global_variables SET variable_value='true' WHERE variable_name='mysql-monitor_enabled';
设置监控频率(例如每3秒检查一次):
UPDATE global_variables SET variable_value='3000' WHERE variable_name='mysql-monitor_connect_interval';
定义监控用户(需在主备库创建):
UPDATE global_variables SET variable_value='monitor_user' WHERE variable_name='mysql-monitor_username';
UPDATE global_variables SET variable_value='monitor_password' WHERE variable_name='mysql-monitor_password';
2. 读写分离规则调整
默认情况下,ProxySQL 的读组(如 hostgroup_id=10
)只包含备节点。当备节点宕机时,需确保读流量可以 fallback 到主库(如 hostgroup_id=20
)。
修改查询规则:
-- 检查现有规则
SELECT * FROM mysql_query_rules;
-- 添加或修改规则:若备节点不可用,则将读请求路由到主库
INSERT INTO mysql_query_rules (rule_id, active, match_pattern, destination_hostgroup, apply)
VALUES (
100,
1,
'^SELECT.*FOR UPDATE', -- OLTP写操作仍走主库
20, -- hostgroup_id=20(主库)
1
), (
101,
1,
'^SELECT', -- 普通读操作默认走备库
10, -- hostgroup_id=10(备库)
1
), (
102,
1,
'^SELECT', -- Fallback规则:若无可用备库则路由到主库
20, -- hostgroup_id=20(主库)
0 -- apply=0表示仅在前面的规则不匹配时生效
);
-- (可选)设置规则的延迟生效条件,例如当备节点存活数<1时启用fallback
UPDATE mysql_query_rules SET comment="fallback_to_primary_if_no_replica" WHERE rule_id=102;
3. Galera/Group Replication支持
如果使用集群架构(如MySQL Group Replication或Galera),可配置 writer_hostgroup
和 backup_writer_hostgroup
实现高可用:
UPDATE mysql_group_replication_hostgroups
SET writer_hostgroup=20, backup_writer_hostgroup=30, reader_hostgroup=10;
4. ProxySQL Cluster模式
在多实例ProxySQL集群中,同步配置以确保所有节点感知后端状态变化:
LOAD MYSQL SERVERS TO RUNTIME; SAVE MYSQL SERVERS TO DISK;
LOAD MYSQL QUERY RULES TO RUNTIME; SAVE MYSQL QUERY RULES TO DISK;
验证与调试
查看节点状态:
SELECT hostname, status FROM runtime_mysql_servers;
监控日志:
tail -f /var/lib/proxysql/proxysql.log | grep "monitor"
通过以上配置,当备节点宕机时,ProxySQL会自动将读请求路由到主库。恢复后可手动或自动重新加入读组。
内容由零声教学AI助手提供,问题来源于学员提问