zoukankan      html  css  js  c++  java
  • cassandra中对节点失败与否的探测方法, the Phi accrual Failure Dector,附论文

    (1)在分布式系统中,对于某个节点是否还“活着”的探测,通常是设定一个时间的阀值,然后根据接收到的“心跳”信息的间隔,来判定这个节点是否还活着,然后返回一个bool值;

    但这种做法很容易造成误判:因为你不能确切得知道 究竟是真的是节点挂掉了,还是网络比较“慢”;

    (2)cassandra里面采用一种可以自适应自调整的故障探测的方法,主要实现原理是:

    用一个滑动窗口记录下 接收到的 一个节点的心跳信息的时间间隔,在cassandra中,窗口的size设置为1000;然后根据窗口中的数据来生成指数分布,从而估计下一次心跳在当前时刻应该到来的概率;

    虽然 原论文中建议这些时间间隔服从 高斯分布,但指数分布是一个更好的选择:关于 指数分布 与 泊松分布(http://www.ruanyifeng.com/blog/2015/06/poisson-distribution.html,这里有阮一峰的一篇博文写的挺清楚的);

    指数分布表示的就是时间发生的间隔的概率,公式如下:

    P(x <= t) = 1 - e^-Lt  ,其中L表示事件发生的频率;其极大似然估计就是 1/mean(平均数)

    (3)那么cassandra中的具体做法是怎样的?

    我门假设 P_later 表示 endpoint B 挂掉的概率,t参数表示自从上一次收到B的heartbeat信息以来,时间已经过去了多久;那么

        P_later(t) = 1 - F(t)

    其中,F(t)是时间间隔事件发生的累计分布函数,很容易理解,F(t)表示上次事件(接收到endpoint B的heartbeat消息)开始到t时间之间应该接到endpoint B的heartbeat消息的概率,那么没有接收到就用1减去;因为没有接收到我们可能就认为B挂掉了;

    带入指数分布的公式,所以就有:

       P_later(t) = 1 - (1 - e^(-Lt))

    其中L的极大似然估计是1/均值,就是滑动窗口中记录的所有时间间隔的均值;

      P_later(t) = 1 - (1 - e^(-t/mean))

    原论文到这里就截止了,cassandra接着的做法如下:

      P_later(t) = e^(-t/mean)

    然后 phi的计算 

      phi(t) = -log10(P_later(t))

    接着化简

      phi(t) = -log10(e^(-t/mean))

      phi(t) = -log(e^(-t/mean)) / log(10)

      phi(t) = (t/mean) / log(10)

    将log(10)带进来,约等于

      phi(t) = 0.4342945 * t/mean

    这确实要比计算如下的方式简单多了:

    (-1) * MATH.log10 Math.pow(Math.e, ((-1) * (t)/mean)))

    cassandra中认为 phi(t) 大于 8时,就认为节点挂掉了。

    对于选择phi 等于 8这个值,我们反过来计算一下概率,如果phi(t) 为 8,那么P_later(t)需要为10^-8,说明这个情况是一个很小概率的情况,这样而来,误判的概率就很小了。

    参考论文:

    http://files.cnblogs.com/files/yuhan-TB/ThePhiAccrualFailureDetector.pdf

  • 相关阅读:
    C++编程之约定俗成的习惯(1)
    “亚信科技杯”南邮第七届大学生程序设计竞赛之网络预赛 (K L题解) CSS出题
    “亚信科技杯”南邮第七届大学生程序设计竞赛之网络预赛 (K L题解) CSS出题
    “亚信科技杯”南邮第七届大学生程序设计竞赛之网络预赛 (K L题解) CSS出题
    “亚信科技杯”南邮第七届大学生程序设计竞赛之网络预赛 (K L题解) CSS出题
    万万没想到(2) 南邮NOJ2058
    万万没想到(2) 南邮NOJ2058
    万万没想到(2) 南邮NOJ2058
    万万没想到(2) 南邮NOJ2058
    万万没想到(1) 南邮NOJ
  • 原文地址:https://www.cnblogs.com/yuhan-TB/p/4746510.html
Copyright © 2011-2022 走看看