Computer science 分布式网络中系统失效概率的计算

Computer science 分布式网络中系统失效概率的计算,computer-science,distributed,time-complexity,high-availability,binomial-cdf,Computer Science,Distributed,Time Complexity,High Availability,Binomial Cdf,我试图建立一个分布式文件系统中文件可用性的数学模型。我在MathOverflow上发布了这个问题,但这也可能被归类为CS问题,所以我在这里也尝试一下 系统是这样工作的:一个节点在r*b远程节点存储一个文件(使用擦除代码编码),其中r是复制因子,b是一个整数常量。擦除编码文件的特性是,如果至少有b个远程节点可用并返回文件的一部分,则可以恢复该文件 最简单的方法是假设所有远程节点彼此独立,并且具有相同的可用性p。根据这些假设,文件的可用性遵循二项分布,即 不幸的是,这两个假设可能会引入不可忽略的错误

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

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

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

不幸的是,这两个假设可能会引入不可忽略的错误,如本文所示:

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

你们有没有什么好的近似方法,它比二项分布近似法误差小,但计算量比二项分布近似法好


您可以假设每个节点的可用性数据是一组元组,由
(测量日期、节点测量、正在测量的节点、成功/失败位)
组成。例如,使用这些数据,您可以计算节点之间可用性的相关性和可用性差异。

对于大型
r
b
您可以使用一种称为蒙特卡罗积分的方法,例如,请参阅(和/或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
2) 在相关
p[i]
的情况下,您需要有关系统的其他信息。我在评论中提到的情况可能是这样一个网络:

A--B--C
   |  |
   D  E
   |
   F--G--H
      |
      J
在这种情况下,
A
可能是“根节点”,节点
D
的故障可能意味着自动故障,节点
F
G
H
J
的概率为100%;而节点
F
的故障会自动导致
G
H
J
等故障。至少这是我在评论中提到的情况(这是一个合理的解释,因为您在原始问题中谈到了概率的树结构)。在这种情况下,您需要修改
p
引用树结构的代码,并且
for j In…
遍历树,在测试失败时跳过当前节点的较低分支。当然,最终的测试仍然是
alivenum>=b

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

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


5) 如果你仅仅拥有日志文件(如你在最后一段中所暗示的),那么需要对方法进行实质性修改,这超出了我在这个委员会上所能做的。日志文件需要足够彻底,以便能够为网络图(以及
p
的图)以及
p
的所有节点的单个值重建模型。否则,准确性将不可靠。这些日志文件还需要大大长于故障和修复的时间尺度,这一假设在现实网络中可能不现实。

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

假设您有
N个
节点

  • 将它们分成两组
    N/2
    节点
  • 对于每一侧,计算任意数量的节点(
    [0,N/2]
    )下降的概率
  • 根据需要,将这些值相乘并求和,以确定全集合中任何数字(
    [0,N]
    )下降的概率
  • 第2步可以递归地完成,在顶层,您可以根据需要求和,以找出超过某个数字的下降频率

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


    其机理可以在终端盒上进行说明。假设我们有5个节点具有up时间。我们可以将其分为
    A
    BA--B--C
       |  |
       D  E
       |
       F--G--H
          |
          J
    
    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]