← 博客读写分离&分表分库
读写分离
常见架构
- 一主多从
- 主主互备 + 多从:两个主库互为主从,解决主库单点故障,读请求仍走从库
实现
- 在业务和数据库之间加一层代理(MySQL Router),由它把读写请求分发给不同节点
- 第三方组件(sharding-jdbc)
分库分表
- 单表的数据达到千万级别以上->分表
- 单库的 CPU/IO/ 连接数达到上限->分库
路由规则
- 哈希路由(取模)
- 范围路由 (user_id 1
100 万→库 0,101200 万→库 1) - 一致性哈希(把 key 和节点映射到同一个哈希环上,key 顺时针找到第一个节点作为归属节点)
数据迁移
- 停机迁移:在半夜做
- 双写:所有写操作同时写入旧存储和新存储,后台异步迁移旧存储中双写前的历史数据到新存储,对比新旧存储的数据,修正不一致的数据
分布式事务
- 分布式ID(订单ID)。比如“订单库写订单 + 库存库扣库存 + 用户库减余额”涉及到三个库,
- 本地消息表 + 消息队列
- 在一个 MySQL 单机事务里,同时完成两件事:创建订单+扣库存。一是往order表里面添加order,二是在msg_table里添加“扣库存消息”
- 异步线程扫一遍msg_table,把消息都发给message queue
- 消费者执行跨库操作。如果不成功,MQ会自动重试