分布式架构服务-Consul

一、介绍
Consul是基于GO语言开发的开源工具,主要面向分布式,服务化的系统提供服务注册、服务发现和配置管理的功能。Consul的功能都很实用,其中包括:服务注册/发现、健康检查、Key/Value存储、多数据中心和分布式一致性保证等特性。Consul本身只是一个二进制的可执行文件,所以安装和部署都非常简单,只需要从官网下载后,在执行对应的启动脚本即可。
consul的主要作用是服务的注册和发现。
 
二、基础特性
1、数据强一致性保证
Consul采用了一致性算法Raft来保证服务列表数据在数据中心中各Server下的强一致性,这样能保证同一个数据中心下不管某一台Server Down了,请求从其他Server中同样也能获取的最新的服务列表数据。数据强一致性带来的副作用是当数据在同步或者Server在选举Leader过程中,会出现集群不可用。

2、多数据中心
Consul支持多数据中心(Data Center),多个数据中心之间通过Gossip协议进行数据同步。多数据中心的好处是当某个数据中心出现故障时,其他数据中心可以继续提供服务,提升了可用性。

3、健康检查
Consul支持基本硬件资源方面的检查,如:CPU、内存、硬盘等

4、Key/Value存储
Consul支持Key/Value存储功能,可以将Consul作为配置中心使用,可以将一些公共配置信息配置到Consul,然后通过Consul提供的 HTTP API来获取对应Key的Value。
 
三、consul工作原理
官网上有一张图,这张图比较形象的描绘了其工作原理:
注意:节点就是指的上面的任意一个小方块。我们链接任何一个节点的IP都可以进行数据操作,比如链接到client1节点的ip和端口,然后就可以“注册服务”、“读写K-V对”等。consul的强一致性会保证我们的数据会同步到其他‘服务节点’下。

首先Consul支持多数据中心,在上图中有两个DataCenter,他们通过Internet互联,同时请注意为了提高通信效率,只有Server节点才加入跨数据中心的通信。

在单个数据中心中,Consul分为Client和Server两种节点(所有的节点也被称为Agent),Server节点保存数据,Client负责健康检查及转发数据请求到Server;Server节点有一个Leader和多个Follower,Leader节点会将数据同步到Follower,Server的数量推荐是3个或者5个,在Leader挂掉的时候会启动选举机制产生一个新的Leader。

集群内的Consul节点通过gossip协议(流言协议)维护成员关系,也就是说某个节点了解集群内现在还有哪些节点,这些节点是Client还是Server。单个数据中心的流言协议同时使用TCP和UDP通信,并且都使用8301端口。跨数据中心的流言协议也同时使用TCP和UDP通信,端口使用8302。

集群内数据的读写请求既可以直接发到Server,也可以通过Client使用RPC转发到Server,请求最终会到达Leader节点,在允许数据轻微陈旧的情况下,读请求也可以在普通的Server节点完成,集群内数据的读写和复制都是通过TCP的8300端口完成。

 
四、zookeeper和consul比较
1、部署方面:zookeeper一般部署奇数个节点方便做简单多数的选举机制。consul部署的时候分server节点和client节点(通过不同的启动参数区分),server节点做leader选举和数据一致性维护,client节点部署在服务机器上,作为服务程序访问consul的接口。

2、一致性协议:zookeeper使用自定义的zab协议,consul的一致性协议采用更流行的Raft。

3、多数据中心:zookeeper不支持多数据中心,consul可以跨机房支持多数据中心部署,有效避免了单数据中心故障不能访问的情况。

4、链接方式上:zookeeper client api和服务器保持长连接,需要服务程序自行管理和维护链接有效性,服务程序注册回调函数处理zookeeper事件,并自己维护在zookeeper上建立的目录结构有效性(如临时节点维护);consul 采用DNS或者http获取服务信息,没有主动通知,需要自己轮训获取。

5、工具方面:zookeeper自带一个cli_mt工具,可以通过命令行登录zookeeper服务器,手动管理目录结构。consul自带一个Web UI管理系统, 可以通过参数启动并在浏览器中直接查看信息。
 
