数据库高可用方案
高可用架构对比
| 方案 | 适用数据库 | 切换方式 | 特点 |
|---|---|---|---|
| MHA | MySQL | 自动 | 经典方案,补齐 binlog 差异后切换 |
| Orchestrator | MySQL | 自动 | 拓扑可视化,智能故障检测 |
| Patroni | PostgreSQL | 自动 | 基于 etcd/ZooKeeper 分布式一致性 |
| Redis Sentinel | Redis | 自动 | 3 节点哨兵投票选主 |
| ProxySQL | MySQL | 代理层 | SQL 路由、读写分离、连接池 |
MHA 架构
读写分离
ProxySQL 读写分离规则
-- 写入路由到主库(hostgroup 10)
INSERT INTO mysql_query_rules (rule_id, active, match_pattern, destination_hostgroup)
VALUES (1, 1, '^SELECT .* FOR UPDATE', 10);
-- 读取路由到从库(hostgroup 20)
INSERT INTO mysql_query_rules (rule_id, active, match_pattern, destination_hostgroup)
VALUES (2, 1, '^SELECT', 20);
主从延迟与读写分离
读写分离可能读到旧数据。关键业务读取(如支付后查询订单)应强制走主库:
- ProxySQL:在 SQL 前加
/* master */注释 - 应用层:写操作后短时间内读请求也走主库
常见面试问题
Q1: 数据库故障切换时如何保证数据不丢?
答案:
- 半同步复制:主库等待至少一个从库收到 binlog 才提交(
rpl_semi_sync_master_enabled) - GTID 模式:切换时通过 GTID 精确定位复制位点,避免数据重复或遗漏
- MHA 补偿机制:切换前尝试从故障主库 SSH 拉取最后的 binlog 补齐差异
- RPO=0 方案:MySQL Group Replication(Paxos 协议)或 PG Patroni 同步复制
Q2: 如何选择数据库高可用方案?
答案:
| 场景 | 推荐方案 |
|---|---|
| MySQL 中小规模 | MHA + 半同步复制 |
| MySQL 大规模 | Orchestrator + ProxySQL |
| PostgreSQL | Patroni + HAProxy |
| Redis | Sentinel(中)/ Cluster(大) |
| 金融级 RPO=0 | MySQL Group Replication / PG 同步复制 |