Serf使用Gossip Protocol来广播消息到集群中。本文介绍这个内部协议的细节。gossip协议基于“SWIM: Scalable Weakly-consistent Infection-style Process Group Membership Protocol”,有一写小的适配,很大程度上增加了传播速度和收敛速率。

SWIM Protocol Overview

  Serf以加入一个已存在的集群或者启动一个新集群开始。如果启动一个新集群,其他节点则会加入它。为了加入现有集群,新节点必须至少分配一个已经存在的节点的地址。新的成员与现有成员通过TCP做一个完整的状态同步并且开始gossip它的存在到集群中。

  Gossip基于UDP并且具有一个可配但是固定的扇出(fanout)和间隔。这保证网络资源使用是固定的,不论节点数有多少。通过TCP随机的与一个节点周期的进行完整状态交换,但是远远少于gossip消息。全状态交换和合并会增加成员关系列表收敛的可能性。全状态交换的间隔是可配的或者完全停止。

  故障检测通过可配间隔的周期性的随机探测实现。如果节点在一个响应时间内(通常是RTT时间的倍数)没有进行ack,会尝试间接探测。间接探测要求可配数量的节点来探测相同的节点,以防网络问题导致我们的节点探测失败。如果我们的探测和间接探测都在响应时间内失败,则该节点被标记为“suspicious”并且会被gossip到集群中。一个可疑节点仍然视为集群的成员。如果集群的可以节点在一个可配的周期时间内对怀疑没有争论,则节点最终被认为死亡,这个状态被gossip到集群中。

  这是对协议的一个简短和不完整的描述。更好的方式是完整阅读 SWIM论文和Serf的源代码。

SWIM Modifications

  如前所述,gossip协议基于SWIM,但是包含小的变化,很大程度上增加了传播速度和收敛速率。

  SWIM的变化都记录在这:

  • Serf通过TCP定期的做完整状态同步。SWIM只通过gossip传递消息。虽然最终都是一致的,但是Serf可以更快速的收敛,以及优雅的从网络分区中恢复。
  • Serf有一个从故障检测协议分离出来的gossip层。SWIM只通过在probe/ack消息上附带gossip消息。Serf基于专用的gossip消息传递。这个特征允许你有一个更高的gossip速率(例如200ms一次)和更低的故障检测速率(例如每秒一次),使得整体更快的收敛速率和数据传播速度。
  • Serf保持死亡节点设置为死亡的时间,所以当完整的同步请求时,请求者也接收死亡节点的信息。因为SWIM不做完整同步,并且SWIM一旦知道节点死亡则立即删除节点状态。这个改变再一次帮助集群收敛更快。

Lifeguard Enhancements

  SWIM假设本地节点是健康的,也就是说可以软实时处理数据包是可能的。然而,在本地节点正在经历CPU或者网络资源耗尽的情况下,这个假设就不成立了。结果是会导致节点健康偶尔振动,导致错误的监控报警,增加遥测噪声,并且直接导致整个集群浪费CPU和网络资源来诊断一个可能并不存在的故障。

  Serf 0.8版本添加了Lifeguard,它完全解决了这个问题通过增强SWIM。

  第一个扩展是引入了“nack”消息来探测查询。 If the probing node realizes it is missing "nack" messages then it becomes aware that it may be degraded and slows down its failure detector. As nack messages begin arriving, the failure detector is sped back up.

  第二个变化是引入了在声明另一个结点故障之前动态改变怀疑超时时间的功能。探测结点初始化时有一个很长的怀疑超时。只有集群中的其他节点确认一个节点是可以的,计时器加速。在正常操作期间检测时间实际上与早期版本的Serf一样。然而,如果一个节点被退化,并且没有得到确认,则会有一个很长的超时时间来允许被怀疑的节点来反驳它的状态并且保持健康。

  这两个机制联合使得Serf对于集群中退化的节点更加健壮,同时保持故障检测性能不变。Lifeguard没有额外的配置,它自动调节。

Serf-Specific Messages

  在基于SWIM的gossip层上,Serf发送一些自定义的消息类型。

  Serf大量使用Lamport clocks来维护消息的顺序,虽然最终是一致的。每个由Serf发出的消息都包含一个Lamport clock时间。

  当一个节点优雅的离开集群时,Serf通过gossip层发送一个leave intent。因为gossip层以下不区分节点离开集群和一个节点被检测为故障的,这允许更高级别的Serf层来检测故障与优雅的离开。

  当一个节点加入集群时,Serf发送一个join intent。这个意图的目的仅仅是绑定一个Lamport clock时间到join上使得在leave乱序来临时,join可以被正确的排序。

  对于自定义的事件和查询,Serf发送user event或者user query消息。这个消息包含Lamport时间,事件名称和事件负载。因为user event是沿着使用UDP的gossip层发送,负载和整个消息帧必须满足在单个UDP包内

