Consul - 架构
Consul 在一个数据中心工作的架构图可以最好地描述如下 −

我们可以观察到,有三个不同的服务器,它们由 Consul 管理。工作架构通过使用 raft 算法来工作,这有助于我们从三个不同的服务器中选出一个领导者。然后根据 Follower 和 Leader 等标签对这些服务器进行标记。顾名思义,跟随者负责遵循领导者的决定。所有这三个服务器都进一步相互连接以进行任何通信。
每个服务器使用 RPC 概念与其自己的客户端交互。客户端之间的通信是通过下面提到的 Gossip 协议 实现的。可以使用 TCP 或 gossip 通信方法与互联网设施进行通信。此通信与三台服务器中的任何一台直接联系。
Raft 算法
Raft 是一种用于管理复制日志的共识算法。它依赖于 CAP 定理 的原理,该定理指出,在存在网络分区的情况下,必须在一致性和可用性之间进行选择。并非 CAP 定理的所有三个基本原则都可以在任何给定时间点实现。人们必须在其中任意两个之间进行权衡。
Raft 集群包含多个服务器,通常是奇数。例如,如果我们有五台服务器,它将允许系统容忍两次故障。在任何给定时间,每台服务器都处于以下三种状态之一:领导者、跟随者或候选人。在正常运行中,只有一个领导者,所有其他服务器都是跟随者。这些追随者处于被动状态,即他们自己不发出任何请求,而只是响应领导者和候选人的请求。
下图描述了 Raft 算法的工作流模型 −

键值数据
自 Consul 0.7.1 版以来,引入了单独的键值数据。KV 命令用于通过命令行与 Consul 的键值存储进行交互。它公开了用于从存储中插入、更新、读取和删除的顶级命令。为了获取 Key/Value 对象存储,我们调用 consul 客户端可用的 KV 方法 −
kv := consul.KV()
KVPair 结构用于表示单个键/值条目。我们可以在以下程序中查看 Consul KV Pair 的结构。
type KVPair struct { Key string CreateIndex uint64 ModifyIndex uint64 LockIndex uint64 Flags uint64 Value []byte Session string }
这里,上述代码中提到的各种结构可以定义如下 −
Key − 它是一个斜线 URL 名称。例如 – sites/1/domain。
CreateIndex − 首次创建密钥时分配的索引号。
ModifyIndex − 上次更新密钥时分配的索引号。
LockIndex − 在密钥/值条目上获取新锁时创建的索引号
Flags − 它可以由应用程序用来设置自定义值。
Value −它是一个最大 512kb 的字节数组。
Session − 可以在创建会话对象后进行设置。
协议类型
Consul 中有两种类型的协议,称为 −
- 共识协议和
- Gossip 协议
现在让我们详细了解它们。
共识协议
Consul 使用共识协议来提供 CAP 定理所描述的一致性。该协议基于 Raft 算法。在实现共识协议时,使用 Raft 算法,其中 Raft 节点始终处于以下三种状态中的任意一种:追随者、候选人或领导者。
Gossip 协议
Gossip 协议可用于管理成员资格,在集群中发送和接收消息。在 consul 中,Gossip 协议的使用有两种方式,WAN(无线区域网络)和LAN(局域网)。有三个已知库可以实现 Gossip 算法来发现对等网络中的节点 −
teknek-gossip − 它与 UDP 配合使用,用 Java 编写。
gossip-python −它利用 TCP 堆栈,也可以通过构建的网络共享数据。
Smudge − 它是用 Go 编写的,使用 UDP 交换状态信息。
Gossip 协议还用于实现和维护分布式数据库一致性或与其他类型的数据保持一致状态,计算未知大小的网络中节点数,稳健地传播新闻,组织节点等。
远程过程调用
RPC 可以表示为远程过程调用的简称。它是一个程序用来从另一个程序请求服务的协议。此协议可以位于网络上的另一台计算机上,而无需确认网络详细信息。
在 Consul 中使用 RPC 的真正好处在于,它可以帮助我们避免大多数发现服务工具不久前确实存在的延迟问题。在 RPC 出现之前,Consul 仅具有基于 TCP 和 UDP 的连接,这对于大多数系统来说都很好,但对于分布式系统来说却并非如此。RPC 通过减少数据包信息从一个地方传输到另一个地方的时间段来解决此类问题。在这个领域,如果您希望观察基准并比较性能,Google 的 GRPC 是一款值得期待的好工具。