← 博客

读写分离&分表分库

读写分离

常见架构

  • 一主多从
  • 主主互备 + 多从:两个主库互为主从,解决主库单点故障,读请求仍走从库

实现

  • 在业务和数据库之间加一层代理(MySQL Router),由它把读写请求分发给不同节点
  • 第三方组件(sharding-jdbc)

分库分表

  • 单表的数据达到千万级别以上->分表
  • 单库的 CPU/IO/ 连接数达到上限->分库

路由规则

  • 哈希路由(取模)
  • 范围路由 (user_id 1100 万→库 0,101200 万→库 1)
  • 一致性哈希(把 key 和节点映射到同一个哈希环上,key 顺时针找到第一个节点作为归属节点)

数据迁移

  • 停机迁移:在半夜做
  • 双写:所有写操作同时写入旧存储和新存储,后台异步迁移旧存储中双写前的历史数据到新存储,对比新旧存储的数据,修正不一致的数据

分布式事务

  • 分布式ID(订单ID)。比如“订单库写订单 + 库存库扣库存 + 用户库减余额”涉及到三个库,
  • 本地消息表 + 消息队列
    • 在一个 MySQL 单机事务里,同时完成两件事:创建订单+扣库存。一是往order表里面添加order,二是在msg_table里添加“扣库存消息”
    • 异步线程扫一遍msg_table,把消息都发给message queue
    • 消费者执行跨库操作。如果不成功,MQ会自动重试