主从复制
原理
- Master 将数据变更写入 binlog
- Slave 的 IO 线程读取 Master 的 binlog,写入 relay log
- Slave 的 SQL 线程执行 relay log 中的事件
配置步骤
Master 配置复制模式
| 模式 | 说明 | 特点 |
|---|---|---|
| 异步 | 默认模式,Master 不等 Slave | 性能好,可能丢数据 |
| 半同步 | 至少一个 Slave 确认 | 折中 |
| 全同步 | 所有 Slave 确认 | 性能差,不推荐 |
主从延迟
原因:- 从库机器性能差
- 大事务
- 从库压力大
- 提升从库配置
- 拆分大事务
- 多个从库分担压力
- 并行复制
读写分离
原理
实现方式
| 方式 | 说明 | 代表产品 |
|---|---|---|
| 代码层 | 在代码中判断读写 | 动态数据源 |
| 中间件 | 独立代理层 | MyCat, ShardingSphere |
| 驱动层 | MySQL Connector 层 | mysql-connector-j |
代码实现
注意事项
| 问题 | 解决方案 |
|---|---|
| 主从延迟 | 强制读主库、缓存 |
| 事务问题 | 事务内全部走主库 |
| 数据一致性 | 关键查询走主库 |
分库分表
何时分库分表
| 指标 | 阈值 |
|---|---|
| 单表数据量 | > 500万 ~ 1000万 |
| 单库数据量 | > 5000万 |
| 并发连接数 | > 单库承受能力 |
拆分策略
垂直拆分 按业务拆分:分片策略
| 策略 | 说明 | 优缺点 |
|---|---|---|
| 范围分片 | 按 ID 范围 | 简单,热点问题 |
| Hash 分片 | 按 ID 取模 | 均匀,扩容复杂 |
| 时间分片 | 按时间 | 适合日志 |
| 一致性Hash | 虚拟节点 | 扩容平滑 |
ShardingSphere 示例
分库分表问题
| 问题 | 解决方案 |
|---|---|
| 跨库 JOIN | 避免,或使用中间件 |
| 跨库事务 | 分布式事务、最终一致性 |
| 全局 ID | 雪花算法、UUID、号段模式 |
| 跨库分页 | 归并排序、二次查询 |
| 数据迁移 | 双写、增量同步 |
全局 ID 方案
| 方案 | 优点 | 缺点 |
|---|---|---|
| UUID | 简单 | 无序,索引效率低 |
| 雪花算法 | 趋势递增,高性能 | 时钟回拨问题 |
| 号段模式 | 数据库生成 | 依赖数据库 |
| Redis | 高性能 | 依赖 Redis |
高可用方案
MHA(Master High Availability)
- 自动故障转移
- 数据补偿(从宕机 Master 拉取 binlog)
MGR(MySQL Group Replication)
MySQL 官方的高可用方案,基于 Paxos 协议。 模式:- 单主模式:自动选主
- 多主模式:任意节点可写
其他方案
| 方案 | 说明 |
|---|---|
| Keepalived + VIP | 简单,故障切换慢 |
| Orchestrator | GitHub 开源 |
| Vitess | YouTube 开源,云原生 |
| TiDB | 分布式 NewSQL |