zhangyixin1222 commented on issue #2056: URL: https://github.com/apache/rocketmq/issues/2056#issuecomment-636459458
> > raft协议中leader履行职责中在广播日志提议后如果收到了多数响应会发出提交指令的,并向客户端反馈结果 > > raft 里leader 的提议是指什么嘞? 是指把某个entry复制到其他节点上吗? 因为raft里并没有像paxos明确提出proposal的概念,所以我不太清楚“广播日志提议” 是不是指向其他节点发送 > AppendEntries。 > > 我是这么理解raft的commit 的:commit完成的标志应该是:如果一条log具有和leader相同的term且被复制到大多数节点上,那么在复制到大多数节点上这个行为完成的瞬间,这条log及其之前的所有log实质上就已经commit了。raft原论文中并没有明确 commit这样一个RPC call,只是在每次leader 向其他节点发送appendEntry或者心跳包(空的appendEntry)的时候,会携带上leader 的commitIndex,其他节点根据这个commitIndex来“学习”最新的commitIndex 的值。但是这个commitIndex的作用仅仅是通知。commitIndex 可能比实际已经commit的log Index要小,但是绝对能保证commitIndex及其之前的log全都已经commit了。 > > > 结点7如果快了一拍,在结点234中任意一个结点收到结点1提议消息之前收到选票也是会获取leader资格的(这仅会使的结点1发现提议不收认可自动切换到寻找leader状态),该情况下结点7就进入leader状态。 > > “在结点234中任意一个结点收到结点1提议消息之前”,我认为可以改成“在节点234 任意一个节点复制了某个结点1 的term = 6 的log之前”,这样可能能消除部分歧义。 > > > 新选leader会将新term的空日志跟所知的旧term记录日志一次性提议保障不落下之前的有效提议(即已提交的或多数认可的提议)。 > > 已提交和多数认可的协议,可以问一下这两个区别在哪里嘛~ > > > 退化为follower在于自身已经感知到自身所持日志纪录并非最新,在因为未获得最新选举term不必要进入follower。 > > 对不起这句话后半句我没有完全理解,可以更详细的解释一下后面一句嘛~ > > 非常感谢~ commitindex作用就是提交指令,只是附加了心跳功能。对部分结点的commitindex确实会小于日志索引,但对多数是相等的,因为具有appendentry请求加持。其实raft的appendentry作用就是zk的proposal,commitindex对多数结点来说作用相当于是zk的commit作用。 你的表述更准确。 ---------------------------------------------------------------- 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: [email protected]
