Consul使用gossip协议来管理成员和广播消息到集群。全部这些都是经过使用Serf库提供的。Serf使用的gossip协议基于“SWIM: Scalable Weakly-consistent Infection-style Process Group Membership Protocol”,有一些小的修改。更多关于Serf的协议细节见此文档。html
Consul使用两个不一样的gossip池。咱们分别称为LAN和WAN池。每一个数据中心有一个LAN gossip池,它包含数据中心的全部成员——client和server。LAN池用于几个目的:成员关系运行client自动发现server,减小配置量;分布式的故障检测容许故障检测的工做由整个集群承担,而不是集中在少数server上;最后gossip池容许可靠和快速的事件广播,好比leader选举。网络
WAN池是全局惟一的,觉得全部的server都应该加入WAN池,不管是哪一个数据中心的。WAN池提供的成员关系容许server执行跨数据中心请求。集成的故障检测容许Consul优雅的处理整个数据中心失联,或者远程数据中心只有一个server。分布式
全部这些特征经过Serf提供。它被用来做为一个嵌入式的包来提供这些特征。从用户的角度,这是不重要的,由于这些抽象应该被Consul屏蔽。然而这对于开发者理解这个包是如何应用是颇有用的。server
SWIM假设本地节点是健康的,在这个意义上软实时处理数据包是可能的。然而,在本地节点正处于CPU或者网络资源枯竭的状况下,这个假设就不成立了。结果就是serfHealth检查状态会偶尔的抖动,致使错误的报警,增长遥测噪声,和简单的致使整个集群浪费CPU和网络资源来诊断一个可能并不真的存在的故障。htm
Lifeguard经过增长SWIM完全解决了这个问题。Lifeguard的更多的细节请看Serf的gossip协议引导部分。事件