不,不需要日志。leader-follower-candidate 状态机和超时足以让主机知道它的领导者。(在这里试试https://raft.github.io/!)
但是,请注意,领导者在短时间内没有意识到由于网络分区等原因而失去了领导权。
有两种方法可以处理这个问题。
一个。领导者只能在心跳的法定人数最后一次确认后才能在安全窗口内行动。这有问题,如更新所示。
回想一下,有一个名为election_timeout的参数和另一个我称之为hearbeat_timeout的未命名参数。在选举超时之后,领导者永远不应该工作,因为它已经收到了最后一次更新的法定人数减去数据包在网络上传输的时间。
|<- hearbeat_timeout ->|
|<---------------- election_timeout ------------------>|
|<- safety_margin ->|
|<----- safe_time_to_do_work ----->|
乙。When a leader is newly elected, it should wait some time before acting as a leader.
|<----------------- election_timeout ----------------->|
|<- hearbeat_timeout ->|
|<---- safety_margin ---->|
|<-- safe_time_to_do_work -->|
但是,您需要记录在给定时间谁是领导者;在应用程序日志或 raft 本身中。
如果您最终使用了 raft 日志,请确保每个领导者都提交了一些内容,即使它只是一个字符串“主机 XYZ 现在是领导者”,因为 raft 有时需要日志向前移动以提交以前的值。
更新:这一切都有一些重要的微妙之处。有一种情况,一个过时的主机可以很容易地废黜一个领导者。
考虑主机没有收到一些心跳的情况。它的选举计时器用完了,它广播自己是新一代的新候选人。这可能随时发生,并使上述A的安全边际无效。raft 中没有任何东西可以防止这种情况发生,我一直认为这是 raft 的一个缺点。
如果你想保留方案A,你可以修改协议,以便追随者拒绝在他们的心跳范围内出现的选举请求。您还必须确保领导者在某个时候放弃控制权。这将显着减慢故障转移。