键范围分区
将数据分区到排序的键范围内,以有效地处理范围查询。
问题
为了将数据拆分到一组集群节点中,每个数据项都需要映射到一个节点。如果用户想要查询一系列键,只指定起始键和结束键,则需要查询所有分区才能获取所需的值。对于单个请求查询每个分区远非最佳选择。
以键值存储为例。我们可以使用基于哈希的映射来存储作者姓名,如 固定分区 中所述。
键 | 哈希 | 分区 † | 节点 |
---|---|---|---|
alice | 133299819613694460644197938031451912208 | 0 | 0 |
bob | 63479738429015246738359000453022047291 | 1 | 1 |
mary | 37724856304035789372490171084843241126 | 5 | 1 |
philip | 83980963731216160506671196398339418866 | 2 | 2 |
† 分区 = 哈希 % 分区数 (9)
如果用户想要获取一系列名称的值,例如以字母“a”到“f”开头的名称,则无法知道应该从哪些分区获取数据,因为键的哈希值被用来将键映射到分区。需要查询所有分区才能获取所需的值。
解决方案
为按排序顺序排列的键创建逻辑分区。然后可以将分区映射到集群节点。要查询一系列数据,客户端可以获取包含给定范围内的键的所有分区,并仅查询这些特定分区以获取所需的值。
有关更多详细信息,请访问 oreilly.com 上的在线电子书 第 20 章
此模式是 分布式系统模式 的一部分
2023 年 11 月 23 日