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