CAP原则
CAP是三个字母的缩小,分别表示可用性、一致性和分区容错性。可用性是说这个分布式系统能够以正常速度响应用户的请求,就像单机环境一样;一致性是说这个分布式系统对数据所有的备份时刻保持一致;分区容错性表示由于通信的一些实际因素,系统无法达到强一致性,即无法保证所有数据备份时刻保持一致。CAP原则是说在分区容错性的约束下,一致性和可用性只能二选一,无法同时实现。对一致性和可用性的一个权衡可以得到BASE,分别表示基本可用、软状态和最终一致性。基本可用是对可用性的要求,软状态表示分布式系统可以有中间状态即可以在某个时刻数据备份并不是完全同步的,最终一致性要求在经过一段时间的同步后所有数据备份是可以达到一致性的。
PBFT算法
PBFT算法是一种分布式一致性算法,更强调一致性。PBFT要求分布式系统中至少有$3f+1$台独立机器,其中$f$是PBFT的最大容错机器数量,这里的容错包括故障节点和恶意节点。
主机接收客户端请求
客户端会向分布式系统的入口主机发送请求,入口主机是通过选举得到的,在分布式系统中是交替担任的。
主机发送Pre-Prepare
主机接收到客户端的请求后,如果确认无误,会向分布式系统的其他机器广播Pre-Prepare消息。
广播Prepare
其他机器接收到主机的Pre-Prepare消息后,如果确认无误,就广播Prepare消息。
广播Commit
分布式系统中所有机器都会接收到若干Prepare消息,如果确认至少有$2f+1$条消息无误,就执行客户端请求,并广播Commit消息。
Reply
分布式系统中所有机器都会接收到若干Commit消息,如果确认至少有$2f+1$条消息无误,就返回ack给客户端,否则执行回滚。
确认执行
客户端如果收到至少$f+1$条ack消息,则说明分布式系统完成响应,否则分布式系统没有完成响应。
算法分析
PBFT算法要求任意时刻都需要有至少$2f+1$个节点是参与上述整个过程的,且恶意节点不能超过$f$。如果中间某个过程出现少于$2f+1$个节点参与,那么客户端的请求会卡在广播Prepare的过程无法顺利继续执行;如果出现超过$f$个恶意节点,则PBFT不能保证正确有效执行。所以,使用PBFT的前提条件是故障节点和恶意节点加起来不能超过$f$,且分布式系统的节点数至少为$3f+1$。