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支持多数据中心,在上图中有两个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