译文
我们的故障模型是带状态恢复的崩溃模式。我们没有依赖同步时钟,但是我们假设服务对时间的感知是一致的(we do assume that servers preceive time pass at approximately the same rate)。组成ZAB的进程是有持久化的状态的(即可以把状态持久化到磁盘),所以当进程重启或者失败重启的时候可以通过持久化状态进行恢复。 这就意味着一个进程自身是有状态的,并且这个状态是有可能部分失效的。比如缺失了部分最近的事务或者更严重的,这个进程中包含了已经失效的进程。
我们需要考虑f个机器故障,并且要去考虑故障恢复,比如电源中断。 从这些故障中正常恢复,我们需要保证在交付(delivered)之前, 信息已经存到了大数据机器的磁盘上(已经持久化了)。
并且我们假设没有拜占庭错误的,因为我们在内部对错误数据进行了处理。并且我们增加了一些元数据并用他们做正确性校验。并且一旦检测出数据错误,我们就会中止进程。
...
zk相关跳过
...
我们的这种错误实现意味着:当一个服务恢复的时候,它将去读快照并且 重复执行 快照之后所有已经 交付了的事务。所以,恢复期间我们不能保证所以的消息只交付一次。 所以我们依赖幂等保证多次交付的正确性。只要所有事务的顺序都是一致的就OK。 我们需要保证 如果 有序列 a->b
,那么故障恢复之后 a如果被交付,那么b应该也要交付 并且要在a之后。 ···
This is a relaxation of the total order requirement. Specifically, if a is delivered before b and after a failure a is redelivered, b will also be redelivered after a.
网友评论