<span>raft算法</span>

#####################

规则:

1)集群中所有节点在任何时刻都只能在leader、follower、candidate这3个状态中;

2)集群中必须有且只有一个领导者,客户端所有的读写请求最终都是发给领导人来处理的。在没有领导人的情况下,集群不对外提供服务。所以领导人选举是首要要解决的问题;

3)集群每进行一次选举就会产生一个单调自增的任期,表明该任期内哪个节点是leader,这样就记录了集群的生命周期内的所有选举结果,任期term是一个全局且连续单调递增的整数,每完成一次选举,term会递增 +1;

4)选举成为leader的规则,决议通过都必需要超过半数节点同意,也就是大多数节点赞成。对于领导人选举来说,就是一个候选人收到了包括它自己在内的超过半数节点的选票。比如一个集群由5台机器组成,一个候选人如果收到除了它自己之外2台机器的选票,那它就可以成功当选,即向上取整:ceil(节点数/2),即大于等于该数即可;

5)被选举成为leader的节点,一定是当前所有可连通的节点中具有最新数据的节点,因此,具有最新数据是成为leader的首要条件。

6)选举超时机制。每个节点的选举超时时间都是一个在150ms到300ms之间的一个随机值。

7)leader的职责:为了保持它的统治地位,要不断的向其他节点发送心跳,告诉他们“我还活着,我还活着,,,,”,不然follower就会过时不候的态度,到了electionTimeout就会跃跃欲试地发起选举干掉你,所以身为leader也是不容易的,时刻准备着被抛弃掉。Leader 节点选举时,最终选出来的 Leader 的 term 任期一定是最大的。

8)follower节点收到心跳请求后,会返回响应,发现原来 Leader 还在,不需要发起选举,同时要重置选举超时时间 electionTimeout,每次收到leader的心跳都会重置一下自己的electionTimeout。每个节点都有 electionTimeout 选举超时时间,用于当 Follower 节点无法收到心跳时,到期发起选举 Leader 的操作。

9)选举超时时间:每个follower在启动后都会随机赋予一个超时时间electionTimeout,follower启动后开始等待,在这个超时时间内,如果没有收到其他的投票请求、心跳请求、日志复制请求,follower进入candidate状态,并开始发起投票,如果这段时间有收到上述请求,则复位等待时间,重新开始等待。

10)每个节点的超时时间electionTimeout 必须大于心跳时间间隔heartbeatTime。 我们建议electionTimeout = 10 * heartbeatTime,以避免不必要的leader切换。比如heartbeatTime=10ms,electionTimeout=50ms

状态变换规则:

1)在一个正常运行中的任期内,集群处于稳定状态,集群中只有两种节点:leader和follower。其中只有一个节点是leader,其余节点均是follower,leader定期并行地向每个follower发送心跳信息,以此表明自己是leader身份和地位,以免follower忘记了他们是follower的身份;

2)当Leader宕机后,集群进入重新选举阶段,只会存在Follower和Candidate,一旦新的Leader被选出,没选上的Candidate就转成Follower;

3)选举超时机制。集群启动后,初始节点状态都是 Follower 状态。如果每次各节点都投票给自己,Leader 会始终无法选出来,这样僵持下去肯定是不行的。所以出现了 electionTimeout 的概念,称为 选举超时时间 每个节点都会有 electionTimeout。一旦发现一轮投票没有结果,集群中各节点自身设置一个 electionTimeout,时间范围在 150ms ~ 300ms 之间的一个随机值。

4)当一个处于follower状态的节点的electionTimeout时间到了,该节点就从follower状态转换为candidate状态,该节点立马给自己投一票,然后并行地向集群中其他两个节点发起选举投票(Http协议或者RPC协议请求都可以),其他节点收到candidate发出的选举请求后,根据自己节点和candidate节点上的任期大小比较而进行投票赞成还是反对。



 

 

 

 

 

 

 #####################

 

####################

全部评论

相关推荐

03-15 14:55
已编辑
门头沟学院 golang
bg:双非学院本&nbsp;ACM银&nbsp;go选手timeline:3.1号开始暑期投递3.7号第二家公司离职顽岩科技&nbsp;ai服务中台方向&nbsp;笔试➕两轮面试,二面挂(钱真的好多😭)厦门纳克希科技&nbsp;搞AI的,一面OC猎豹移动&nbsp;搞AIGC方向&nbsp;一面OC北京七牛云&nbsp;搞AI接口方向&nbsp;一面OC上海古德猫宁&nbsp;搞AIGC方向&nbsp;二面OC上海简文&nbsp;面试撞了直接拒深圳图灵&nbsp;搞AIGC方向一面后无消息懒得问了,面试官当场反馈不错其他小厂没记,通过率80%,小厂杀手😂北京字节&nbsp;具体业务不方便透露也是AIGC后端方向2.28约面&nbsp;(不知道怎么捞的我,我也没在别的地方投过字节简历哇)3.6一面&nbsp;一小时&nbsp;半小时拷打简历(主要是AIGC部分)剩余半小时两个看代码猜结果(经典go问题)➕合并二叉树(秒a,但是造case造了10分钟哈哈)一天后约二面3.12&nbsp;二面,让我挑简历上两个亮点说,主要说的docker容器生命周期管理和raft协议使用二分法优化新任leader上任后与follower同步时间。跟面试官有共鸣,面试官还问我docker底层cpu隔离原理和是否知道虚拟显存。之后一道easy算法,(o1空间解决&nbsp;给定字符串含有{和}是否合法)秒a,之后进阶版如何用10台机加快构建,想五分钟后a出来。面试官以为45分钟面试时间,留了18分钟让我跟他随便聊,后面考了linux&nbsp;top和free的部分数据说什么意思(专业对口了只能说,但是当时没答很好)。因为当时手里有7牛云offer,跟面试官说能否快点面试,马上另外一家时间到了。10分钟后约hr面3.13,上午hr面,下午走完流程offer到手3.14腾讯技术运营约面,想直接拒😂感受:&nbsp;因为有AIGC经验所以特别受AI初创公司青睐,AIGC后端感觉竞争很小(指今年),全是简历拷打,基本没有人问我八股(八股吟唱被打断.jpeg),学的东西比较广的同时也能纵向深挖学习,也运气比较好了哈哈可能出于性格原因,没有走主流Java路线,也没有去主动跟着课写项目,项目都是自己研究和写的哈哈
烤点老白薯:你根本不是典型学院本的那种人,贵了你这能力
查看7道真题和解析
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务