1000个项目,1000个节点,每个节点3个项目,最佳复制方案,以最大限度地减少节点失败时的数据丢失

时间:2012-04-24 04:19:53

标签: algorithm

我想知道在Skiena的算法设计手册(第2版)中Question 2-44的正确答案是什么

问题如下:

  

我们有1,000个数据项存储在1,000个节点上。每个节点都可以存储   正好三个不同项目的副本。提出一个复制方案   在节点失败时最小化数据丢失。预期的数量是多少?   三个随机节点发生故障时丢失的数据条目?

我在考虑节点n有来自n,n + 1和&的数据项。 N + 2。

因此,如果3个连续节点丢失,那么我们将丢失1个项目。

有更好的解决方案吗?

4 个答案:

答案 0 :(得分:6)

你提出的方法并不错,但也要看看here。 RAID中使用的想法可能会给你一些想法。例如,如果您有2个数据项,而不是存储3个项目,则如果另一个项目失败,您可以恢复其中任何一项。这个想法非常简单 - 您将项目存储在2个节点中,将其位数存储在第三个项目中。我相信如果您利用这个想法,您将能够对单个数据项进行3次以上的备份(即,超过3个节点必须失败才能丢失信息)。

答案 1 :(得分:3)

我想到了像RAID级别这样的方法,但Skiena说“每个节点都可以存储三个不同项目的副本。”尽管两个独立数据的XOR'red位模式可以存储在相同的空间中,但我并不认为这是问题所在的问题。

所以,我从OP的想法开始:以条纹方式将每个数据的三个副本存储到它的下两个邻居。例如,以下是当N == 6时,数据是从0到5的整数(4和5环绕并使用节点0和1):

nodes:    0 1 2 3 4 5
          ===========
copy 0 -> 0 1 2 3 4 5 
copy 1 -> 5 0 1 2 3 4 
copy 2 -> 4 5 0 1 2 3 

在所有20个三节点故障组合中,有6个丢失了一个数据。例如;当节点1,2和3发生故障时,数据1会丢失:

===========
0 X X X 4 5 
5 X X X 3 4 
4 X X X 2 3 

对于其他数据类似,20个组合中的6个会丢失数据。由于Skiena没有描述“数据丢失”对应用程序的意义:单个数据点的丢失是否意味着整个集合被浪费,或者丢失单个数据点是否可接受并且优于丢失两个数据点?

如果丢失一个数据点意味着整个集合被浪费,那么我们可以做得更好。好三倍! :)

不是以条带方式将数据副本分发到右侧节点,而是定义共享数据的三个节点组。例如,让0,1和2共享其数据,3,4和5共享其数据:

nodes:    0 1 2 3 4 5
          ===========
copy 0 -> 0 1 2 3 4 5
copy 1 -> 2 0 1 5 3 4
copy 2 -> 1 2 0 4 5 3

这次,20种组合中只有2种产生数据丢失。当节点0,1和2发生故障时,数据0,1和2一起丢失:

===========
x x x 3 4 5
x x x 5 3 4
x x x 4 5 3

当节点3,4和5发生故障时,数据3,4和5会一起丢失:

===========
0 1 2 x x x
2 0 1 x x x
1 2 0 x x x

这相当于20个三节点故障组合中的2个。当相同的节点共享相同的数据时,它会有效地将数据丢失合并到更少的组合中。

阿里

答案 2 :(得分:1)

让,

 D = {1,...,d_i,...,d} denote the data items and d_i a given data element
 N = {1,...,n_k,...,n} denote the storage cluster and n_k a given storage node. 
 We say d_i is stored by n_k, loosely denoted by d_i \in n_k.

我的复制模型有以下假设:

1-初始化期间,每个数据项必须至少存储在一个给定节点中。即:

   Exist at least one 1 <= k <=n s.t. P(d_i \in n_k) = 1.

2-从(1),在初始化时,d_i在给定节点中的概率至少为1 / n。即:

   For any data item 1 <= i <= d and a random node n, P(d_i \in n) >= 1/n. 

根据问题陈述,按照设计,我们希望在数据集中使这个分布统一。

3-最后,根据设计,数据项d_i在给定节点n中的概率应该在数据项之间是独立的。即:

  P(d_i \in n | d_j \in n) = P(d_i \in n)

这是因为我们不假设节点故障的概率在相邻节点之间是独立的(例如:在相邻节点的数据中心中共享相同的网络交换机等)。

根据这些假设,我提出了以下复制模型(对于问题实例,其中d = n且每个节点正好存储3个不同的数据项)。

(1)执行数据集的随机排列。 (2)使用长度为3和步幅为1的滑动窗口,在混洗数据集上旋转,并将数据项映射到每个节点。

E.g.:
D = {A,B,C,D}
N = {1,2,3,4}

(1) {C, B, A, D}
(2) 1 -> {C, B, A}, 2 -> {B, A, D}, 3-> {A, D, C}, 4-> {D, C, B}

随机改组将确保独立(3)和均匀分布(2)。虽然步幅1的滑动窗口保证(1)。

让我们将给定节点n_k的滑动窗口表示为有序集合w_k = {w_k1,w_k2,w_k3}。 n_k被称为w_k1(w_k的第一个元素)的主节点。包含w_k1的任何其他节点n_j是副本节点。 N.B。:建议的复制模型只保证任何d_i的一个主节点,而副本节点的数量取决于窗口长度。

在上面的示例中:n_1是C和n_3和n_4副本节点的主节点。

回到原来的问题,给定这个模式,我们可以说明数据丢失的概率是主节点和给定数据项的所有副本的丢失。

P(d_i丢失)= P(d_i的主节点失败,副本1失败,副本2失败)。

如果没有正式证明,将导致上述步骤(1)中的无偏随机排列

P(d_i丢失)= P(d_i的主节点失败)* P(副本1失败)* P(副本2失败)。

再次,随机排列是一种启发式,用于抽象节点失败的联合分布。

假设(2)和(3),P(d_i丢失)= c,对于任何d_i,在初始化时。

对于d = n = 1000且复制因子为3(即:窗口长度等于3)。

P(d_i丢失)= 1/1000 * 1/999 * 1/998~10 ^ -9

答案 3 :(得分:0)

您的方法似乎基本上是正确的,但可以从故障转移策略中受益。请注意,Skiena教授已经要求“在节点失败时最大限度地减少数据丢失”,这表明失败的节点将是常见现象。

您可能需要查看consistent hashing

此外,reddit工程师还有一个great post关于不使用一致性散列(而是使用固定的MOD散列)的危险。