leader节点会为每个follower节点维护一个FIFO数据队列,更新数据时往队列中添加
一、已提交的数据不能丢失
节点1为leader
节点2、3、4、5为follower
节点1发起新的事物投票通过后,将事物保持在本地,然后同步给follower们,当节点2、3收到commit指令后,提交事物,4、5尚未收到commit指令,节点1宕机;
此时需要重新选主,因为2、3的txid事物ID比4、5的事物ID大,并且节点3的myid比节点2的大,所以最终节点3成为主节点,4、5向2发送心跳,然后从2处开始同步新的数据,4、5找到3中与自己相同的txid,并且比较此txid下数据是否和3中的一致,如果不一致,删除4、5中此txid下的数据,再递归比较再早的一个txid,直到txid在3中存在,并且该事物下的数据与3中相同,则开始同步3中该txid往后的数据。
二、已丢弃的事物不能再现
节点1为leader
节点2、3、4、5为follower
节点1发起新的事物投票通过后,将事物保持在本地,节点1宕机;其他所有follower节点都没有收到commit指令。
此时5成为leader节点,节点1重起后,成为follower节点,但是数据比5多,数据不一致。
此时节点1取出当前最新的txid,去leader上查找,没有此txid,则丢弃本地的txid,再递归查找上一个txid,不一致就一直丢弃,直到找到与leader上txid一致,并且数据一致;从该txid往后开始同步数据。