问题
在使用数据库的应用中,通常会通过对 ID 做 hash 映射到分库分表,达成压力均摊
在实际实施过程中,通常会有 2 个问题:
- 当实例进行扩容时,必须停服维护, rehash 用户数据
- 不同实例压力分担不均,通常 ID 越大的那些实例压力大
因此,实作中,通常会使用按段(segment)划分维护数据集
本文,举 3 个例子来阐述其思想:
- 美团 Leaf-segment 数据库方案实现
分布式ID生成器
- 永不迁移数据和避免热点的 MySQL 横向扩展方案
- Redis 集群的按哈希槽实现分片
Leaf-segment 数据库方案
该方案在官方的博客中也要详细描述: 传送门
这里简要阐述下其原理:
如图,该图摘自官方博客,服务向 Leaf 请求申请一个唯一的 test_tag ID
- DB 中保存当前 test_tag 的已被预定的最大 max_id
- 向 DB 预定 id 的 步长(step)
因此 Leaf 可以通过向 DB 预定最新的 ID 段,然后快速的在本地互不干扰的直接分配 ID 给服务
该方案,有以下优点: