spring cloud consul 概述
*****************
consul 简介
spring cloud可以使用consul作为注册中心和配置中心
使用raft算法来实现分布式一致性,提供了服务发现、健康检查、k/v存储等功能
一个数据中心可配置多个server,形成consul集群(一般为3-5个)实现高可用;
数据中心之间的数据不需要同步,可向另一个数据中心发送数据请求获取数据
*****************
raft 算法
consul用raft算法来实现leader选举、日志复制、健康检测
*************
leader选举
节点状态:leader、candidate、follower
正常情况下,集群中只有leader、follower节点,当leader节点故障后,会触发leader的重新选举,选举过程:
follower有一个倒计时器,计时器到期后状态转变为candidate,选举周期term加1,先给自己投票,再向其他节点发送投票请求,投票请求附带candidate日志数据最后一个节点的term以及index;
其他follower节点接到投票请求后,如果follower最后一个日志数据节点的term<请求term或者term相等、index<=请求index,则可投票,否则拒绝投票;
当candidate得到超过半数投票数后,可转为leader,选主结束,否则进行新一轮的投票,直到选出leader为止
随后,leader定时向follower发送心跳,follower接到心跳后重置倒计时器,保持follower状态
*************
日志复制
日志数据一致性保证
如果日记数据提交了,则该数据之前的所有数据都已经提交
服务器的日志提交记录相同(leader、follower之间有一定延时)
正常写入过程
客户端的写入请求都由leader处理,leader先在本地写入日志,再将数据发送给follower;
follower接到写入请求后,在本地日志写入,写入成功后返回状态给leader,如果写入不成功,leader不断发送请求进行重试;
当半数写入成功后,leader提交数据,同时向客户端发送写入成功状态,并给follower发送提交请求;
故障选主日志同步
如果数据不一致,要先做日志截断再同步数据,然后进行数据复制;
如果数据落后太多,follower要先根据leader发送的数据快照恢复数据,再进行同步
日志压缩:服务器定期将数据快照保存到磁盘,并删除快照时间点前的日志数据
*****************
数据读取
consul提供三种读取数据方式:stale、default、consistent
stale:任何节点都可以响应读请求,客户端可以读取已经提交的数据,有可能读取到过期的数据
default:客户端的读取请求要转发给leader,由leader响应客户端的读请求,客户端读取已经提交的数据,发生网络分区时,有可能会读取到过期的数据
consistent:客户端的读取请求转发给leader,leader在响应客户端的读请求前要先发送心跳,确保是leader服务器才可以返回已提交的数据,牺牲了读取速度,保证了读取的强一致性,可读取到最新的数据、