在 Consul 中,您可以拥有许多代理作为服务器或客户端。在所有服务器中,一个被选为领导者。从代理的角度来看,它怎么知道自己是领导者?
5 回答
Consul 领导者是通过Raft 协议的实现从 Consul 服务器的法定人数中选出的。只有配置为服务器的 Consul 实例参与 Raft 协议通信。Consul Agent (守护进程)可以作为Client或Server启动。只有服务器才能成为数据中心的领导者。
Raft 协议由斯坦福大学的 Diego Ongaro 和 John Ousterhout 创建,以应对现有共识协议(如Paxos )的复杂性。Raft 通过使用随机计时器来选举领导者。Ongaro 和 Ousterhout 的论文中详细介绍了该算法。
配置为客户端的 Consul 实例通过基于Serf的Gossip 协议与集群通信。农奴的沟通最终是一致的。Serf 集群没有中央服务器,每个节点都被认为是平等的。参与 Gossip/Serf 协议的所有节点(客户端和服务器)将消息传播给它们的邻居,这些邻居又将消息传播给它们的邻居,直到消息传播到整个集群。有点像僵尸启示录的感染路径。这样做是为了大大减少集群中的通信开销,因为它可能扩展到数万个节点。
Consul 客户端可以将消息转发到任何 Consul 服务器,然后将消息转发给 Leader。Consul Client 不需要关心哪个 Consul Server 是 Leader。只有服务器需要关心。
在任何 Consul 服务器上运行的Consul HTTP API都会告诉您哪个服务器是$ANY_CONSUL_SERVER/v1/status/leader
. 但是,这与 Consul Agents 如何进行领导人选举无关。
一种方法是调用集群http://<localhost_ip_address>:8500/v1/status/leader
这将返回当前的领导者。然后只需检查返回的 IP 地址与本地 IP 地址。
consul operator raft list-peers 也显示了 peer 之间的关系;例如
领事操作员筏列表同行
Node ID Address State Voter RaftProtocol
agent1 2a3ae4a0-8193-7da9-f978-911d7df0d184 192.168.110.128:8300 leader true 3
agent2 5ca6550b-c211-d11f-0236-82a9572e2485 192.168.110.133:8300 follower true 3
agent3 10e1b43d-9393-6985-242b-8e31411839c5 192.168.110.137:8300 follower true 3
它将通过执行“consul info”命令在 consul 组中列出结果 在此处输入图像描述
Consul 使用 RAFT 共识算法。下面的这个链接可以帮助你直观地理解 raft 是如何工作的(这也显示了一个成员是如何一步步被选为领导者的)。
http://thesecretlivesofdata.com/raft/
参考来自官方领事文档:https ://www.consul.io/docs/internals/consensus.html