固定分区

保持分区数量固定,以在集群大小发生变化时保持数据到分区的映射不变。

问题

为了将数据分散到一组集群节点中,每个数据项都需要映射到它们。将数据映射到集群节点有两个要求。

  • 分布应该均匀。
  • 应该能够知道哪个集群节点存储了特定数据项,而无需向所有节点发出请求。

考虑一个键值存储,它是许多存储系统的良好代理。通过对键进行哈希并使用模运算将其映射到集群节点,可以满足这两个要求。因此,如果我们有一个三节点集群,我们可以像这样映射键 Alice、Bob、Mary 和 Philip。

哈希节点索引 †
Alice1332998196136944606441979380314519122080
Bob634797384290152467383590004530220472911
Mary377248563040357893724901710848432411262
Philip839809637312161605066711963983394188662

† 节点索引 = 哈希 % 3

但是,这种方法在集群大小发生变化时会产生问题。如果在集群中添加了两个节点,我们将有五个节点。然后映射将如下所示。

哈希节点索引 †
Alice1332998196136944606441979380314519122083
Bob634797384290152467383590004530220472911
Mary377248563040357893724901710848432411261
Philip839809637312161605066711963983394188661

† 节点索引 = 哈希 % 5

这样,几乎所有键的映射都会发生变化。即使只添加了几个新的集群节点,也需要移动所有数据。当数据量很大时,这是不可取的。

解决方案

最常用的解决方案之一是将数据映射到逻辑分区。逻辑分区映射到集群节点。即使添加或删除集群节点,数据到分区的映射也不会改变。集群启动时预先配置了分区数量——为了这个例子,是 1024。当向集群添加新节点时,此数字不会改变。因此,使用键的哈希将数据映射到分区的​​方式保持不变。

重要的是分区在集群节点之间均匀分布。当分区移动到新节点时,它应该相对快,并且只有一小部分数据被移动。

有关更多详细信息,请访问 第 19 章,该章位于 oreilly.com 上的在线电子书中。

此模式是 分布式系统模式 的一部分。

2023 年 11 月 23 日