You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@rocketmq.apache.org by GitBox <gi...@apache.org> on 2020/05/30 14:47:09 UTC

[GitHub] [rocketmq] lizhiboo commented on issue #2056: issues and Improvement Strategies in the Raft Protocol Election

lizhiboo commented on issue #2056:
URL: https://github.com/apache/rocketmq/issues/2056#issuecomment-636340722


   > 可以在pre-vote基础上对raft做进一步改进以对选举过程中产生的消耗做相关优化,在pre-vote阶段根据自身接受日志记录的term及日志index作为获取选举资格的凭证,但在每次选举中携带自身【termLoged,indexLogged,termWanted,nodeId】拉取选票,其中termLoged为自身接受日志记录的最新term,indexLodded为自身接受最大term日志记录的最大index,termWanted初始值为termLoged,在每次选举失败后+1,nodeId为自身结点,拉取选票会出现以下几种情况:
   > 【
   > 情况1:其他结点(如结点B)收到选举消息后经过对比发现结点B自身记录的日志term>结点A发送过来的termLoged,则反馈termSmallError异常的反对票.
   > 
   > 情况2:其他结点(如结点B)收到选举消息后发现自身记录日志term小于结点A发送过来的termLogged,或者自身记录日志term=结点A发送过来的termLogged且自身日志index<indexLogged则更新自身记录的termWanted并反馈以赞同票。
   > 
   > 情况3:其他结点(如节点B)发现自身记录日志term与A发过来的termLogged一致且自身日志index=indexLogged,则以跟自身已认可的termWanted与接受到的termWanted进行对比,如果自身已认可的termWanted>=B结点发过来的termWanted,则反馈选举失败(但不为反对票)并在反馈报文中告知自身记录的最大termWanted。
   > 】
   > 
   > 结点A根据获取到的多数反馈或经过一定超时时间后根据不同情况分别做如下策略:
   > 【
   > 情况1:如果结点A获得了多数结点的认可并未获得反对票,则以leader身份并以termWanted作为任期开始执行leader责任(如果任期失败则再次进入leader查找及选主状态)。
   > 
   > 情况2:如果结点A如果未收到反对票也未获得大多数认可时则据反馈的termWanted集合中与自身(termWanted+1)的最大值来变更termWanted并在随机等待后进行下一轮选票拉取。
   > 
   > 情况3:如果收到的投票中存在反对票,结点B会随机等待后再次判断leader是否存在及在无法知晓leader存在后经过pre-vote阶段获取自身候选人资格并判断是否存在新leader,如果不存在新leader则尝试通过pre-vote获取候选人资格并在候选人资格获得后重新发起选举(之所以如此设计是因为当结点B等少数结点是所有结点中唯一持有更大termLogged的结点并在此后因为这系列少数结点故障永久性无法通信);
   > 】
   > 
   > 通过以上方案,避免了每次拉选票之前频繁的pre-vote中候选人资格认证阶段的消耗,并能够在获取到leader存在后及时变更自身状态,也保证了当选的leader确实拥有最新的日志记录,同时避免了出现长时间脑裂的恢复后日志term落后引发的误选及有效日志回滚,也避免了少部分记录有最新日志记录结点(因为某些原因日志未受多数认可而leader故障引发无主)集体永久性宕机后引发的无法选举问题。为了保证特殊情况下的及时获取leader信息日志,仍补充issue中所提到的策略
   
   The standard leader election process in raft is comparing candidate's term, lastLogIndex, lastLogTerm. I think your solution described above modified raft election process. I'm not sure it works or not. Can you describe the whole election process in detail, and prove it ?


----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
users@infra.apache.org