假设一个网络分区发生并且领导者A是少数。Raft将选出一位新的领导人B,但a认为它在一段时间内仍然是领导人我们有两个客户。客户机1将密钥/值对写入B,然后客户机2在a退出之前从a读取密钥因为a仍然相信它是领导者,它将返回陈旧的数据。
原版报纸上说:
第二,领导必须检查是否被罢免
在处理只读请求之前(其信息
如果选出了一位更新的领导人,这可能是陈腐的)。
Raft通过让领导交换心跳来处理这个问题
在响应之前与大多数群集的消息
只读请求。
是不是太贵了?对于每个读取请求,领导者必须与大多数节点进行对话?
最佳答案
对于每个读请求,领导者不必与多数人交谈。相反,当它不断地和它的同龄人一起心跳时,它保持着一种陈旧的衡量标准:它从法定人数那里得到同意已经多久了领导将检查此过时度量并返回一个过时的错误。这使呼叫系统有机会连接到另一台主机。
最好将陈旧性检查推送到呼叫系统;让低级raft系统具有更高的可用性(以CAP为单位),并让呼叫系统决定在什么陈旧性级别进行故障转移这可以通过各种方式来实现。您可以让调用系统心跳到raft系统,但我最喜欢的是在响应中返回陈旧性度量。当客户端在请求中包含它的时间戳,raft服务器在响应中回显它,并且客户端将往返时间添加到raft过时时,最后一个可以改进。(注:Always use the nano clock in measuring time differences因为它不像系统时钟那样倒转。)