领事 - 建筑


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

建筑学

正如我们所观察到的,有三个不同的服务器,由 Consul 管理。工作架构通过使用 raft 算法来工作,这有助于我们从三个不同的服务器中选出一个领导者。然后根据FollowerLeader等标签对这些服务器进行标记。顾名思义,追随者负责遵循领导者的决定。所有这三个服务器都进一步相互连接以进行任何通信。

每个服务器都使用 RPC 的概念与自己的客户端进行交互。由于下面提到的Gossip 协议,客户端之间的通信是可能的。可以使用 TCP 或八卦通信方法来实现与互联网设施的通信。此通信与三个服务器中的任何一个直接联系。

筏算法

Raft 是一种用于管理复制日志的共识算法。它依赖于CAP 定理的原理,该定理指出,在存在网络分区的情况下,必须在一致性和可用性之间进行选择。CAP 定理的三个基本原理并非在任何给定时间点都能实现。人们最多只能在其中任何两个之间进行权衡。

一个Raft 集群包含多个服务器,通常数量为奇数。例如,如果我们有五台服务器,它将允许系统容忍两次故障。在任何给定时间,每个服务器都处于三种状态之一:Leader 、 FollowerCandidate。在正常操作中,只有一个领导者,所有其他服务器都是追随者。这些追随者处于被动状态,即他们自己不发出任何要求,而只是回应领导人和候选人的要求。

下图描述了 raft 算法工作的工作流程模型 -

筏算法

关键值数据

从Consul的0.7.1版本开始,引入了单独的键值数据。KV 命令用于通过命令行与 Consul 的键值存储进行交互。它公开了用于从存储中插入、更新、读取删除的顶级命令。为了获取键/值对象存储,我们调用 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 - 在键/值条目上获取新锁时创建的索引号

  • 标志- 应用程序可以使用它来设置自定义值。

  • - 它是最大 512kb 的字节数组。

  • 会话- 可以在创建会话对象后设置。

协议类型

Consul 有两种类型的协议,称为 -

  • 共识协议和
  • 八卦协议

现在让我们详细了解它们。

共识协议

Consul 使用共识协议来提供 CAP 定理所描述的一致性。该协议基于 Raft 算法。在实现共识协议时,使用 Raft 算法,Raft 节点始终处于三种状态中的任意一种:Follower、Candidate 或 Leader。

八卦协议

八卦协议可用于管理成员资格、跨集群发送和接收消息。在consul中,gossip协议的使用有两种方式,WAN(无线局域网)和LAN(局域网)。有三个已知的库,它们可以实现 Gossip 算法来发现对等网络中的节点 -

  • teknek-gossip - 它与 UDP 一起使用,并用 Java 编写。

  • gossip-python - 它利用 TCP 堆栈,也可以通过构建的网络共享数据。

  • Smudge - 它是用 Go 编写的,使用 UDP 来交换状态信息。

八卦协议还被用于实现和维护分布式数据库的一致性或与其他类型的数据处于一致状态、计算未知大小的网络中的节点数量、稳健地传播新闻、组织节点等。

远程过程调用

RPC 可以表示为“远程过程调用”的缩写形式。它是一个程序用来向另一个程序请求服务的协议。该协议可以位于网络上的另一台计算机中,而无需确认网络详细信息。

在 Consul 中使用 RPC 的真正好处在于,它可以帮助我们避免大多数发现服务工具前一段时间都存在的延迟问题。在 RPC 之前,Consul 过去只有基于TCPUDP的连接,这对于大多数系统来说都很好,但对于分布式系统则不然。RPC 通过减少数据包信息从一个地方传输到另一个地方的时间来解决此类问题。在这一领域,如果人们希望观察基准测试并比较性能,Google 的GRPC是一个值得期待的好工具。