流言协议


Consul使用流言协议来管理集群成员和广播消息。所有这些都通过使用Serf库来提供。Serf使用的流言协议基于“SWIM:可伸缩的弱一致性的传染式进程组成员协议”,以及一些小小的改良。关于Sefr的协议这里有更多细节。

高级主题!本文将介绍Consul内部的技术细节,对于实际操作和使用Consul,你不需要知道这些细节。这些细节记录在这里为那些希望了解它们的人,小伙伴们不必再去探索源代码。

Consul中的流言

Consul使用两个不同的流言池,这两个池分别是LAN池和WAN池。Conusl运行的每个数据中心有一个包含所有数据中心成员的LAN池,包括所有的Client和Server。LAN池用于一些目的:成员信息使Client可以自动发现Server,减少需要的配置数量;分布式的故障检测使故障检测工作分享到整个集群,代替集中在某些Server之上;最后,流言池提供可靠和快速的事件广播,比如leader选举事件。

WAN池是全局唯一的,所有的Server都参与其中,不管是哪个数据中心的。WAN池提供的成员信息使Server可移植性跨数据中心的请求。集成的故障检测使Consul可以优雅的处理整个数据中心的失连,或者只是远程数据中心的某个Server。

所有这些功能都利用Sefr来提供。它作为一个嵌入式的库来提供这些功能。从用户的视角来看,这并不重要,因为这些概念已经被Consul掩盖了。然而作为一个开发者,理解这个库如何被利用的,是有用的。

Lifeguard增强

SWIM假设本地节点是健康的,在此观念下,软实时数据包处理可行的。然而,本地节点在经历CPU或网络资源耗尽的情况下,这个假设就会被打破。结果是,serfHealth检查状态会出现偶尔摆动,产生误报警,增加遥测噪音,很容易导致整个集群浪费CPU和网络资源去诊断一个可能根本不存在的故障。

Lifeguard通过对SWIM使用新的增强,完全的解决了这个问题。请看Serf的流言协议指南中关于Lifeguard的部分了解更多细节。