当数据库量非常大的时候,DB 已经成为系统瓶颈时就可以考虑进行水平垂直拆分了。
1 水平拆分
将一张表中的记录拆分到多个结构相同的表中。
可以将数据分布到集群的不同节点上,从而减缓单个数据库的压力。
2 垂直拆分
将一张表的字段拆分为主表以及扩展表,使用频次较高的字段在一张表,其余的在一张表。
3 拆分策略
- 哈希取模:hash(key) % N;
- 范围:可以是 ID 范围也可以是时间范围;
- 映射表:使用单独的一个数据库来存储映射关系。
多表查询不建议使用 join ,建议使用两次查询。
4 分布式事务
- 两阶段提交(2PC)
- 通过引入协调者来协调参与者的行为,并最终决定这些参与者是否要真正执行事务。
- XA 接口
5 最终一致性
异步检测,异步修复。
- 线下扫描全量数据法,最简单
- 线下扫描增量数据法,最效率
- 线上实时检测“消息对”法,最实时
6 唯一 ID
- 使用全局唯一 ID(GUID)
- 16 字节(128 位)的二进制数,通常会写成 16 进制数的字符串
- 版本 + 随机 + 时间
- 为每个分片指定一个 ID 范围
- 分布式 ID 生成器
- Snowflake 算法:时间 + 机器号 + 单位时间序号