假设有 5 台服务器编号 1 到 5,编号 1 的服务器是 leader,其他(也就是编号 2 到 5 的四台)都是 follower。
在 term 1 的某一时刻 leader 已提交了截至 index 为 100 及之前的所有日志(即 leader 的 commitIndex=100 ),此时 leader 向四个 follower 通过 AppendEntries 成功发送了 index 为 105 及之前的所有日志,这些 AppendEntries 里的 leaderCommit 跟 leader 上的 commitIndex 保持一致也就是 100,发送完毕后 leader 立刻 fail。
四台 follower 收到 AppendEntries 后将截至 index 为 105 前的所有日志都添加到 log[]中,但因为收到的 leaderCommit 是 100,所以只会将 index 100 及之前的日志应用到状态机。因为之前的 leader server 1 挂掉不再发送心跳,所以另外四台服务器超时后发起选举,就假设 server 2 被选成 term 2 的 leader,其余四台成为 follower。
因为各台 server 的 log[]里都有 index 为 105 及之前的日志,leader 的 matchIndex[]会通过 AppendEntries 很快更新到全部都是 105 的状态,尽管此时 matchIndex[]里的多数(这个例子是全部)都是 105,但因为 leader 的 log[]中 index 为 105 和之前的日志 term 是 1 而不是当前 term 2,所以包括 101-105 这几条日志并不会在现在 term 2 的 leader server 2 上被提交,但这些日志又不能被放弃,于是 leader 就卡在这了……
这个过程我一定是哪里想错了,求指点是哪里出了问题。
在 term 1 的某一时刻 leader 已提交了截至 index 为 100 及之前的所有日志(即 leader 的 commitIndex=100 ),此时 leader 向四个 follower 通过 AppendEntries 成功发送了 index 为 105 及之前的所有日志,这些 AppendEntries 里的 leaderCommit 跟 leader 上的 commitIndex 保持一致也就是 100,发送完毕后 leader 立刻 fail。
四台 follower 收到 AppendEntries 后将截至 index 为 105 前的所有日志都添加到 log[]中,但因为收到的 leaderCommit 是 100,所以只会将 index 100 及之前的日志应用到状态机。因为之前的 leader server 1 挂掉不再发送心跳,所以另外四台服务器超时后发起选举,就假设 server 2 被选成 term 2 的 leader,其余四台成为 follower。
因为各台 server 的 log[]里都有 index 为 105 及之前的日志,leader 的 matchIndex[]会通过 AppendEntries 很快更新到全部都是 105 的状态,尽管此时 matchIndex[]里的多数(这个例子是全部)都是 105,但因为 leader 的 log[]中 index 为 105 和之前的日志 term 是 1 而不是当前 term 2,所以包括 101-105 这几条日志并不会在现在 term 2 的 leader server 2 上被提交,但这些日志又不能被放弃,于是 leader 就卡在这了……
这个过程我一定是哪里想错了,求指点是哪里出了问题。