流量切换本质是运行时动态重定向读请求至从库或主库,基于延迟、负载等实时条件调整;支持代理自动剔除延迟超阈值从库、fallback降级主库、配置中心热更新、AOP注解显式控制及上下文感知兜底。

流量切换在读写分离架构中,本质是把原本发往主库的读请求,在运行时重新导向从库(或不同从库),甚至必要时切回主库。它不是一次性配置,而是根据延迟、负载、健康状态等实时条件动态调整路由策略。
基于数据库代理的自动流量切换
像 Mycat2、ShardingSphere-Proxy、ProxySQL 或云厂商的数据库代理,都内置了读节点健康检查与延迟感知能力。它们会定期探测从库的同步延迟(如 Seconds_Behind_Master)和连接可用性:
- 当某从库延迟超过阈值(例如 5 秒),代理自动将其从读节点池中剔除,后续 SELECT 请求不再路由过去
- 若所有从库延迟超标或全部不可用,可配置 fallback 策略——比如自动将读请求降级到主库(需开启 read_from_master_when_no_slave)
- 延迟恢复后,代理会在下个检测周期自动将其加回读池,流量平滑回归
应用层结合 AOP 或注解的显式切换
在 Spring 生态中,可通过 AOP 拦截方法调用,结合自定义注解(如 @ReadFromSlave、@ForceMaster)控制读流量去向:
- @ReadFromSlave 标记的方法,走从库;若当前无可用从库,则按配置决定是抛异常还是静默降级
- @ForceMaster 显式要求强一致性读,绕过所有读分离逻辑,直连主库
- 配合线程本地变量(ThreadLocal)存储路由偏好,确保同一线程内读写事务不跨节点
运行时配置热更新驱动的动态重定向
不重启服务也能调整读流量分布。关键在于把路由规则外置化:
- 将从库权重、启用状态、延迟容忍值等存入配置中心(如 Nacos、Apollo)
- 代理或数据源组件监听配置变更,实时刷新内部节点列表与负载策略
- 运维可通过控制台一键禁用某从库,或临时提升某节点权重,实现秒级流量调度
延迟敏感型读的智能兜底机制
对“刚写完立刻查”的场景,不能只靠 SQL 类型判断。需引入上下文感知:
- 在写操作后打上时间戳或版本标记,后续关联读请求携带该标记
- 代理或中间件检查该标记对应的数据是否已在目标从库完成同步(通过 GTID 或 binlog 位点比对)
- 未同步则主动路由至主库,或等待(短超时)后再试,避免脏读











