raft杂记

ziix 2019-05-14 03:45:31
raft是paxso家族中一员。
paxso的前提是  无作恶节点、存在网络分区, 在此情形下,确保一致性,在过半节点能互通的情况下具有可用性, 在过半节点不可用(死或网络分区)  的情况下 无法产生多数派、或 多数派代理人(主节点)死   导致不可用。



圆区域表示集群中全部节点,蓝色点表示主节点,绿色区域表示当次的多数派,
w1,w2,w3是来自集群外用户的写请求,这是一般正常情况下,raft集群中发生的情况。
在t3时刻后,状态机结果是执行w1 w2 w3序列后的样子。

集群节点数2f+1。这个数目是节省资源的形式,同时也是方便书写。实际上,集群节点数可以是任意的大于2的数目。
确保只有一个写请求序列存在,是一致性协议的目标。
如果可以将集群虚化为一个唯一逻辑节点,则该逻辑节点产生的写请求序列也是唯一的。
多数派就是此逻辑节点,每一个写请求都对应一个多数派。  一次消息传递,回复超过f+1,即为一个多数派。 可见,多数派是变动的。
对多数派的唯一要求是排他性(唯一性),当集群中产生一个多数派时,无法再产生另一个多数派。 上图中圆,切割成任意多块,最多只有一块面积过半。 任意两次切割产生的过半区域必有重叠。
图上红色部分中的节点,通过传播消息,可以知道自己无法形成多数派。集群中每个节点事先知道集群节点总数。raft支持动态增减节点。
主节点仅仅是多数派的一个代理,为了方便向多数派发送写请求。(主节点显然必须要是唯一的,因为多数派是唯一的,多数派的代理必然也被要求唯一)
理论上说,多数派存在,并且可向多数派发写请求,即可用(具有可用性)。多数派不存在,则无法可用。
所以 可用性 需要 多数派存在、且有入口将请求带入多数派。 这个入口在raft中就是主节点:多数派的代理人。 
    如果多数派不存在,则无法可用,必须等到多数派出现才能可用。 但入口死了,可以换一个入口后,依然可用。  这是这两种不可用。
由此可知,主节点并没有特殊性,要求是主节点是唯一的。  快速找出一个唯一节点(主节点),raft用的是多次随机计数器最先到0者(不考虑网络传输差异的话)。

网络传输不可靠, 存储在内存中不可靠,  这两个不可靠对应了两阶段。 ( 写到磁盘可靠,对应完成或叫已提交)
由多数派完成每个阶段(每个阶段落实到多数派中,才算该阶段完成)。  理论上 这两个阶段 可以合成为一个大阶段,但存在只进行完第一阶段的情况,所以就需要回退到第一阶段的动作,更加复杂。  由此可见上面的两个步骤是最小步骤。

请求wi进入主节点(多数派的代理人),主节点为wi发起第一阶段、第二阶段,假设主节点在wi的两个阶段都是活着的,则只要阶段一进入多数派、接着 阶段二进入多数派,写请求w2就完成了。
任意阶段如果由于无法出现多数派,则只能等到多数派出现才能结束。这是牺牲可用性的地方。 多个网络分区 、 过多的死节点 会导致无法出现多数派。
假设 主节点在wi的第一阶段进行中死去,若干次 随机计数器到0后 会再次出现胜出者 (这里只需要能得到唯一节点的办法,并不一定非要这种办法)   约定 胜出者为心主节点,  此种情况下 丢弃wi 无副作用。
假设 主节点在wi的第一阶段完成后 第二阶段进行中 死去, 随后依然会有新主节点出现,此种情况下 丢弃wi 无副作用(实际上短时内可能可以从多数派中捞出wi的阶段一已完成,此时在内存中,并从这里继续。但意义不大)。
假设 主节点在wi的第一阶段完成后 第二阶段完成后 还没有给客户端响应  而死去,随后依然会有新主节点出现,此种情况下 wi已经进入了多数派的磁盘(故wi实际上可以从多数派中捞出来)  , 如果选择丢弃wi 则必须要多数派做回退wi,为了简单,应该选择不动作,以后从wi继续即可。  客户端此次没有收到响应,但实际已经做了wi。客户端后面可以获知此wi成功。

新主节点,实际上仅仅具有唯一性而已,其存储的写请求序列未必是多数派此时存储的序列,所以新主节点在能干活之前 依然要从多数派中捞出多数派存储的写请求序列 。 

上一个多数派持有了最新的写请求序列, 本次的多数派无法剔除上次多数派中所有节点而成为多数派,因此本次多数派中必然拥有上次多数派中的请求序列 (规则是:最新请求序列号(term轮次+请求序号) )  。   
   这里隐含了,本次多数派中每个节点都是诚实的前提(忠诚执行协议内容)。

term号 是对一次不变的主节点 做的编号,  一个主节点正常干活期间 可能产生了多个写请求 , term号 标记的是  处在这些写请求中,  作用是快速比较两个完整写请求序列不同:若term不同,则肯定两个写序列肯定不同。
...全文
29 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

791

社区成员

发帖
与我相关
我的任务
社区描述
区块链技术专区
区块链 技术论坛(原bbs)
社区管理员
  • 区块链技术
  • ccc908
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