数据库架构

🔄 数据库高可用架构

主从复制、读写分离、分库分表 —— 构建稳定可靠的数据库体系

🔁 主从复制原理

MySQL 主从复制是高可用和读扩展的基础,基于 binlog 实现数据同步。

复制流程

主库:将数据变更写入 binlog → 从库 IO 线程:读取主库 binlog 写入 relay log → 从库 SQL 线程:重放 relay log 应用到从库数据

binlog 格式对比

格式内容优缺点
STATEMENT原始 SQL 语句日志小,但某些函数(NOW())有歧义
ROW每行数据变化前后的值可靠,但日志量大,推荐生产使用
MIXED自动选择兼顾两者,默认
-- 查看主库 binlog 状态
SHOW MASTER STATUS\G

-- 查看从库复制状态
SHOW SLAVE STATUS\G

-- 关键字段:Seconds_Behind_Master(复制延迟秒数)
💡 MySQL 8.0 支持 GTID(全局事务标识)复制,比传统 binlog 位置复制更可靠,强烈推荐使用。

↔️ 读写分离

通过将读操作分流到从库,分散主库压力,提升系统整体吞吐量。

常用实现方案

方案工具特点
代理层ProxySQL、MySQL Router对应用透明,统一管理,推荐
SDK 层ShardingSphere-JDBC嵌入应用,低延迟,Java 系常用
应用代码手动配置多数据源灵活但维护成本高
💡 注意主从复制延迟问题:刚写入主库的数据,从库可能还未同步,重要场景需强制读主库。

🛡️ 高可用方案

方案原理切换时间适用场景
MHA故障检测 + 自动切换约 30s传统主从,成熟稳定
MySQL InnoDB ClusterMGR + MySQL Router + Shell约 5s官方推荐,8.0 首选
Orchestrator可视化拓扑管理约 30s大规模多集群管理
云 RDS云厂商托管约 60s业务优先,运维少

📦 分库分表

当单表数据量超过 千万级 或单库 QPS 超过瓶颈时,需要考虑分库分表。

分片策略

策略方式优缺点
Hash 分片id % N 路由到分片分布均匀,但扩容需迁移数据
Range 分片按 ID/时间范围分片扩容容易,但可能热点
目录分片维护映射表灵活,但映射表有瓶颈
💡 分库分表后会带来跨分片查询、分布式事务、全局唯一 ID 等新问题,需提前规划,不到万不得已不引入。

🔐 分布式事务

跨库操作需要保证数据一致性,常用方案:

方案一致性性能说明
2PC(XA)强一致MySQL 原生支持,但性能差,锁时间长
SAGA最终一致通过补偿事务实现回滚,适合长事务
本地消息表最终一致基于 MQ,将事务拆成本地操作 + 消息
Seata AT最终一致框架自动生成 undo log,业务无侵入