知识卡片
键范围分区支持高效范围查询但按时间戳分区易造成写入热点
内容
键范围分区给每个分区指定一段连续的键区间(类似百科全书按字母分卷),只要知道 区间边界就能确定某个键在哪个分区,直接向对应节点发请求即可。因为区间连续、分区 内部数据仍按序存储,键范围分区有个直接好处:范围查询非常高效,可以把键当成联合 索引使用,一次查询取出多个相关记录(比如传感器数据用时间戳做主键,能轻松取出 “某个月的全部数据”)。区间边界不能平均切分字母表这类简单规则(比如百科全书里A、 B开头的词远比T、U、V、X、Y、Z开头的词多),必须依据实际数据分布来调整,才能真正 做到均匀。这个方案的致命弱点出现在特定访问模式下:如果主键就是时间戳、分区按时间 范围划分(比如每天一个分区),那么”数据产生时立刻写入数据库”这个天然的时间局部性 就意味着所有写入永远只打在”今天”这一个分区上,其余分区全部空闲——这是典型的写入 热点。解法不是放弃键范围分区,而是调整主键的构成:在时间戳前面加一个能提供区分度 的字段(比如传感器名称),让分区先按这个字段、再按时间切分,这样多个传感器同时 写入时负载能均匀落到不同分区;代价是原本”查某段时间所有数据”这类跨维度的范围查询, 现在要拆成”对每个传感器名称各做一次范围查询”才能完成。
参考来源
- 位置:《数据密集型应用系统设计》第六章《分区》"根据键的范围分区"(源文件:
_epub-src/ch6_split_002.html)
- 结论依据:原文说明键范围分区支持高效范围扫描(举传感器时间戳例子),但按时间
戳分区会导致所有写入集中在"今天"这一个分区形成热点,解法是在主键前加传感器名称
等字段先分散写入负载,代价是范围查询需要对每个名称单独执行,直接支撑本卡片
结论。
- 原始内容:如果主键是时间戳,则分区对应于时间范围……由于我们在测量发生时将
数据从传感器写入数据库,因此所有写入操作都会转到同一个分区……为了避免传感器
数据库中的这个问题,需要使用除了时间戳以外的其他东西作为主键的第一个部分。