agent--- An agent is the long running daemon on every member of the Consul cluster。agent能以client和server模式运行,可以简称为客户端和服务器。
client---是一个将所有的RPC转发到服务器的代理。客户端唯一的交互就是参与LAN的八卦池 (LAN gossip pool)。
server---参与Raft仲裁,维护集群状态,响应RPC查询,与其他数据中心交换WAN信息,以及将查询转发给Leader或remote datacenters.
datacenter---数据中心定义为专用,低延迟和高带宽的网络环境。保存数据。
Consensus---Consul使用共识协议 来提供一致性(由CAP定义)。共识协议基于 “Raft:寻找可理解的共识算法”。
LAN Gossip--- 指包含全部位于同一局域网或数据中心的节点的LAN gossip pool。
WAN Gossip---Refers to the WAN gossip pool which contains only servers. 这些服务器主要位于不同的数据中心,通常通过互联网或广域网进行通信。
RPC---远程过程调用。这是一个请求/响应机制,允许客户端发出服务器请求。
在每个数据中心内,我们都有客户端和服务器的混合体。预计有三到五台服务器。这在故障情况下的可用性和性能之间取得了平衡,因为随着更多机器的添加,共识逐渐变慢。但是,客户数量没有限制,而且可以轻松扩展到数千或数万个客户。
数据中心内的所有节点都参与到八卦协议中。这意味着有一个八卦池包含给定数据中心的所有节点。这有几个目的:首先,不需要为客户端配置服务器的地址; 发现是自动完成的。其次,检测节点故障的工作不是放在服务器上,而是分布式的。这使得故障检测比天真的心跳方案更具可扩展性。第三,它被用作消息层来通知重要事件,例如领导者选举发生。
每个数据中心中的服务器都是单个Raft对等设备的一部分。这意味着他们一起选择一个单独的领导者,一个具有额外职责的选定服务器(Leader)。当非Leader的服务器收到RPC请求时,它会将其转发给集群Leader,Leader处理后会将结果Replication到各个节点上。
服务器节点也作为WAN八卦池的一部分运行。此池与LAN池不同,因为它针对互联网的更高延迟进行了优化,并且预计仅包含其他Consul服务器节点。这个池的目的是让数据中心以低触摸的方式发现彼此。在线添加新数据中心就像加入现有的WAN八卦池一样简单。因为这些服务器都在这个池中运行,所以它也支持跨数据中心的请求。当服务器收到对不同数据中心的请求时,会将其转发到正确数据中心中的随机服务器。该服务器可能会转发给当地领导。
通常,数据不会在不同的Consul数据中心之间复制。当对另一个数据中心中的资源发出请求时,本地Consul服务器将RPC请求转发给该资源的远程Consul服务器并返回结果。如果远程数据中心不可用,那么这些资源也将不可用,但这不会影响本地数据中心。在某些特殊情况下,可以复制有限的数据子集,例如Consul的内置 ACL复制功能或外部工具(如consul-replicate)。
共识协议:consul是通过raft来保持强一致性。通过raft选举出Leader,日志条目的复制来保证数据一致。
只有Consul服务器节点参与Raft并且是对等设置的一部分。所有client都将请求转发给server 这种设计的部分原因是,随着更多成员被添加到对等设置中,法定数量的大小也会增加。这会引起性能问题,因为您可能会等待数百台机器同意进入而不是少数几台机器。
不理解: LAN和WAN的八卦协议中的故障检测功能
Gossip协议:
领事使用两个不同的八卦池。我们将每个池分别称为LAN或WAN池。Consul运营的每个数据中心都有一个包含数据中心所有成员(包括客户端和服务器)的LAN八卦池。LAN池用于几个目的。成员资格信息允许客户自动发现服务器,从而减少所需的配置数量。分布式故障检测允许整个集群共享故障检测工作,而不是集中在几台服务器上。最后,八卦游戏池允许可靠和快速的事件广播,比如领袖选举。
WAN池是全球唯一的,因为无论数据中心如何,所有服务器都应该参与WAN池。WAN池提供的成员资格信息允许服务器执行跨数据中心请求。集成的故障检测功能使Consul能够正常处理丢失连接的整个数据中心,或仅处理远程数据中心内的单个服务器。
信号量(分布式锁)是基于session机制的。
Consul提供的合约,发生如下任一情况,session都会被销毁:
•节点销毁
•任何的健康检查,注销
•任何健康检查都要进入Critical状态
•会话被显式销毁
•TTL到期,如果适用
当session失效后,会被销毁,不能再使用。如果使用release,任何与该session相关的锁都会被释放,并且持有该锁的key的ModifyIndex也会递增。如果使用了Delete,持有该锁的KEY将会被删除。
网友评论