数据分区设计(1)-分区与避免热点

287 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第30天,点击查看活动详情

分区一般和复制协作:每个分区的多个节点都有副本,即某条记录属于特定分区,而同样内容会存储在不同节点,以提高系统容错性。

一个节点可存储多个分区。如图-1,主从复制模型和分区组合时数据的分布情况。每个分区都有自己的主副本,如被分配给某节点,从库副本被分配给其他节点。所以,一个节点可能是某些分区的主副本,同时也是其他分区的从副本。

上一篇文中讨论的复制内容都适用于分区数据的复制。分区方案选择通常独立于复制,因此本文不再讨论复制。

图-1 组合使用复制和分区:每个节点充当某些分区的主库,其他分区充当从库

2 KV数据分区

海量数据想切分,如何决定在哪些节点存储哪些记录?

分区的目标:将数据和查询负载均匀分布在各节点。若每个节点平均分担数据和负载,则理论上10个节点能处理10 倍的数据量和10 倍于单节点的读写吞吐量(暂忽略复制)。

但若分区不均,则会导致某些分区节点比其他分区有更多数据量或查询负载,即倾斜,导致分区效率大幅下降。极端的,所有负载压在一个分区节点,其余9个节点空闲,系统瓶颈就是这最忙节点。这时的高负载分区即是系统热点。

2.1 避免热点

最简单的,将记录随机分配给所有节点:

  • 这能在所有节点比较均匀分布数据
  • 但缺点:试图读取特定数据时,不知保存在哪个节点,必须并行查询所有节点

可优化该方案。假设数据是KV,即总能通过K访问记录。如在一本百科全书,可通过标题查找一个条目;而所有条目按字母序排序,因此能快速找到目标条目。