开发者学堂课程【精通 Spring Cloud Alibaba:Raft 生成的随机一样如何处理】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/634/detail/10107
Raft 生成的随机一样如何处理
内容介绍
一、举例
二、随机数有可能一样的情况下如何处理
一、举例
算法是靠谱但可能会存在一些问题:随机数有可能相等
1. 假设有三个节点 nacos 跟随者超时时间为100ms、nacos 跟随者超时时间为100ms、nacos 跟随者超时时间为200ms。
此时,有两个相等的随机数,第一个和第二个节点会同时醒来,而投票者只有一个,只能随机投一个。这种情况实际上是不可能的。
2. 如果三个 nacos 超时时间都一样,当前投票全部作废,重新进入随机生成超时时间。出现这种情况概率很小。
3. 如果有四个 nacos,分别为两个 nacos 跟随者超时时间100ms、两个 nacos 跟随者超时时间150ms,这种情况两个超时时间为100ms 的最先醒来,两个超时时间为150ms 的节点,各投票一个100ms 的节点,这时候就出现 bug了,相当于都1:1,这种情况也全部作废,相当于两个竞选者投票数相同时,这种情况作废。问题产生原因为节点数为偶数。
不建议做成偶数,有可能会死循环的,只要一直没有选举出来 leader,就会不断循环,这种情况还是很常见的。
二、如果随机数有可能一样的情况下如何处理
1. 如果所有的节点的超时随机数都是一样的情况下,当前投票全部作废,重新进入随机生成超时时间。
2. 如果有多个节点生成的随机都是一样的情况下,比较谁的票数最多,谁就是领导。
如果票数完全一样的情况,直接作废,重新进入随机生成超时时间。
建议集群节点为奇数(偶数情况下可能会死循环)