如何跨多个服务器扩展trie

时间:2015-05-16 21:37:53

标签: architecture system scalability distributed-computing trie

有谁知道如何在多台机器上扩展Trie?假设第一台机器空间不足,我需要从一个非常大的字典中添加更多单词,我可以做些什么来添加更多单词? (我是一名Java思想家,但我相信答案可能与语言无关)。我已经意识到我不能只为每个第一个角色说一台机器,但这并不能真正扩展。

1 个答案:

答案 0 :(得分:2)

好的,假设您的两台机器都有相同的可用资源,让我们先看一个更简单的例子:

你如何扩展二叉树?甚至更好 - 一个AVL树?有几个例子可以做到这一点:

  1. 如果只有2台机器并且存储是您的问题,我会将根和左子树保留在一台机器上,并将正确的子树发送给另一台机器。
  2. 如果您有3台机器并且还想要一台负载均衡器,则根将保留在一台机器上,左右子树将与其他两台机器分开。如果您有5个,则在负载均衡器上保留根和第一级子级,并拆分树的其余部分。
  3. (请注意,平衡这样的分布式树将会复杂得多,因为您需要与其他计算机进行通信,并且可能在分布式事务中进行,以便能够同时回答所有请求)

    所以,现在一个特里,其中--AFAIR--是一棵树/字母。如果你单词中的字母均匀分布,你可以在一台机器上安装A-M,在另一台机器上安装N-Z。这可能不会起作用,但你肯定能够将它或多或少地分成50/50。

    如果您现在想要添加越来越多的计算机,我会保留一个主节点作为负载均衡器并将其分发给子节点,这只需要处理几个字母。例如,您可以拥有节点

    • A-F
    • N-R
    • 取值
    • T-ż

    假设您的字母A-F的数据与字母S的数据大致相同(实际上可能存在一种语言,其中至少接近最佳分布)

    现在如果你在A-F中收到太多字母,你可以把它分成A-D和E-F,例如,没有什么真正改变。问题是如果你在S中收到太多字母。现在你有三种可能性:

    1. 你为字母S制作另一个负载均衡器 - 这肯定很容易,因为你已经实现了负载均衡器,你可以在任何级别使用相同的功能
    2. 您将字母SA-SM(例如)保存在一个节点中,该节点将是主节点,将SN-SZ存储在单独的节点上。因此,如果您获得SP ..第一个负载均衡器会将其发送到您的SA-SM节点,并且会将其转发给SN-SZ
    3. 您可以修改加载根负载均衡器,以便能够在节点之间指定更复杂的边界,例如您现在拥有节点

      • A-F
      • N-R
      • SA-SM
      • SN-SZ
      • T-ż
    4. 这里的数字1可能是最简单,最干净的解决方案,但可能有一些未使用的硬件。如果您可以为节点使用不同的资源,那么带有字母S的小负载平衡器的选项1可能是要走的路。 选项2是一个脏混合,选项3可能是最好的方法,但它使负载均衡器可能复杂且容易出错。

      希望这些想法可以帮到你。