consul
介绍
consul是有HashiCorp公司推出的开源工具,用于实现分布式系统的服务发现与配置,
consul使用Go语言编写的,因此具有天然可移植性(跨平台)。
特性
- Raft算法
- 服务发现
- 健康检查
- Key/Value存储
- 多数据中心
- 支持http和dns协议接口
- 官方提供web管理界面
consul内部的两种角色
Consul集群: 是由N个Server和M个Client节点组成的
不管是server还是client在consul中统称为agent。
client客户端节点
无状态,将HTTP和DNS接口请求转发给局域网内的 服务端集群
Client节点:使用的client模式,该模式下可以接收服务的注册请求,但是会把请求转发给Server节点,自身不做处理,并且不持久化在本地
server服务端节点
保存配置信息, 高可用集群,每个数据中心的server数量推荐为3个or5个。
Server节点:使用server模式,处理注册请求,将注册信息持久化到本地,用作故障恢复
- Server节点分为Leader和Follower两个身份,Leader负责监控Follower,同步注册信息给所有的Follower,一个集群中只能有一个Leader
- Server之间通过RPC消息通信,Follower不会主动发起RPC请求,只会有Leader或选举时的Candidate主动发起
- Follower节点接收到RPC请求后,会将请求转发给Leader节点,由Leader节点处理后进行相应的ACK,请求分为事务型和非事务型,非事务型的请求由Leader节点直接响应,事务型的请求
- 集群一般推荐3或5个节点比较合适,因为Raft选举时,4和3、5和6的结果是一样的
工作原理
- 生产者 Producer启动之后,会向Consul注册中心发送一个POST请求,上报自己的id、name、ip、port、健康检查接口、心跳频率等信息
- 注册中心consul 接收到Producer上报的信息之后,根据上报的心跳频率和健康检查接口对Producer进行健康检查,检验Producer是否健康
- 生产者 Consumer启动之后,会从Consul拉取Producer的列表缓存在本地,后续的请求都会从本地选举发出,使用RestTemplate发出请求的时候,每次都会从Consul同步一下服务者信息。
Leader选举
可以有多个Server,但是只能有一个Leader,Leader基于Raft算法进行选举,在Leader选举过程中,整个集群都无法对外提供服务。
节点的身份有Follower、Candidate、Leader三种,所有的节点在初始化的时候都为Follower,节点加入到LAN Gossip池后,由Raft协议的Leader-Follower模式进行Leader选举。
- Leader
集群中仅有一个,处理客户端所有的请求,遇到事务型的请求时会在本地处理后再生成同步日志,由Gossip通知到各个Follower节点进行同步
- Follower
所有节点的初始状态,正常集群中可以有多个Follower,不处理任何请求也不发送任何请求,只响应来自Leader和Candidate的请求,当接收到客户端发来的请求时会自动将请求转发给Leader节点处理
- Candidate
Follower超过选举器时都未收到来自Leader的心跳时,自动转换身份为Candidate,并根据Raft算法执行新一轮的Leader选举
- Election Time(选举超时时间)
每一个节点都维护着自己的选举计时器,这个计时器的值需要大于心跳间隔,Follower收到Leader的心跳请求后会重置选举计时器,如果这个计时器归零了,则将节点身份转换为Candidate,并向其他节点发送投票。设置选举计时器主要是为了防止因为网络抖动等问题而引起心跳消息丢失,不然可能一旦心跳丢失了就立刻进入选举
- Heart time(心跳超时时间)
Leader向Follower发送心跳的时间间隔
- Term(任期)
任期是一个全局递增的数字,每进行一次选举,任期数就+1,每个节点都记录该值
Raft算法
Raft是一个共识算法,也就是当大多数对某个事情都赞同的情况下执行该事情,主要为解决分布式一致性的问题。Raft算法是从Paxos的理论演变而来,Raft把问题分解成领导选举、日志复制、安全和成员变化
集群
集群 服务端 节点启动说明:
consul agent -server -bind=192.168.10.101 -client=0.0.0.0 -ui -bootstrap-expert=3 -data-dir=/root/data -node=server-01
-
consul
启动器 -
agent -server
指定角色为 服务端 -
bind
该 服务节点绑定的 机器
该地址用来在集群内部的通讯,集群内的所有节点到地址都必须是可达的,默认是0.0.0.0 -
client
该服务端 允许 那个 客户端 访问,0.0.0.0就是放行所有ip的意思 -
ui
允许web界面 看到 该服务的状态 -
bootstrap-expert
指定集群节点的 数量, 官方建议3 or 5 -
node
指定 该服务节点的名称,在一个集群中必须是唯一的,默认是该节点的主机名 -
config-dir
配置文件目录,里面所有以.json结尾的文件都会被加载
集群 客户端 节点启动说明:
consul agent -client -bind=192.168.10.101 -data-dir=/root/data -node=client-01 -join 192.168.10.101
- join
加入到已有的集群中去
集群搭建
consul join 192.168.10.101
假设要搭建: 一个客户端 和 三个 服务端 的集群,
让 第一第二个服务端的 节点 主机 执行 以上命令, 192.168.10.101则是 第三台节点主机的地址
然后让 客户端 也 执行 以上 命令,
那么 一个客户端 和 三个 服务端 的集群 就 算是搭建好了
查看集群状态
consul members