数据库读写分离与高可用需通过主从复制(推荐半同步+row格式+read_only)、proxysql智能路由(按sql类型分发至hostgroup 10/20)及orchestrator+keepalived实现自动故障切换与vip漂移,并辅以应用层hint、降级和监控兜底。

数据库读写分离与高可用不是两个独立目标,而是通过主从复制 + 智能路由 + 健康感知三位一体实现的。核心在于:写操作必须稳定落主库,读请求要能自动流向健康从库,且主库故障时系统仍能持续提供只读服务甚至自动升主。
主从复制是基础,必须选对同步模式
没有可靠的数据同步,读写分离就是空中楼阁。推荐采用半同步复制(semisync),它在性能和一致性之间取得平衡:
- 主库提交事务前,至少等待一个从库写入 relay log 并返回 ACK
- 超时时间建议设为 500ms,避免长阻塞影响写入吞吐
- binlog_format 必须设为 ROW,防止语句级复制引发数据不一致
- 从库务必配置 read_only=ON,防止误写导致主从错位
ProxySQL 是最实用的中间件方案
它不依赖应用改造,用规则引擎即可透明实现读写分离与高可用切换:
- 通过 mysql_servers 表定义 hostgroup:10 为主库组,20 为从库组
- 在 mysql_query_rules 中设置精准路由规则:
^SELECT.*FOR UPDATE → hostgroup 10(强一致性读写)
^SELECT → hostgroup 20(普通读)
^(INSERT|UPDATE|DELETE) → hostgroup 10(所有写) - Monitoring 模块每 3 秒检查后端节点状态,延迟超阈值或连接失败自动下线
- 支持权重分配,例如让新扩容的从库承载 60% 读流量,老节点承担 40%
高可用闭环:自动故障检测 + 主从切换
仅靠 ProxySQL 还不够,需搭配拓扑感知组件形成闭环:
- 用 Orchestrator 或 MHA 监控主库心跳,故障 10 秒内触发自动切换
- 切换完成后,Orchestrator 更新 ProxySQL 的 mysql_servers 配置(如把原从库提升为主,并重标 hostgroup)
- 配合 Keepalived 提供虚拟 IP(VIP),确保应用连接地址不变
- 切换期间 ProxySQL 可开启 fast-forward 模式,将部分只读请求临时路由到新主库,减少服务中断
应用层兜底策略不可少
中间件再稳也存在极小概率失效,应用需具备基本容错能力:
- 读操作默认走从库,但对强一致性要求场景(如订单支付结果页),显式加 hint 或使用 ApplicationIntent=ReadOnly(SQL Server)/ /*+ READ_FROM_SLAVE */(MySQL 注释提示)
- 写操作失败时,捕获 “Lost connection” 或 “Host is down” 类错误,触发降级逻辑(如缓存兜底、异步重试)
- 监控关键指标:从库延迟(Seconds_Behind_Master)、ProxySQL query rule 匹配率、hostgroup 流量分布偏差











