raft共识算法
raft是一个管理可复制log的的算法。图2总结了算法的内容,图3列举了算法关键特性。图中的元素会后续逐一介绍。
raft首先选举一个leader,然后给予该leader管理可复制log的责任。leader从clients那接受log入口,将它复制到其他server中,然后告知servers什么时候将log入口应用到它们的状态机中是安全的。拥有一个leader会简化可复制log的管理。例如,leader可以在不咨询其他servers的情况下决定在一个log中设置一个新的入口,同时data以一种简单的方式从leader流向其他servers。leader可以失效或者断连,这样一个新的leader就会被选举。
节点选举:当目前leader失效,新leader产生(5.2节)
log复制:leader必须接受客户的log入口,然后将其复制到集群中,强迫其他logs与它本身形成共识(5.3节)
安全性:图3介绍了主要的状态机器安全特性:如果一个server对其状态机使用了特定的log入口,那么没有其他server可以对同一个log索引应用一个不同的命令。5.4节解释raft如何保证其特性;解决方案对5.2介绍的选举机制加入了额外的限制。
介绍完算法后,本节介绍了可用性问题和系统中时间的作用。
重点来了!!!(先讲state)
状态:
1.server上的持久状态(在响应rpc之前在稳定的存储上更新)
currentTerm:server看到的最新term(初始第一步为0,自动增加)
votedFor:在目前term下,接受投票的选举人id(没有的话就null)
log[]:log入口;每一个入口包含状态机的命令,还有leader收到入口时的term(第一个索引是1)
2.server上的不稳定状态
commitIndex:在已知commit中最大的log入口索引(初始为0,自动增加)
lastApplied:状态机中被应用的最大的log入口索引(初始为0,自动增加)
3.leaders的不稳定状态(选举后重新初始化)
nextindex[]:对每一个server而言,下一个传给该server的log入口索引(初始为leader上一个log索引+1)
matchIndex[]:对每一个server而言,在server中已知的复制的最大的log入口索引(初始为0,自动增加)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)