(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.log10Math.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

cassandra中对节点失败与否的探测方法, the Phi accrual Failure Dector,附论文的更多相关文章

  1. 【Gradle】配置中引用的jar包版本后面自动加冒号导致引入jar包失败的问题/gradle中引用jar包版本不一致的问题/gradle中引用jar失败的问题 解决方法

    idea中 gradle中 引用jar包,版本后面默认加:的问题 gradle中引用jar包版本不一致的问题 gradle中引用jar失败的问题 如上题目所示,三个问题其实都是同一样的简单又恶心,因为 ...

  2. XML中文本节点存储任意字符的方法

    XML xml是一种可扩展标签语言, 为众多浏览器支持解析, ajax更是利用xml来完成服务器和客户端之前的通信. xml基本元素为 <label>xxx</label>, ...

  3. hanlp在Python环境中的安装失败后的解决方法

    Hanlp是由一系列模型与算法组成的javag工具包,目标是普及自然语言处理再生环境中的应用.有很多人在安装hanlp的时候会遇到安装失败的情况,下面就是某大神的分享的在python环境中安装失败的解 ...

  4. Web.config中appSettings节点值两种读取方法

        <appSettings>    <add key="ClientPort" value="5252"/>   <add ...

  5. Cassandra中的数据一致性

       Cassandra中数据一致性指的是数据行在各个复制节点(replicas)上的更新和同步程度.通过提供tunable consistency,Cassandra扩展了eventual cons ...

  6. Cassandra 备份 - 1 - 节点镜像恢复

    之前比较关注如何使用Cassandra,但是真正想大规模使用前提还是需要搞清楚备份机制,确保数据安全. 本文主要内容来自文档 "Cassandra2.2"的翻译.最后部分为真实操作 ...

  7. cassandra中的ACID,与RDBMS中的事务有何不同?

    Cassandra中的ACID标准 Apache Cassandra不遵循具有回滚或锁定机制的ACID(原子性,一致性,隔离性,持久性)事务,而是提供原子,隔离和持久的事务,并具有最终和可调的一致性, ...

  8. web.config中sessionState节点的配置方案

    web.config中sessionState节点的配置方案 web.config关于sessionState节点的配置方案,sessionState有五种模式:Custom,off,inProc,S ...

  9. Cassandra配置多节点集群以及使用雅虎YCSB压测Cassandra 3.11

    这几天在搭Cassandra集群以及对Cassandra的性能测试,步骤还挺多,记录一下. 关于Caaandra在服务器上配置多节点集群,可以参考一下文章: http://blog.csdn.net/ ...

随机推荐

  1. 学习Linux系列--安装Ubuntu

    最近学习Linux,使用虚拟机太不方便,于是购买了阿里云最便宜的云主机作为学习设备. 本系列文章记录了个人学习过程的点点滴滴. 学习Linux系列--安装Ubuntu 学习Linux系列--安装软件环 ...

  2. python学习之列表语法

    1.列表 1 list.append(obj)在列表末尾添加新的对象2 list.count(obj)统计某个元素在列表中出现的次数3 list.extend(seq)在列表末尾一次性追加另一个序列中 ...

  3. Spark 1.1.0 编译(为了支持hbase 0.98.6)

    为了支持hbase0.98.6,需要重新编译spark 1. 下载spark 1.1.0源代码,以及 scala-2.10.4的bin包. 将环境变量 SCALA_HOME 设置为 scala-2.1 ...

  4. 基于ASP.NET MVC定时执行任务调度

    相对FluentScheduler实现定时调度任务的使用简单,配置少的特点,Quartz.Net则配置稍微复杂一些.下面我们就接合一个 ASP.NET MVC网站应用程序的定时执行任务调试的小实例来了 ...

  5. 【转】CentOS下载版本介绍

    官网:http://www.centos.org/ 下载:http://mirror.neu.edu.cn/centos/6.6/isos/ 系统运维:http://www.osyunwei.com/ ...

  6. [Python爬虫]cnblogs博客备份工具(可扩展成并行)

    并发爬虫小练习. 直接粘贴到本地,命名为.py文件即可运行,运行时的参数为你想要爬取的用户.默认是本博客. 输出是以用户名命名的目录,目录内便是博客内容. 仅供学习python的多线程编程方法,后续会 ...

  7. HDU 5795 A Simple Nim(简单Nim)

    p.MsoNormal { margin: 0pt; margin-bottom: .0001pt; text-align: justify; font-family: Calibri; font-s ...

  8. wamp环境下phpmyadmin拒绝访问

    You don't have permission to access /phpmyadmin on this server. 找到 alias/phpmyadmin.conf  的配置文件 将 &l ...

  9. 内部类 & 泛型

    内部类 主要作用 1. 内部类, 主要用于事件监听的方法实现.2. 用于多继承 注: 主要还是 1 用的比较多. 参考 : head first java (第12章) 泛型 head first j ...

  10. Windows 数据类型

    类型 定义 描述 ATOM typedef WORD ATOM; 原子(原子表中的一个字符串的参考) BOOL typedef int BOOL; 布尔变量 BOOLEAN typedef BYTE ...