ZBLOG

proxySQL配置了读写分离,如果备节点挂了,要怎么做才能把读请求路由到主节点?

在 ProxySQL 中配置了读写分离后,如果备节点(Replica)挂了,可以通过以下步骤将读请求自动或手动路由到主节点(Master),确保服务可用性:


1. 自动故障转移(推荐方案)

ProxySQL 支持基于健康检查的自动故障转移,需提前配置:

步骤:

  1. 启用健康检查
    确保 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:健康检查间隔(毫秒)。
  2. 配置故障转移规则
    mysql_replication_hostgroups 表中定义主从关系:

    INSERT INTO mysql_replication_hostgroups (writer_hostgroup, reader_hostgroup) VALUES (写组ID, 读组ID);
    

    ProxySQL 会自动将不可用的备节点移出读组。

  3. 动态调整路由权重
    如果主节点需要临时承担读流量,可以调整 mysql_servers 中主节点的权重:

    UPDATE mysql_servers SET weight=100 WHERE hostgroup_id=写组ID AND address='主节点IP';
    
  4. 加载并生效配置

    LOAD MYSQL SERVERS TO RUNTIME;
    SAVE MYSQL SERVERS TO DISK; -- 持久化配置
    

2. 手动切换(应急处理)

如果未配置自动故障转移,可手动操作:

步骤:

  1. 将备节点移出读组
    修改 mysql_servers 表,标记备节点为离线:

    UPDATE mysql_servers SET status='OFFLINE_SOFT' WHERE address='备节点IP';
    
  2. 将主节点加入读组
    通过临时修改路由规则,将主节点的 hostgroup_id 同时分配到读写组: “`sql INSERT INTO mysql_servers (hostgroup_id, hostname, port) VALUES (读组ID, ‘主节点IP’, 3306);

  3. 重新加载配置

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%';

关键注意事项

  1. 避免过载主节点
    若备节点长期不可用,建议扩容或修复备节点,避免主节点因承担读写压力而崩溃。
  2. 会话一致性
    某些业务可能需要强制读主库(如刚写入后的查询),可通过 SQL Hint 实现: “`sql SELECT /*+ MAXSCALE_ROUTE_TO_WRITER */ * FROM table;
  3. ProxySQL版本兼容性: 不同版本的ProxySQL对高可用支持可能有差异(建议使用v2.x以上版本)。

如果需要更详细的ProxySQL高可用架构设计或配置文件示例可以提供具体场景需求。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=23531

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?