服务器算法之间的文件分片

时间:2014-01-17 15:29:54

标签: algorithm scalability

我想在多个服务器之间分发文件,并且只需很少的开销就可以使用它们。所以我在考虑以下天真的算法:

假设每个文件都有唯一的ID号:120151我正在考虑使用modulo (%)运算符对文件进行分段。如果我事先知道服务器的数量,这是有效的:

有2台服务器(代表n台服务器)的示例:

  server 1 : ID % 2 = 0 (contains even IDs) 
  server 2 : ID % 2 = 1 (contains odd IDs) 

然而,当我需要扩展它并添加更多服务器时,我将不得不重新洗牌文件以遵守新的算法规则,我们不希望这样。

示例:

假设我将服务器3添加到混音中,因为我无法处理负载。服务器3将包含符合以下条件的文件:
  server 3 : ID%3 = 2

步骤1是从服务器1和服务器2移动文件ID%3 = 2。 但是,我必须在服务器1和服务器2之间移动一些文件,以便发生以下情况:

server 1 : ID%3 = 0
server 2 : ID%3 = 1

实现这一目标的最佳方法是什么?

2 个答案:

答案 0 :(得分:3)

我的方法是使用一致的散列。来自维基百科:

  

一致哈希是一种特殊的哈希,当哈希时   调整表的大小并使用一致的散列,只需要K / n键   平均重新映射,其中K是键的数量,n是   插槽数量。

一般的想法是:

  1. 将您的服务器视为按照server_id
  2. 排序的环形排列
  3. 为每个服务器分配一个均匀分布的(随机)ID,例如server_id = SHA(node_name)
  4. 每个文件均等地分配了统一分布的id,例如file_id = SHA(ID),其中ID在您的示例中给出。
  5. 选择与file_id“最接近”的服务器,即server_id > file_id(开始选择最小的server_id)。
  6. 如果没有这样的节点,那么环上会有一个环绕
  7. 注意:只要对服务器和文件使用相同的哈希函数,就可以使用生成均匀分布哈希的任何哈希函数。

    这样,您可以保持O(1)访问权限,并且添加/删除是直接的,不需要重新调整所有文件:

    a)添加新服务器,新节点从环上的下一个节点获取所有文件,其中ID低于新服务器

    b)删除服务器,将其所有文件提供给环上的下一个节点

    汤姆怀特的graphically illustrated overview更详细地解释。

答案 1 :(得分:1)

总结您的要求:

  1. 每个服务器应存储(几乎)相等数量的文件。
  2. 您应该能够确定哪个服务器包含给定文件 - 仅基于文件的ID,在O(1)中。
  3. 添加文件时,要求1和2应保留。
  4. 添加服务器时,您希望从所有现有服务器向其移动某些文件,以满足要求1和2的要求。
  5. 添加第3台服务器时的策略(x是文件的ID):

    x%6  Old   New
    0    0     0
    1    1     1
    2    0 --> 2
    3    1 --> 0
    4    0 --> 1
    5    1 --> 2
    

    替代策略:

    x%6  Old   New
    0    0     0
    1    1     1
    2    0     0
    3    1     1
    4    0 --> 2
    5    1 --> 2
    

    要在更改后找到服务器:

    0: x%6 in [0,2]
    1: x%6 in [1,3]
    2: x%6 in [4,5]
    

    添加第4台服务器:

     x%12 Old   New
     0    0     0
     1    1     1
     2    0     0
     3    1     1
     4    2     2
     5    2     2
     6    0     0
     7    1     1
     8    0 --> 3
     9    1 --> 3
    10    2     2
    11    2 --> 3
    

    要在更改后找到服务器:

    0: x%12 in [0,2, 6]
    1: x%12 in [1,3, 7]
    2: x%12 in [4,5,10]
    3: x%12 in [8,9,11]
    

    添加服务器时,您始终可以构建一个新功能(实际上是几个替代功能)。 n个服务器的除数值等于lcm(1,2,...,n),所以it grows very fast

    请注意,您没有提及是否删除了文件,以及您是否打算处理该文件。