一、复制状态机
复制状态机(Replicated state machine)的概念就是,相同的初始状态 + 相同的输入 = 相同的结束状态。也就意味在多节点集群中,从相同的初始状态开始,执行相同的一串命令,产生相同的最终状态。
在 raft 中,leader将客户端请求封装成一个一个 log entry 中,将这些 log 发送到 follow 节点,然后大多数的节点按照同样的顺序应用 log entry 中的 command,依据复制状态机的理论,大家最后的状态是会一致的。在分布式场景中,各个节点就是依靠共识算法,保证命令序列的一致,从而始终保持它们的状态一致,从而实现高可用性。
论文提及raft算法的特性有以下几点:
- 安全性保证(绝对不会返回一个错误的结果):在非拜占庭错误情况下,包括网络延迟、分区、丢 包、冗余和乱序等错误都可以保证正确。(这里的拜占庭错误指的是节点的本身就不可靠,变成集群中的恶意节点,它为了阻挠真实信息的传递以及有效一致的达成,会向各个节点发送前后不一致的信息)
- 可用性:集群中只要有大多数的机器可运行并且能够相互通信、和客户端通信,就可以保证可用。 因此,一个典型的包含 5 个节点的集群可以容忍两个节点的失败。服务器被停止就认为是失败。他们当有稳定的存储的时候可以从状态中恢复回来并重新加入集群。
- 不依赖时序来保证一致性:物理时钟错误或者极端的消息延迟只有在最坏情况下才会导致可用性问题。