如题,基于OceanBase,如何实现千亿级别的多商户订单表的主键和表分区设计 ?
需求背景:
- 商户可能在数万级别
- 订单数据预期在数千亿级别
- 每天的订单量在 10亿级别(可能更高)
- 只需保留最近3个月的订单数据
- 商户之间的数据差别很大,有些可能每天过亿,有些可能 等于 0
很明显,这么大的数据量,不通过表分区来分片存储,是很难扛得住的。
既然要考虑分区,常见的表分区方案如下:
- 按照
商户ID
分片 - 按照
时间
(按天 甚至 按小时) 分片 - 按照
商户ID + 按时间
分片 - 按照
主键ID
分片
此外,OceanBase 要求 分片键 必须是 主键 或 唯一键的 一部分。
OceanBase 也建议使用业务上的唯一键作为主键ID,针对订单表来说,也就是 商户ID + 订单号
。
基于上述已知条件,我们再来看看各种方案:
先看 方案1,可能存在如下缺陷:
- 分片不够均衡,某些分片的数据可能很庞大(比如百亿级别)
再看 方案2,可能存在如下缺陷:
- 时间字段 不是OceanBase推荐主键
商户ID + 订单号
的一部分,似乎无法分片 ?或者 OceanBase 的建议不可行 ? - 存在明显的 热点数据问题,当前时间的分片就非常繁忙,其他历史分片就相对很空闲。
接着看 方案3,可能存在如下缺陷:
- 同方案2一样,时间字段不属于主键的一部分。
- OceanBase最多仅支持 65536 个分区,无法满足业务要求。
最后看 方案4,可能存在如下缺陷:
- 所有非主键ID的查询,都需要多分区聚合(意即遍历所有分区)。
针对上述情况,不知道大家有没有更好的思路或建议 ?
在千亿级别数据下,基于OceanBase,多少分区是比较合适的呢 ?