6、服务健康检查:consul可以检查服务状态、内存,硬盘。zk的临时节点只是保持一个会话(长)链接。
 
7、cap方面:consul支持ca,zk支持cp。(cap介绍如下)
C:Consistency,一致性,数据一致更新,所有数据变动都是同步的。 
A:Availability,可用性,系统具有好的响应性能。 
P:Partition tolerance,分区容错性。以实际效果而言,分区相当于对通信的时限要求。系统如果不能在时限内达成数据一致性,就意味着发生了分区的情况,必须就当前操作在C和A之间做出选择,也就是说无论任何消息丢失,系统都可用。
8、监听机制:consul 全量/支持long polling,zk支持监听。
 
9、自身监控:consul是metrics,zk无。
 
10、安全方面:都是acl。
 
11、多语言集成:二者基本都支持主流开发语言。
 
12、springcloud集成:二者基本都支持。
 
 
 
五、核心agent组件
Agent是一个独立的程序,通过守护进程的方式,运行在consul集群中的每个节点上。每个Consul agent维护它自己的服务集合以及检查注册和健康信息。agent负责执行自己的健康检查和更新本地状态其中,Agent 根据节点的性质,分为: Agent Server 和 Agent Client

Agent Client:client将 HTTP 和 DNS 接口请求转发给局域网内的服务端集群。

Agent Server:server 保存client的注册信息,集群的配置信息, 维护集群高可用, 在局域网内与本地客户端通讯, 通过广域网与其它数据中心通讯。 每个数据中心的 server 数量推荐为 3 个或是 5 个,通过 Raft 算法来保证一致性。
 
 
六、应用(服务注册/发现)
为什么微服务架构下就需要做服务注册和服务发现呢?微服务的目标就是要将原来大一统的系统架构,拆分成细粒度的按功能职责分成的小系统,这样就会出现很多小的系统,部署的节点也会随之增加。试想一下,如果没有一个统一的服务组件来管理各系统间的列表,微服务架构是很难落地实现的。Consul提供的服务注册/发现功能在数据强一致性和分区容错性上都有非常好的保证,但在集群可用性下就会稍微差一些(相比Euerka来说)。consul服务发现原理如图:
 
 

首先需要有一个正常的Consul集群,有Server,有Leader。这里在服务器Server1、Server2、Server3上分别部署了Consul Server,假设他们选举了Server2上的Consul Server节点为Leader。这些服务器上最好只部署Consul程序,以尽量维护Consul Server的稳定。

然后在服务器Server4和Server5上通过Consul Client分别注册Service A、B、C,这里每个Service分别部署在了两个服务器上,这样可以避免Service的单点问题。服务注册到Consul可以通过HTTP API(8500端口)的方式,也可以通过Consul配置文件的方式。Consul Client可以认为是无状态的,它将注册信息通过RPC转发到Consul Server,服务信息保存在Server的各个节点中,并且通过Raft实现了强一致性。

最后在服务器Server6中Program D需要访问Service B,这时候Program D首先访问本机Consul Client提供的HTTP API,本机Client会将请求转发到Consul Server,Consul Server查询到Service B当前的信息返回,最终Program D拿到了Service B的所有部署的IP和端口,然后就可以选择Service B的其中一个部署并向其发起请求了。如果服务发现采用的是DNS方式,则Program D中直接使用Service B的服务发现域名,域名解析请求首先到达本机DNS代理,然后转发到本机Consul Client,本机Client会将请求转发到Consul Server,Consul Server查询到Service B当前的信息返回,最终Program D拿到了Service B的某个部署的IP和端口。

 

七、Consul命令行

Consul使用命令行非常容易操作,我们可以通过命令consul进行命令行申请。然后接着使用agent或者member之类的子命令。只要运行不带参数的consul命令就可以查看命令列表。

$ consul
usage: consul [--version] [--help] <command> [<args>]

