【问题标题】:Calculating the probability of system failure in a distributed network计算分布式网络中系统故障的概率
【发布时间】:2011-03-06 18:45:47
【问题描述】:

我正在尝试构建分布式文件系统中文件可用性的数学模型。我在 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) 组成的元组。例如,使用这些数据,您可以计算节点之间的可用性与可用性差异的相关性。

【问题讨论】:

  • “节点独立”是什么意思?您是在谈论表示节点网络的图,并且某些关键节点的故障可能会将图划分为无法相互通信的拓扑不同的子网?或者您是否假设单个节点故障也可能导致其他节点故障(例如,因为它们可能是位于同一物理机器上的虚拟机)?如果不澄清相关性的性质,就不可能提出任何模型。
  • 作为上一个问题的后续,如果在能够在每个节点之间进行通信的节点子网上有可用副本,则指定文件的重建是否可能(阅读:有意义)很重要其他。或者,如果您需要从“根节点”访问至少 b 个节点的子网,以恢复相关文件。
  • 最后一段介绍了measurement-date 作为附加属性。这在系统中引入了一个时间尺度,以前系统被假定为静态的。以前,一个节点要么活着(概率p)要么死了(概率1-p)。有了时间尺度,系统可能不再是静态的,并且某个平均故障间隔时间(用于将 alive 节点切换到 dead)和平均修复间隔时间(相反)可能变得有意义。如果您遇到这种情况,恢复文件的概率将取决于时间。
  • 作为时间相关案例的后续,需要处理 mtbf/r(故障/修复之间的平均时间)而不是 p1-p,所有它成为具有平均值(如您所指出的那样可能取决于节点)和不确定性(如果您的日志变得足够长,则减少到零)的可测量量。我指出这一点是因为在这种情况下,问题将与原始问题完全不同(您只是在特定情况下要求简化公式)。
  • 感谢您的宝贵意见! “节点独立性”是指单个节点故障可能导致其他节点故障的可能性。您可以假设系统是静态的(即不依赖于时间)。我添加时间变量的原因是为了表明我拥有创建时间相关模型的数据,但这不是必需的;如果可以在没有太大性能影响的情况下使用它,那只是一个额外的好处。

标签: computer-science distributed time-complexity high-availability binomial-cdf


【解决方案1】:

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

具体示例代码:这是一个非常基本的示例代码(在 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 测试,检查r*b 节点中的b 节点是否处于活动状态,失败概率为p。一些实验会让您相信,您需要在数千个样本范围内的 N 值才能获得任何合理的结果,但原则上复杂度为 O(N*r*b)。结果的准确度为sqrt(N),即要将准确度提高两倍,您需要将N 提高四倍。对于足够大的r*b,这种方法显然更胜一筹。

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

1) 在不同但不相关的p[i] 的情况下,上述代码的更改是最小的:在函数头中,您传递一个数组而不是单个浮点p,并将if random.random()&lt;p: alivenum += 1 替换为

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

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

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

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

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

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

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

【讨论】:

  • 感谢您的好评!我在赏金到期之前接受了你的回答,但由于某种原因,它说赏金是自动接受的,只有一半的积分被授予。对此感到抱歉。
【解决方案2】:

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

假设你有N 个节点。

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

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

我不知道这有多复杂,但如果我不得不猜测,我会说在O(n^2 log n)或以下@


这个机制可以用一个终端机壳来说明。假设我们有 5 个运行时间为 的节点。我们可以将其拆分为A 和 和B 和。然后我们可以处理这些以找到每个段的“N 个节点启动”时间:

对于 A:

对于乙:

这个阶段的最终结果可以通过将每个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]

【讨论】:

  • 1) 您如何将这种方法推广到不同故障概率的情况? N=20 的示例:如果三个节点 N2、N3 和 N7 关闭的概率与 N1、N4 和 N5 不同,那么您仍然具有复杂性 O(2^N),因为您需要考虑所有这些不同的情况。 2)如何将这种方法推广到节点相关的情况?即,如果节点 2 的故障导致节点 [N/2-1,...,N] 的故障?递归算法无法有效处理这种非局部性。
  • A 的示例案例包含四个术语,对应于四种不同案例的组合,导致三种可能的结果。因此复杂度为2^2=4。案例 B 对应四种可能的结果;如果您明确写下它,您将拥有 b0、b1、b2、b3 总共有2^3=8 个单独的术语,每个术语代表这八种情况之一。 “将每个a 与每个b 相乘并适当地求和”产生六个可能的结果,总共有2^5=32 项。因此,您的提案的复杂性与原始问题中的相同。
  • @user8472:将a 中的每一个与b 中的每一个相乘并适当地求和会产生六个可能的结果,总共有“4*3=12”项。 a0*b0 ... a0*b3, a1*b0 ... a1*b3, a2*b0 ... a2*b3 大大降低了复杂性,并且改进在更高的地方变得更好。
  • @BCS:我了解您的方法如何执行多个术语的记忆。 a1 是两个术语,b1 是三个,所以v1 实际上是五个“术语”,而不是两个。但是,由于您对v1...v4 多次使用相同的组合,因此您只需计算一次即可。尽管如此,我看不出这种方法如何推广到相关性,因为(例如,请参阅我的建议 3 中关于节点 AE 的网络)在这种情况下,节点 B 的故障将非本地切断来自 b0.. 的所有贡献。 .b3 并且您的记忆背后的独立性假设是不正确的。
  • @user8472:我认为我的描述相当明确,因为它重用了术语,哦,好吧。 --- 它只适用于独立的 e.i.不相关的系统。 OTOH 对于某些系统,可以选择拆分部分以匹配相关性。即使只能做到一点点,也可以将其简化为 `O(b*2^(n/b)) 问题。
猜你喜欢
  • 2014-03-03
  • 1970-01-01
  • 1970-01-01
  • 2011-09-30
  • 1970-01-01
  • 2021-05-28
  • 2023-02-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多