跳到主要内容

数据库高可用方案

高可用架构对比

方案适用数据库切换方式特点
MHAMySQL自动经典方案,补齐 binlog 差异后切换
OrchestratorMySQL自动拓扑可视化,智能故障检测
PatroniPostgreSQL自动基于 etcd/ZooKeeper 分布式一致性
Redis SentinelRedis自动3 节点哨兵投票选主
ProxySQLMySQL代理层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: 数据库故障切换时如何保证数据不丢?

答案

  1. 半同步复制:主库等待至少一个从库收到 binlog 才提交(rpl_semi_sync_master_enabled
  2. GTID 模式:切换时通过 GTID 精确定位复制位点,避免数据重复或遗漏
  3. MHA 补偿机制:切换前尝试从故障主库 SSH 拉取最后的 binlog 补齐差异
  4. RPO=0 方案:MySQL Group Replication(Paxos 协议)或 PG Patroni 同步复制

Q2: 如何选择数据库高可用方案?

答案

场景推荐方案
MySQL 中小规模MHA + 半同步复制
MySQL 大规模Orchestrator + ProxySQL
PostgreSQLPatroni + HAProxy
RedisSentinel(中)/ Cluster(大)
金融级 RPO=0MySQL Group Replication / PG 同步复制

相关链接