7

我正在尝试建立分布式文件系统中文件可用性的数学模型。我在 MathOverflow 上发布了这个问题,但这也可能被归类为 CS 问题,所以我也在这里试一试。

系统是这样工作的:一个节点在 r*b 个远程节点上存储一个文件(使用纠删码编码),其中 r 是复制因子,b 是一个整数常量。纠删码文件的特性是,如果至少有 b 个远程节点可用并返回文件的一部分,则可以恢复文件。

最简单的方法是假设所有远程节点彼此独立并且具有相同的可用性 p。有了这些假设,文件的可用性遵循二项分布,即二项分布

不幸的是,这两个假设可能会引入不可忽略的错误,如本文所示:http ://deim.urv.cat/~lluis.pamies/uploads/Main/icpp09-paper.pdf 。

克服所有节点具有相同可用性的假设的一种方法是计算可用/不可用节点的每个可能组合的概率,并取所有这些结果的总和(这是他们在上面的论文中建议的那种,只是比我刚才描述的更正式)。您可以将此方法视为深度为 r*b 的二叉树,每个叶子都是可用/不可用节点的一种可能组合。文件的可用性与您在 >=b 个可用节点的情况下到达休假的概率相同。这种方法更正确,但计算成本为鄂尔多. 此外,它不处理节点独立性的假设。

你们有什么好的近似值的想法,它比二项式分布近似引入更少的误差,但计算成本比 更好

您可以假设每个节点的可用性数据是一组由 组成的元组(measurement-date, node measuring, node being measured, succes/failure-bit)。例如,您可以使用此数据计算节点之间的可用性与可用性差异的相关性。

4

2 回答 2

5

对于大的rb您可以使用一种称为蒙特卡洛积分的方法,例如参见Wikipedia 上的蒙特卡洛积分(和/或 SICP 的第 3.1.2 章)来计算总和。对于小r的和b显着不同的节点故障概率p[i],精确的方法是优越的。的确切定义将取决于几个因素,最好通过实验进行尝试。

具体示例代码:这是一个非常基本的示例代码(在 Python 中),用于演示这样的过程如何工作:

def montecarlo(p, rb, N):
    """Corresponds to the binomial coefficient formula."""
    import random
    succ = 0

    # Run N samples
    for i in xrange(N):
        # Generate a single test case
        alivenum = 0
        for j in xrange(rb):
            if random.random()<p: alivenum += 1
        # If the test case succeeds, increase succ
        if alivenum >= b: succ += 1
    # The final result is the number of successful cases/number of total cases
    # (I.e., a probability between 0 and 1)
    return float(succ)/N

该函数对应于二项式测试用例并运行N测试,检查b节点外的r*b节点是否处于活动状态,故障概率为p. 一些实验会让您相信,您需要N数千个样本范围内的值才能获得任何合理的结果,但原则上复杂度为O(N*r*b). 结果的精度为sqrt(N),即,要将精度提高两倍,您需要提高N四倍。对于足够大的r*b情况,这种方法显然更胜一筹。

近似值的扩展:您显然需要设计测试用例,使其尊重系统的所有属性。您提出了一些扩展,其中一些可以轻松实现,而另一些则不能。让我给你几个建议:

1)在 distinct but uncorrelated 的情况下,p[i]上述代码的变化很小:在函数头中,您传递一个数组而不是单个浮点数p,并将该行替换if random.random()<p: alivenum += 1

if random.random()<p[j]: alivenum += 1

2)在相关的情况下,p[i]您需要有关系统的其他信息。我在评论中提到的情况可能是这样的网络:

A--B--C
   |  |
   D  E
   |
   F--G--H
      |
      J

在这种情况下A,可能是“根节点”,节点故障可能D意味着节点 100% 概率自动故障FGH; J而 node 的失败F会自动关闭GH等等J。至少这是我在评论中提到的情况(这是一个合理的解释,因为你在原始问题中谈到了概率的树结构)。在这种情况下,您需要修改p引用树结构并for j in ...遍历树的代码,一旦测试失败,就从当前节点跳过较低的分支。当然,由此产生的测试仍然是是否alivenum >= b像以前一样。

3)如果网络是一个不能用树形结构表示的循环图,这种方法就会失败。在这种情况下,您需要首先创建死或活的图节点,然后在图上运行路由算法来计算唯一的、可到达的节点的数量。这不会增加算法的时间复杂度,但显然会增加代码复杂度。

4) 时间相关性是一个重要的,但如果您知道 mtbf/r(故障/修复之间的平均时间),则可能会进行修改,因为这可以为您提供p树结构或不相关线性p[i]的概率指数之和。然后,您将不得不在不同的时间运行 MC 程序,并获得相应的结果p

5)如果您只有日志文件(如上一段中所暗示的那样),则需要对方法进行实质性修改,这超出了我在此板上的能力范围。日志文件需要足够彻底,以允许重建网络图(以及 的图p)的模型以及 的所有节点的单个值p。否则,准确性将不可靠。这些日志文件还需要比故障和维修的时间尺度长得多,这种假设在现实生活中的网络中可能是不现实的。

于 2010-06-28T17:20:15.290 回答
2

假设每个节点都有一个恒定的、已知的和独立的可用率,就会想到一种分而治之的方法。

假设你有N节点。

  1. 将它们分成两组N/2节点。
  2. [0,N/2]对于每一边,计算任意数量的节点 ( ) 出现故障的概率。
  3. 根据需要将它们相乘和相加,以找到完整集合中的任何数字 ( [0,N]) 下降的概率。

第 2 步可以递归完成,在顶层,您可以根据需要求和,以找出超过某个数字的停机频率。

我不知道这个的复杂性,但如果我不得不猜测,我会说在或低于O(n^2 log n)


其机制可以在接线盒上进行说明。假设我们有 5 个具有正常运行时间的节点p1...p5A我们可以用p1...p2B把它分成几个部分p3...p5。然后我们可以处理这些以找到每个段的“N 个节点启动”时间:

为一个:

a2

一个_1

a_0

对于 B:

b_3

b_2

这个阶段的最终结果可以通过将每个a' 与每个b' 相乘并适当地求和来找到。

v[0] = a[0]*b[0]
v[1] = a[1]*b[0] + a[0]*b[1]
v[2] = a[2]*b[0] + a[1]*b[1] + a[0]*b[2]
v[3] =             a[2]*b[1] + a[1]*b[2] + a[0]*b[3]
v[4] =                         a[2]*b[2] + a[1]*b[3]
v[5] =                                     a[2]*b[3]
于 2010-06-30T04:42:47.797 回答