Available commands are:
    agent          Runs a Consul agent
    configtest     Validate config file
    event          Fire a new event
    exec           Executes a command on Consul nodes
    force-leave    Forces a member of the cluster to enter the "left" state
    info           Provides debugging information for operators
    join           Tell Consul agent to join cluster
    keygen         Generates a new encryption key
    keyring        Manages gossip layer encryption keys
    kv             Interact with the KV store
    leave          Gracefully leaves the Consul cluster and shuts down
    lock           Execute a command holding a lock
    maint          Controls node or service maintenance mode
    members        Lists the members of a Consul cluster
    monitor        Stream logs from a Consul agent
    operator       Provides cluster-level tools for Consul operators
    reload         Triggers the agent to reload configuration files
    rtt            Estimates network round trip time between nodes
    version        Prints the Consul version
    watch          Watch for changes in Consul

想要获得的顶的命令的帮助,可以使用-h获取帮助,如下:

$ consul join -h
  • agent

Agent是Consul的核心,用来运行代理者,维护成员的信息,运行检测,处理查询信息等。

  • catalog

该命令用来接Consul目录进行交互。

consul catalog
  • 列出数据中心
consul catalog datacenters
  • 列出节点
consul catalog nodes
  • 列出所有提供服务的节点
consul catalog nodes -service=redis
  • 列出所有的服务器
consul catalog services
  • Event
consul event

event提供了一种将自定义用户事件触发到整个数据中心的机制,这些事件对Consul是不透明的,但它们可用于构建脚本基础架构,以进行自动部署,重新启动服务或执行任何其他编排操作。Event可以通过使用watch来处理。event的传播是通过流言传播协议的。

  • info
consul info

info命令提供了对运算符有用的各种调试信息。根据代理是客户端还是服务器,将返回不同的子系统信息。

  • join
consul join

join命令让Consul代理加入一个现有集群,新的Consul代理必须与集群的至少一个现有成员共同参与现有的集群。加入该成员后,流言层接管,跨集群传播更新成员的资格状态。如果没有加入现有的集群,则代理是自己的孤立集群的一部分,其他节点可以加入。

代理可以加入其它的代理。如果已经是集群的一部分的节点加入了另一个节点,则两个节点的集群将加入成为一个集群。

  • Keygen
consul keygen

keygen命令生成可用于Consul代理流量加密的加密秘钥。

  • Keyring
consul keyring

keyring命令用于检查和修改Consul的流言池中使用的加密密钥。

  • Lock

lock命令提供了简单分布式锁定的机制。在KV存储中的给定前缀创建锁(或信号量),只有当被保持时,才会调用子进程。如果锁丢失或通信中断,则子进程终止。锁定器的数量可以使用-n标志进行配置。默认情况下,允许单个持有人,并且使用锁来进行互斥。这使用leader选举算法。

  • member

menber命令输出Consul代理人知道的当前成员名单及其状态。节点的状态只能是“alive”,“left”或“failed”。

  • Monitor

monitor命令用于连接和跟踪正在运行的Consul代理的日志。Monitor将显示最近的日志,然后继续遵循日志,不会退出直到中断或直到远程代理退出。

  • reload

reload命令触发代理程序重新加载配置文件。

  • Snapshot

snapshot命令具有用于保存,恢复和检查Consul服务器的状态用于容灾恢复的子命令。这些是原子的时间点快照,其中包括键值条目,服务目录,准备好的查询,会话和ACL。 Consul 0.7.1及更高版本中提供此命令。

  • Agent

Consul的Agent是Consul的核心。Agent维护成员的信息,注册服务,运行检测,响应查询。Agent必须作为Consul集群的一部分的每个节点上运行。任何代理可以以两种模式之一运行:客户端或者服务器。服务器节点承担了协商一致性的功能。这些节点参与了Raft,并在故障下提供了强大的一致性和可用性。服务器节点负担越来越大意味着需要在专用的实例上运行——他们比客户端节点更为资源密集。客户端节点构成了大多数的集群,并且它们很轻量,因为它们大多数操作的是服务器节点接口,维护自己状态的时间很少。

官网:Consul官网

添加评论

Loading