在 ProxySQL 中配置了读写分离后,如果备节点(Replica)挂了,可以通过以下步骤将读请求自动或手动路由到主节点(Master),确保服务可用性:
1. 自动故障转移(推荐方案)
ProxySQL 支持基于健康检查的自动故障转移,需提前配置:
步骤:
启用健康检查
确保mysql_servers
表中的max_replication_lag
和健康检查参数已配置:UPDATE mysql_servers SET max_replication_lag=5, check_interval=1000, ping_interval=1000 WHERE hostgroup_id=读组ID;
max_replication_lag
:允许的最大复制延迟(秒)。check_interval
:健康检查间隔(毫秒)。
配置故障转移规则
在mysql_replication_hostgroups
表中定义主从关系:INSERT INTO mysql_replication_hostgroups (writer_hostgroup, reader_hostgroup) VALUES (写组ID, 读组ID);
ProxySQL 会自动将不可用的备节点移出读组。
动态调整路由权重
如果主节点需要临时承担读流量,可以调整mysql_servers
中主节点的权重:UPDATE mysql_servers SET weight=100 WHERE hostgroup_id=写组ID AND address='主节点IP';
加载并生效配置
LOAD MYSQL SERVERS TO RUNTIME; SAVE MYSQL SERVERS TO DISK; -- 持久化配置
2. 手动切换(应急处理)
如果未配置自动故障转移,可手动操作:
步骤:
将备节点移出读组
修改mysql_servers
表,标记备节点为离线:UPDATE mysql_servers SET status='OFFLINE_SOFT' WHERE address='备节点IP';
将主节点加入读组
通过临时修改路由规则,将主节点的hostgroup_id
同时分配到读写组: “`sql INSERT INTO mysql_servers (hostgroup_id, hostname, port) VALUES (读组ID, ‘主节点IP’, 3306);重新加载配置
LOAD MYSQL SERVERS TO RUNTIME;
SAVE MYSQL SERVERS TO DISK;
3. 验证路由状态
- 查看当前活跃节点:
SELECT * FROM stats_mysql_connection_pool WHERE hostgroup_id IN (写组ID, 读组ID);
- 监控查询路由:
SELECT * FROM stats_mysql_query_digest WHERE digest_text LIKE '%SELECT%';
关键注意事项
- 避免过载主节点:
若备节点长期不可用,建议扩容或修复备节点,避免主节点因承担读写压力而崩溃。 - 会话一致性:
某些业务可能需要强制读主库(如刚写入后的查询),可通过 SQL Hint 实现: “`sql SELECT /*+ MAXSCALE_ROUTE_TO_WRITER */ * FROM table; - ProxySQL版本兼容性: 不同版本的ProxySQL对高可用支持可能有差异(建议使用v2.x以上版本)。
如果需要更详细的ProxySQL高可用架构设计或配置文件示例可以提供具体场景需求。
内容由零声教学AI助手提供,问题来源于学员提问