consul简单介绍

Posted by llussy on November 25, 2019

consul介绍

​ Consul是基于GO语言开发的开源工具,主要面向分布式,服务化的系统提供服务注册服务发现配置管理的功能。Consul的功能都很实用,其中包括:服务注册/发现、健康检查、Key/Value存储、多数据中心和分布式一致性保证等特性。Consul本身只是一个二进制的可执行文件,所以安装和部署都非常简单,只需要从官网下载后,在执行对应的启动脚本即可。

​ 目前,主流的服务发现组件有:consul、etcd、zookeeper,其中的区别这里就不展开说明了,有兴趣的可以阅读一下consul官方的介绍: 《Consul vs. ZooKeeper, doozerd, etcd》

consul服务架构和核心概念

下图是consul以数据中心维度的架构图,图中的SERVER是consul服务端高可用集群,CLIENT是consul客户端。consul客户端不保存数据,客户端将接收到的请求转发给响应的Server端。Server之间通过局域网或广域网通信实现数据一致性。每个Server或Client都是一个consul agent,或者说server和client只是agent所扮演的不同角色罢了。

consul-arch

首先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端口完成。

consul 启动命令

consul agent -server -bootstrap-expect 3 -data-dir /data/consul/ -node=s1 -bind=10.21.8.104 -rejoin -config-dir=/etc/consul.d/ -client 0.0.0.0

consul agent -server -bootstrap-expect 3 -data-dir /data/consul/ -node=s2 -bind=10.21.8.105 -join=10.21.8.104 -rejoin -config-dir=/etc/consul.d/ -client 0.0.0.0

consul agent -server -bootstrap-expect 3 -data-dir /data/consul/ -node=s3 -bind=10.21.8.106 -join=10.21.8.104 -rejoin -config-dir=/etc/consul.d/ -client 0.0.0.0

#  后面加上-ui  可以访问ui http://ip:8500/ui

consul agent  -data-dir /data/consul/ -node=c1 -bind=10.21.8.63  -join=10.21.8.104 -rejoin -config-dir=/etc/consul.d/ -client 0.0.0.0

几个重要的参数:

  • server : 定义agent运行在server模式,如果是client模式则不需要添加这个参数
  • bootstrap-expect :datacenter中期望提供的server节点数目,当该值提供的时候,consul一直等到达到指定sever数目的时候才会引导(启动)整个集群,为了测试演示,我们这里使用1
  • bind:该地址用来在集群内部的通讯,集群内的所有节点到地址都必须是可达的,默认是0.0.0.0
  • node:节点在集群中的名称,在一个集群中必须是唯一的,默认是该节点的主机名
  • rejoin:使consul忽略先前的离开,在agent再次启动后仍旧尝试加入集群中。也就是说如果不加入这个参数,当前节点一旦退出,下次重启后是不会自动加入到集群中去的,除非是手动触发 consul join xxxx ,所以为了降低重启后对本身服务的影响,这里统一使用 -rejoin参数。
  • config-dir:配置文件目录,里面文件统一规定是以.json结尾才会被自动加载并读取服务注册信息的
  • client:consul服务侦听地址,处于client mode的Consul agent节点比较简单,无状态,仅仅负责将请求转发给Server agent节点

consul 常用命令

consul members

# consul members
Node  Address           Status  Type    Build  Protocol  DC   Segment
s1    10.21.8.104:8301  alive   server  1.4.0  2         dc1  <all>
s2    10.21.8.105:8301  alive   server  1.4.0  2         dc1  <all>
s3    10.21.8.106:8301  alive   server  1.4.0  2         dc1  <all>
c1    10.21.8.63:8301   alive   client  1.4.0  2         dc1  <default>

consul members -http-addr 10.80.92.147:8500

consul info

consul join 10.21.8.104

curl http://10.21.8.104:8500/v1/status/leader

curl http://10.21.8.104:8500/v1/status/peers

consul reload 使-config-dir=/etc/consul.d/目录中的修改生效

consul kv get api/address

curl -X PUT -d “{"weight":1, "max_fails":2, "fail_timeout":10, "down":1}” http://10.21.8.104:8500/v1/kv/upstreams/ids/10.21.8.104:8080

参考

使用Consul做服务发现的若干姿势

consul集群搭建与Golang服务发现示例

服务发现 - consul 的介绍、部署和使用