你看到的都是很多一大抄的文章,很多细节都是错误的,误导你了,看这篇吧:
https://www.cnblogs.com/fanguangdexiaoyuer/p/10311228.html#_label3
首先:这2个要求的理解,网上大部分文章都是错误的
在ZAB协议崩溃恢复要求满足如下2个要求:
1. 确保已经被leader提交的proposal必须最终被所有的follower服务器提交。
这个“已经被leader提交的proposal”的理解,网上的文章是错的:
网上的错误理解:
只要leader发出了commit这个命令才算提交(不论是leader自己commit,还是发送commit给follower)
正确理解:
只要leader提出的proposal被过半的节点接收到(包含了leader自己),那么就算是被leader提交成功了(不论leader有没发出commit命令),如果leader根本没发出commit命令就挂了,那么后续被选举的新leader(zxid最大的那个),会首先判断自身未Commit的消息是否存在于大多数服务器中从而决定是否要将其Commit。
2. 确保丢弃已经被leader提出的但是没有被提交的proposal。
这个“已经被leader提出的但是没有被提交的proposal”的理解,网上的文章也是错的:
网上的错误理解:
leader提出proposal后就挂了,follower没收到proposal,意思是只在leader上生成了proposal,但是follower上没有,才算是“已经被leader提出的但是没有被提交的proposal”
正确理解:
只要leader提出的proposal没有被过半的节点接收到,那么就可以被认为是“已经被leader提出的但是没有被提交的proposal”
其次:“新选举出来的leader不能包含未提交的proposal,即新选举的leader必须都是已经提交了的proposal的follower服务器节点”,这个也是网上文章误导;
选举leader根本没有这个要求,纯属误人子弟,只要选出最大的zxid作为leader即可。