转载于:https://www.cnblogs.com/lsf90/p/6119999.html

Serf:Gossip Protocol相关推荐

  1. GOSSIP PROTOCOL(又被称为反熵Anti-Entropy, 一种弱一致性, 同步信息交换通信的协议)...

    GOSSIP PROTOCOL(又被称为反熵"Anti-Entropy", 一种弱一致性, 同步信息交换通信的协议) 1.它是一种最终一致性算法 2.它是弱一致性的 1.https ...

  2. 大数据体系【协议】系列-1:gossip协议

    2019独角兽企业重金招聘Python工程师标准>>> 阅读背景: 如果您对于系统底层的协议没有特别大的兴趣,完全可以不读,通常做为组件实现的底层算法.被用来实现组件本身.Apach ...

  3. 有关Cassandra节点之间的通信:Gossip【译】

    Cassandra使用叫做Gossip的协议发现集群中其他节点的位置和状态信息.Gossip是一个点对点的通信协议,节点之间会周期进行状态信息交换--这些信息包括当前节点本身信息,以及当前节点存储的其 ...

  4. 在线 PPT 制作工具:Gossip,聚焦内容内在逻辑

    大家好,我是你们的小金子. 今天要给大家推荐一款在线制作 PPT 的工具.PPT 在家应该都做过,是工作和学习中比较好的去表达自己工作和观点的重要工具,可以说掌握好 PPT 是我们必备基础技能. 这款 ...

  5. 论文阅读2018:Internet Protocol Cameras with No Password Protection: An Empirical Investigation

    Internet Protocol Cameras with No Password Protection: An Empirical Investigation 作者 知识点 insecam.org ...

  6. 学习笔记:Java Protocol Buffer的使用和编码原理学习

    一.protocolbuffer简介: protocol buffer 是 google 的一种数据交换的格式,它独立于语言,独立于平台.google 提供了三种语言的实现:java.c++ 和 py ...

  7. UFS规范解读8: UFS Protocol Information Unit

    目录 1. 前言 2. 通用的UPIU格式 |- -Basic Header Format |- - -Transaction Type |- - -Flags |- - -LUN |- - -Tas ...

  8. cmake报错:Unsupported protocol

    现象 最近在用cmake编译Apache arrow时,竟然报了错: 排查过程 最开始在网上直接搜"Unsupported protocol",查到的说是因为安装的curl不支持h ...

  9. 调试错误:ValueError: Protocol message Feature has no quot;featurequot; field.

    学习<Tensorflow:实战Google深度学习框架>过程中,在复现第7章 7.1节中的例子时出现错误 代码: #-*-coding:utf-8-*- import tensorflo ...

最新文章

  1. 财付通接口(asp)
  2. [转载]最完整PHP.INI中文版
  3. (转)光照图的理论和实践
  4. echarts map
  5. 开课吧Java教程:如何用listFiles()方法
  6. [渝粤教育] 云南大学 高等数学B(2) 参考 资料
  7. xpath返回结果是否有值_【自学C#】|| 笔记 41 DataReader:读取查询结果
  8. pyspark 空值填充
  9. 用envi裁剪下来的图像是黑色的_ENVI进行图像裁剪.doc
  10. 金融货币学笔记(米什金)第一章 为什么研究货币、银行与金融市场
  11. 我的原创IT著作再次被中科院图书馆、国图等国家级学术机构收藏!
  12. WiFi模块种类二:单WiFi功能双频WiFi模块
  13. Java 字符串转码工具类
  14. 要求用 100 元买 100 只鸡,其中公鸡五元一只,母鸡三元一只,小鸡 1 元三只,规定每种至少买一 只
  15. 玩转华为ENSP模拟器系列 | 配置OSPFv3 ABR路由聚合示例
  16. js判断手机的横竖屏调整样式
  17. element-ui中el-table组件的行号
  18. L05 Laravel 教程 - 电商实战
  19. Qt—设计颜色编辑选取对话框
  20. 基于5G+MEC的电站行业专网部署方案研究

热门文章

  1. Go工程化 - 手摸手带你理解依赖注入
  2. netstat -anp | grep 8199 查看端口占用情况
  3. laravel5.4根据数据表生成迁移文件
  4. laravel的启动过程解析(转)
  5. 扩展RocketMQ 使其支持任意时间精度的消息延迟
  6. 总结协查上海银行绑卡失败原因的处理过程
  7. linux 重庆mysql_Linux服务器上MYSQL的安装
  8. 这几个常用的 Go 官方库,性能居然还不如三方开源库
  9. 分享一个Go项目的整洁架构模板
  10. 如何在Hyper-V上安装Centos7