zhangyixin1222 edited a comment 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作用。 你的表述更准确。 已提交是多数认可的充分非必要条件,多数认可是已提交的必要非充分条件。比如结点1发送的完appendentry指令给123456时候挂了,而且123456都记录了该appenentry时候就属于多数认可但未提交例子。 分布式协议能保证有效请求(即被多数结点接受的请求)绝对纪录一致且绝对不丢失,但对于少数结点接受的请求仅做尽量不丢失(对该问题的探讨网上很多针对于zk的描述都是错误的)。具有candidator资格的结点在选举中未收到反对票情况下能绝对保证自身具有持有的纪录日志是全局最新的,在收到反对票能感知到自身纪录日志存在局部非最新,所以保险起见收到反对票才自动退化为follower更符合实际情况。对于因为选举中存在多数同意但少数不同意(但不是反对,反对是loggedterm延滞引发)则是脑裂引起的没争取到该部分结点认同的leader资格。在自身后续提议appendentry获得多数接受的情况下不会影响全局一致性问题。选举中对raft做改造,对选举投票反馈中修改为同意,不同意(含网络硬件故障引起的不可知),反对三种情况。 另外以上方案隐含的优势是选举中更偏向于结点中通信更快运转更快的结点。 另外可以对raft做进一步改造,类似于投票效力加权功能,让leader倾向存在于部分结点 ---------------------------------------------------------------- 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]
