spring cloud consul 概述
*********************************************
consul 简介
spring cloud可以使用consul作为注册中心和配置中心
consul使用raft算法来实现分布式一致性,提供了服务发现、健康检查、k/v存储、多数据中心等功能,一个数据中心可配置对个server,形成consul集群(一般为3-5个)防止数据丢失,实现高可用;不同的数据中心数据不需要同步,当需要不同数据中心的数据时,可向另一个数据中心的的server发送数据请求,获取相关数据
*****************************************************
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处理,leader先在本地写入日志,再将数据发送给follower;
follower接到写入请求后,在本地日志写入,写入成功后返回状态给leader,如果写入不成功,leader不断发送请求进行重试;
当半数写入成功后,leader提交数据,同时向客户端发送写入成功状态,并给follower发送提交请求;
故障选主日志复制:如果数据不一致,要先做日志截断再同步数据,然后进行数据复制,如果数据落后太多,follower要先根据leader发送的数据快照恢复数据
日志压缩:服务器定期对数据做快照保存到磁盘,将快照时间点前的日志数据删除
***************************************
数据读取方式
consul提供三种读取数据方式:stale、default、consistent
stale:任何节点都可以响应读请求,客户端可以读取已经提交的数据,有可能读取到过期的数据
default:客户端的读取请求要转发给leader,由leader响应客户端的读请求,客户端读取已经提交的数据,发生网络分区时,有可能会读取到过期的数据
consistent:客户端的读取请求转发给leader,leader在响应客户端的读请求前要先发送心跳。确保是leader服务器才可以返回已提交的数据,牺牲了读取速度,保证了读取的强一致性,可读取到最新的数据