raft也是很多分布式中间件采用的一种协议,网上找一篇raft文章 Raft协议--中文论文介绍 。这篇文章理解比较费劲,下面就自己的理解整理下raft协议。
1、给follower发送心跳
2、处理写请求
3、发起投票
4、负责写请求
1、当follower、leader心跳超时follower转化为candidate状态
2、投票选举leade
3、candidate有选举和被选举权
1、当follower、leader心跳超时follower转化为candidate状态
2、读请求 - 直接请求路由给主 - 所有读请求给主,选主状态读不可用
3、读请求 - 获取主的数据同步readIndex - 如果follower与leader数据同步状态,则从follower返回读数据,否则等待follower与leader数据同步
4、读请求 - 直接从follower返回数据 - 可能出现脏数据性能最高
leader在同步消息过程类似 二阶段提交过程 ,首先leader接收所有写请求,然后发起投票,当半数的follower投票通过,leader提交事务(commit自己、commit follower),否则leader回滚事务。 消息同步的方式是leader将事务消息日志的readindex顺序告诉follower,follower负责保持日志一致,这样避免同步阻塞,这点不同于zab的思想。
follower找到最大的readIndex提交记编号,然后各个节点找到,彼此日志段之间的差距,然后补充齐缺少日志,思想只同步自己需要的日志。这点和zab的思想不一致,zab是zxid比大小同步差异段,看起来zxid比较简单,但是日志创建过程涉及到顺序锁等其实更复杂。
我看别人写的论文看着太复杂,自己就自己的理解总结下raft协议。raft和zab主流思想一直,但是在角色、消息同步、消息读、崩溃时刻处理方式不一样,比zab实现更简单。