Consul 架构简介

2021-04-30 11:26:37 浏览数 (1)

Consul 架构简介

Consul 是一款不错的服务注册与发现工具。

Consul 架构图:

图片上 datacenter 分成上下两个部分, 但是这两个部分又不是完全隔离的。他们之间通过 WAN GOSSIP 进行报文交互。

单个 datacenter 中, 节点被划分成两种颜色, 红色的 server, 紫色的 client, 他们之间通过 GRPC 进行通信(业务数据), 除此之外, Client 和 Server 之间通过还有一条 LAN Gosssip 进行通信,比如,当 Server 节点增加,或者 down 机后,Client 可以获取对应的 Server列表,去除或者增加 Server 列表。

同一个 Consul agent 程序,启动的时候,通过制定不同的参数来运行 Server 和 Client 模式。也就是说 client 和 server 本质上都是 Client Agent

Server:

  • 参与共识仲裁(raft)
  • 存储机器状态(日志存储)
  • 处理查询
  • 维护周边(LAN/WAN) 节点之间的关系

Client :

  • 负责通过该节点注册到 Consul 微服务的健康检查
  • 将客户端的注册请求和查询转换为 server 的 RPC 请求
  • 维护周边各节点(LAN/WAN) 的关系

Client-Server 模式

架构图:

目前 Consul 的架构全部升级为 client-Server 模式,服务注册不再向 consul-Server进行注册,而是向服务所在机器的 consul-client 进行注册,通过 Consul-Client 将注册信息同步到 Consul-Server 机器中。

纯 Server 模式

Zookeeper 就是这种模,client server 本质上都是 consul 的 agent, 只是角色不同。

纯 server 模式的架构图:

纯 server 模式架构的问题
  • 高可用 服务实例注册时配置的 consul-host 是负载均衡地址,服务注册到集群后,由集群中的一个节点负责对该实例进行健康检查。假如有这样的情况,服务A,服务B,都注册到 Service1 ,也就是由 Service1 对 服务A,服务B 进行健康检查,当 Service1 宕机时,这样会导致 服务A,服务B 在注册列表中消失,导致无法无法访问到,但是其实服务本身没有问题。
  • 服务注销 当服务从注册中心注销时,由于是负载均衡的,可能会导致服务注销失败,因为要在Service1 上注销,有可能负载均衡到 Service2 上进行注销,导致注销失败,解决的办法是遍历集群中所有节点进行注销。
Client-Server 架构呢?
  • 高可用 服务实例向本级别 consul-client 进行注册,如果 consul-client 不可用,只影响 consul-client 所在机器的服务实例,不影响另外一台机器上的实例。
  • 服务注销 服务注销值需要在 consul-client 上进行注销,不需要经过负载均衡。

基于 Client-Server架构服务注册时序图

在这里插入图片描述

服务端口

在这里插入图片描述

实现原理

核心原理在于亮点:

  1. 集群信息之间的高效同步机制,保障拓扑变动与控制信号的及时同步
  2. server 集群内日志存储的强一致性。

他们主要基于两个协议来实现

  • Gossip 协议,在集群内消息传递
  • 使用 raft 协议保障日志的一致性。

参考资料

  • http://ljchen.net/2019/01/04/consul原理解析/
  • https://juejin.cn/post/6844903877842567182

0 人点赞