Consul 架构
Consul在一个数据中心工作的架构图如下所示 –
如我们所见,有三个不同的服务器由Consul进行管理。工作架构通过使用raft算法来选举三个不同服务器中的一个作为领导者。然后,根据标签,这些服务器被标记为 跟随者 和 领导者 。如其名所示,跟随者负责跟随领导者的决策。这三个服务器之间进一步通过彼此连接以进行任何通信。
每个服务器使用RPC的概念与其自己的客户端交互。由于下面所提及的 流言协议 ,客户端之间的通信才成为可能。通过TCP或流言协议的通信可以实现与互联网设施的通信。此通信直接与三个服务器中的任何一个进行联系。
Raft算法
Raft是一种用于管理复制日志的一致性算法。它依赖于 CAP定理 的原则,该定理指出在存在网络分区的情况下,必须在一致性和可用性之间进行选择。在任何给定时间,不能同时实现CAP定理的三个基本原则。必须在其中任意两个原则之间做出权衡。
Raft集群 包含多个服务器,通常是奇数个数。例如,如果有五个服务器,它将允许系统容忍两个故障。在任何给定时间,每个服务器处于以下三个状态之一: 领导者,跟随者 或 候选人 。在正常操作中,有且仅有一个领导者,其余所有服务器都是跟随者。这些跟随者处于被动状态,即他们不主动发出请求,而是仅对领导者和候选人的请求进行响应。
下图描述了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名称。例如 – sites/1/domain。
-
CreateIndex − 当键首次创建时分配的索引号。
-
ModifyIndex − 当键最后更新时分配的索引号。
-
LockIndex − 在键/值条目上获得新锁时创建的索引号。
-
Flags − 应用程序可以使用它来设置自定义值。
-
Value − 它是最大512kb的字节数组。
-
Session − 创建会话对象后可以设置它。
协议类型
Consul中有两种类型的协议,分别是−
- 共识协议和
- 八卦协议
现在让我们详细了解它们。
共识协议
共识协议用于提供一致性,正如CAP理论所述。该协议基于Raft算法。在实施共识协议时,始终将Raft节点置于以下三种状态之一:Follower、Candidate或Leader。
八卦协议
八卦协议可用于管理成员资格,在集群中发送和接收消息。在Consul中,八卦协议的使用方式有两种, 广域网 (Wireless Area Network) 和 局域网 (Local Area Network)。已经知道有三个库可以实现八卦算法来发现对等网络中的节点 −
- teknek-gossip − 它使用UDP,用Java编写。
-
gossip-python − 它利用TCP协议栈,也可以通过构建的网络共享数据。
-
Smudge − 它用Go语言编写,并使用UDP交换状态信息。
八卦协议还可用于实现和维护分布式数据库一致性或其他类型的处于一致状态的数据,计算未知大小的网络中的节点数量,稳定地传播新闻,组织节点等。
远程过程调用
远程过程调用(RPC)是远程过程调用的简称。它是一个程序用于请求另一个程序提供服务的协议。该协议可以位于网络上的另一台计算机上,而无需了解网络细节。
使用RPC在Consul中的真正优势在于,它帮助我们避免了大多数服务发现工具在过去存在的延迟问题。在RPC之前,Consul只能使用基于TCP和UDP的连接,这对于大多数系统来说是不错的,但对于分布式系统来说不然。RPC通过减少数据包信息从一处传输到另一处的时间来解决这些问题。在这个领域中,Google的GRPC是一个很好的工具,可以用来观察和比较性能。