领事 – 建筑
领事 – 建筑
consul 在一个数据中心工作的架构图可以最好地描述如下 –
正如我们所观察到的,Consul 管理着三个不同的服务器。工作架构通过 using raft 算法工作,这有助于我们从三个不同的服务器中选出领导者。然后根据Follower和Leader等标签对这些服务器进行标记。顾名思义,追随者负责遵循领导者的决定。所有这三个服务器都进一步相互连接以进行任何通信。
每个服务器都使用 RPC 的概念与其自己的客户端进行交互。由于下面提到的八卦协议,客户端之间的通信是可能的。可以使用 TCP 或 gossip 通信方法使与 Internet 设施的通信可用。此通信与三个服务器中的任何一个直接联系。
Raft 算法
Raft 是一种用于管理复制日志的共识算法。它依赖于CAP 定理的原理,该定理指出,在存在网络分区的情况下,必须在一致性和可用性之间做出选择。并非 CAP 定理的所有三个基本原理都可以在任何给定时间点实现。一个人必须在最好的情况下权衡其中的任何两个。
一个Raft Cluster包含多个服务器,通常是奇数。例如,如果我们有五台服务器,它将允许系统容忍两次故障。在任何给定时间,每个服务器都处于以下三种状态之一:Leader、Follower或Candidate。在正常操作中,只有一个领导者,所有其他服务器都是追随者。这些追随者处于被动状态,即他们自己不发出任何请求,而只是响应领导者和候选人的请求。
下图描述了 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 名称。例如 – 站点/1/域。
-
CreateIndex – 首次创建密钥时分配的索引号。
-
ModifyIndex – 上次更新密钥时分配的索引号。
-
LockIndex – 在键/值条目上获取新锁时创建的索引号
-
Flags – 应用程序可以使用它来设置自定义值。
-
Value – 它是一个最大 512kb 的字节数组。
-
会话– 可以在创建会话对象后设置。
协议类型
Consul 中有两种类型的协议,称为 –
- 共识协议和
- 八卦协议
现在让我们详细了解它们。
共识协议
Consul 使用共识协议来提供 CAP 定理所描述的一致性。该协议基于 Raft 算法。在实现共识协议时,使用 Raft 算法,其中 raft 节点始终处于以下三种状态中的任何一种:跟随者、候选者或领导者。
八卦协议
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是一个很好的展望工具。