将键为字符串的哈希查询分派到多台机器的 elegant/scalable 方法是什么?
What's an elegant/scalable way to dispatch hash queries, whose key is a string, to multiple machines?
我想让它具有可扩展性。假设字母都是小写的。例如,如果我只有两台机器,可以将第一个字符在 a ~ m
内的查询分派到第一台机器,而 n ~ z
的查询可以分派到第二台机器。
但是,当第三台机器来的时候,为了让query尽量均匀分布,我不得不重新计算规则,重新分配前两台机器存储的内容。我觉得可能会很乱。比如比较复杂的情况,我已经有26台机器了,当第27台来的时候怎么办?人们通常做什么来实现这里的可扩展性?
在 DHT 中(自)组织机器以将处理查询的负载分配给对象池的过程称为一致性哈希:
https://en.wikipedia.org/wiki/Consistent_hashing
我认为您的问题没有明确的答案。
首先是平衡问题。 DHT 在以下情况下是平衡的:
- 每个节点负载相似? (负载平衡 可能是您想要的)
- 每个节点负责相似数量的对象? (这似乎是你的建议)
- (不太可能)每个节点负责相似数量的寻址 space?
我相信您的 objective 是为了确保 none 的机器超载。除非对单个对象的查询足以使一台机器饱和,否则如果您适当地重新平衡,这种情况不太可能发生。
如果其中一台机器的负载明显低于另一台,您可以通过移动 less-load 机器在环中的位置来让 less-load 机器接管 higher-load 机器的一些对象.
另一种重新平衡的方法是通过虚拟节点——每台机器都可以模拟成为 k
台机器。如果它的负载很低,它可以增加虚拟节点的数量(并接管更多的对象)。如果它的负载很高,它可以删除它的一些虚拟节点。
我想让它具有可扩展性。假设字母都是小写的。例如,如果我只有两台机器,可以将第一个字符在 a ~ m
内的查询分派到第一台机器,而 n ~ z
的查询可以分派到第二台机器。
但是,当第三台机器来的时候,为了让query尽量均匀分布,我不得不重新计算规则,重新分配前两台机器存储的内容。我觉得可能会很乱。比如比较复杂的情况,我已经有26台机器了,当第27台来的时候怎么办?人们通常做什么来实现这里的可扩展性?
在 DHT 中(自)组织机器以将处理查询的负载分配给对象池的过程称为一致性哈希: https://en.wikipedia.org/wiki/Consistent_hashing
我认为您的问题没有明确的答案。
首先是平衡问题。 DHT 在以下情况下是平衡的:
- 每个节点负载相似? (负载平衡 可能是您想要的)
- 每个节点负责相似数量的对象? (这似乎是你的建议)
- (不太可能)每个节点负责相似数量的寻址 space?
我相信您的 objective 是为了确保 none 的机器超载。除非对单个对象的查询足以使一台机器饱和,否则如果您适当地重新平衡,这种情况不太可能发生。
如果其中一台机器的负载明显低于另一台,您可以通过移动 less-load 机器在环中的位置来让 less-load 机器接管 higher-load 机器的一些对象.
另一种重新平衡的方法是通过虚拟节点——每台机器都可以模拟成为 k
台机器。如果它的负载很低,它可以增加虚拟节点的数量(并接管更多的对象)。如果它的负载很高,它可以删除它的一些虚拟节点。