在 Sharding-Proxy(或类似中间件,如MyCat、ProxySQL等)中实现读写分离时,若备节点(Slave)宕机,需通过以下策略保证系统的高可用性和数据一致性:
一、核心解决方案
1. 自动故障检测与切换
- 健康检查机制
Sharding-Proxy 应定期(如每秒)向备节点发送心跳检测(SELECT 1
),超时或无响应则标记为不可用。
# 示例配置(ShardingSphere) dataSources: slave_ds: heartbeatIntervalMillis: 1000 maxLifetimeTimeMillis: 30000
- 动态路由切换
备节点宕机后,中间件自动将读请求路由到主节点(Master),避免业务中断。
2. 降级处理与告警
- 读操作降级
所有读请求临时由主节点处理(可能增加主库负载,需监控)。
- 实时告警通知
通过邮件/短信通知运维人员,及时修复备节点。
3. 恢复后的数据同步
备节点恢复后:
- 自动重连:中间件重新将其加入连接池。
- 增量同步:通过主库的binlog(如MySQL GTID)补全宕机期间的数据差异。
二、增强措施
1. 多从库冗余
部署多个备节点(如Slave1、Slave2),单个备节点宕机不影响整体读性能。
-- 读写分离配置示例
rules:
readwrite-splitting:
dataSources:
pr_ds:
writeDataSourceName: master_ds
readDataSourceNames: [slave_ds_1, slave_ds_2] # 多从库负载均衡
2. 半同步复制(Semi-Sync Replication)
确保主库事务至少同步到一个备节点后才返回成功,降低数据丢失风险:
-- MySQL主库配置
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
SET GLOBAL rpl_semi_sync_master_enabled = ON;
3. 熔断与限流
- 熔断机制:若主库压力过大,可拒绝部分非关键读请求。
- 限流控制:限制主节点的最大连接数,避免过载。
三、手动干预场景
若自动化失效时:
- 强制切主:手动更新中间件配置,移除故障备节点。
- 数据修复:校验主从数据一致性(如使用
pt-table-checksum
工具)。
四、监控指标建议
指标 | 工具 | 阈值 |
---|---|---|
Slave延迟时间 | SHOW SLAVE STATUS |
>30秒触发告警 |
Master负载 | Prometheus + Grafana | CPU >80%持续5分钟 |
Sharding-Proxy状态 | ELK日志分析 | ERROR日志频次 |
总结方案
graph TD
A[备节点宕机] --> B{健康检查}
B -->|超时| C[标记Slave不可用]
C --> D[读请求路由到Master]
D --> E[触发告警并修复]
E --> F[Slave恢复后重新接入]
通过上述组合策略,可最大限度保障系统的可用性与数据可靠性。
内容由零声教学AI助手提供,问题来源于学员提问