固定分区
保持分区数量固定,以在集群大小发生变化时保持数据到分区的映射不变。
问题
为了将数据分散到一组集群节点中,每个数据项都需要映射到它们。将数据映射到集群节点有两个要求。
- 分布应该均匀。
- 应该能够知道哪个集群节点存储了特定数据项,而无需向所有节点发出请求。
考虑一个键值存储,它是许多存储系统的良好代理。通过对键进行哈希并使用模运算将其映射到集群节点,可以满足这两个要求。因此,如果我们有一个三节点集群,我们可以像这样映射键 Alice、Bob、Mary 和 Philip。
键 | 哈希 | 节点索引 † |
---|---|---|
Alice | 133299819613694460644197938031451912208 | 0 |
Bob | 63479738429015246738359000453022047291 | 1 |
Mary | 37724856304035789372490171084843241126 | 2 |
Philip | 83980963731216160506671196398339418866 | 2 |
† 节点索引 = 哈希 % 3
但是,这种方法在集群大小发生变化时会产生问题。如果在集群中添加了两个节点,我们将有五个节点。然后映射将如下所示。
键 | 哈希 | 节点索引 † |
---|---|---|
Alice | 133299819613694460644197938031451912208 | 3 |
Bob | 63479738429015246738359000453022047291 | 1 |
Mary | 37724856304035789372490171084843241126 | 1 |
Philip | 83980963731216160506671196398339418866 | 1 |
† 节点索引 = 哈希 % 5
这样,几乎所有键的映射都会发生变化。即使只添加了几个新的集群节点,也需要移动所有数据。当数据量很大时,这是不可取的。
解决方案
最常用的解决方案之一是将数据映射到逻辑分区。逻辑分区映射到集群节点。即使添加或删除集群节点,数据到分区的映射也不会改变。集群启动时预先配置了分区数量——为了这个例子,是 1024。当向集群添加新节点时,此数字不会改变。因此,使用键的哈希将数据映射到分区的方式保持不变。
重要的是分区在集群节点之间均匀分布。当分区移动到新节点时,它应该相对快,并且只有一小部分数据被移动。
有关更多详细信息,请访问 第 19 章,该章位于 oreilly.com 上的在线电子书中。
此模式是 分布式系统模式 的一部分。
2023 年 11 月 23 日