5.6 时序与可用性
我们对于Raft
的要求之一就是安全性不依赖于时序(timing):系统不能仅仅因为一些事件发生的比预想的快一些或慢一些就产生错误。然而,可用性(系统可以及时响应客户端的特性)不可避免的要依赖时序。例如,如果消息交换在服务器崩溃时花费更多的时间,Candidate
不会等待太长的时间来赢得选举;没有一个稳定的Leader
,Raft
将无法工作。
Leader
选举是Raft
中对时序要求最关键的地方。Raft
会选出并保持一个稳定的Leader
,只有系统满足下列时序要求(timing requirement):
broadcastTime << electionTimeout << MTBF
在这个不等式中,broadcastTime
是指,一个Server
并行的向集群中的其它Server
发送RPC
,并收到这些Server
的响应的平均时间;electionTimeout
指的就是在5.2节
描述的选举超时时间;MTBF
指的是单个Server
发生故障的间隔时间的平均数。broadcastTime
应该比electionTimeout
小一个数量级,为的是使Leader
能够持续发送心跳信息(heartbeat)来阻止Follower
开始选举;根据已经给出的随机化选举超时时间方法,这个不等式也使得瓜分选票的情况变成不可能。electionTimeout
也要比MTBF
小几个数量级,为的是使得系统稳定运行。当Leader
崩溃时,大约会在整个electionTimeout
的时间内不可用;我们希望这种情况仅占全部时间的很小一部分。
broadcastTime
和MTBF
是由系统决定的属性,但electionTimeout
是我们必须做出选择的。Raft
的RPC
需要接收方将信息持久化保存到稳定的存储中,所以广播时间大约是0.5毫秒到20毫秒,这取决于存储技术。因此,electionTimeout
一般在10ms到500ms之间。大多数Server
的MTBF
都在几个月甚至更长,很容易满足这个时序需求。