Serf:Gossip Protocol

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包内

时间: 2024-08-08 13:47:11

Serf:Gossip Protocol的相关文章

Consul:Gossip协议

Consul使用gossip协议来管理成员和广播消息到集群.所有这些都是通过使用Serf库提供的.Serf使用的gossip协议基于“SWIM: Scalable Weakly-consistent Infection-style Process Group Membership Protocol”,有一些小的修改.更多关于Serf的协议细节见此文档. Consul中的Gossip Consul使用两个不同的gossip池.我们分别称为LAN和WAN池.每个数据中心有一个LAN gossip池,

npm install Error:EPROTO: protocol error, symlink '../mime/cli.js' -> '/vagrant/src/nodejs/node_modules/express/node_modules/send/node_modules/.bin/mime'

我在ubuntu上使用npm安装依赖是出现下面错误: npm ERR! Linux 3.13.0-101-genericnpm ERR! argv "/usr/bin/nodejs" "/usr/bin/npm" "install" "express"npm ERR! node v4.6.2npm ERR! npm v2.15.11npm ERR! path ../mime/cli.jsnpm ERR! code EPROTO

禁止root远程登录 sshd问题:A protocol error occurred. Change of username or service not allowed

在研究Linux安全的时候遇到一个问题,原本打算修改linux直接远程root登陆,修改为sshd的配置文件后 Nano /etc/ssh/sshd_config 把#PermitRootLogin yes 修改为PermitRootLogin no 修改完成后,保存退出 重启sshd service sshd restart 新建一个普通用户 Useradd unixbar Passwd unixbar 在securecrt远程工具中,使用普通用户登陆的时候,出现了 The server ha

sshd问题:A protocol error occurred. Change of username or service not allowed

在securecrt远程工具中,使用roto登陆的时候,出现了 The server has disconnected with an  error.  Server message reads: A protocol error occurred. Change of  username or service not allowed: (shang1,ssh-connection) ->  (shang,ssh-connection) 这是因为sshd中禁用了root账户远程登录. 修改ssh

Akka cluster gossip protocol

General background: Type of gossip: Push gossip: A node that has new information initiates gossip message to some other random node: Message usually contains full state.Propagation fast when less than half of the nodes are infected Pull gossip:A node

小tips:HTML DOM protocol 属性

protocol 属性是一个可读可写的字符串,可设置或返回当前 URL 的协议. 语法: location.protocol=path 实例:假设当前的 URL 是: http://example.com:1234/test.htm#part2: <script type="text/javascript"> document.write(location.protocol); </script> 输出: http:

Swift:Extension和Protocol

一.Swift中的扩展功能(Extension)可以动态给类增加功能,类似于Javascript中的prototype; 而在objective-c中,是通过runtime来实现动态调用或者添加功能的. 定义方式如下: extension SomeType { } 1. 单位转换 extension Double { var km: Double {return self * 1000.0} } 调用的代码如下: let walk: Double = 25.4; print("25.4千米 =

Android:手把手带你分析 Protocol Buffer使用 源码

前言 习惯用 Json.XML 数据存储格式的你们,相信大多都没听过Protocol Buffer Protocol Buffer 其实 是 Google出品的一种轻量 & 高效的结构化数据存储格式,性能比 Json.XML 真的强!太!多! 由于 Google出品,我相信Protocol Buffer已经具备足够的吸引力 今天,我将讲解Protocol Buffer使用的源码分析,并解决以下两个问题: a. Protocol Buffer序列化速度 & 反序列化速度为何如此快 b. Pr

032:基于Consul和MGR的MySQL高可用架构

目录 一.Consul 1.Consul简介 2.准备环境 3.Consul 安装 4.Consul配置文件 5.Consul 服务检查脚本 6.Consul启动 二.MGR搭建 1.MGR配置 2.MGR查看 三 .Consul测试 1.MGR(多主模式)+ Consul模式 1.1 .Consul UI界面 1.2.Consul 检查DNS解析 1.3.切换测试 2.MGR(单主模式)+ Consul模式 + PorxySQL 2.1.PorxySQL配置 2.2 .查看页面 2.3.检查D