水平分库分表,根据什么规则进行划分?
range策略
自增id,根据ID范围进行分表(左闭右开)
规则案例:
- 1~1,000,000 是 table_1
- 1,000,000 ~2,000,000 是 table_2
- 2,000,000~3,000,000 是 table_3
… …省略
优点:
- id是自增长,可以无限增长
- 扩容不用迁移数据
- 容易理解和维护
缺点:
- 大部分读和写都访会问新的数据,有IO瓶颈,整体资源利用率低
- 数据倾斜严重,热点数据过于集中,部分节点有瓶颈
Range策略延伸
范围角度思考
数字:
1.自增id范围
时间:
1.年、月、日范围
2.比如按照⽉份⽣成 库或表 pay_log_2022_01、pay_log_2022_02
空间:
1.地理位置:省份、区域(华东、华北、华南)
2.比如按照 省份生成库或表
基于Range范围分库分表业务场景
-
微博发送记录、微信消息记录、⽇志记录,id增长/时间分区 都行
水平分表为主,水平分库则容易造成资源的浪费 -
网站签到等活动流水数据时间分区最好
水平分表为主,水平分库则容易造成资源的浪费大区划分(⼀⼆线城市和五六线城市活跃度不⼀样,如果能避免热点问题,即可选择) -
saas业务水平分库(华东、华南、华北等)
hash取模
Hash分库分表是最普遍的方案
案例规则
用户ID是整数型的,要分2库,每个库表数量4表,⼀共8张表
用户ID取模后,值是0到7的要平均分配到每张表
库ID = userId % 库数量(2)
表ID = userId / 库数量(2) % 表数量(4)
优点:1.保证数据较均匀的分散落在不同的库、表中,可以有效的避免热点数据集中问题
缺点:1.扩容不是很方便,需要数据迁移