引子
通过思考几个问题来深入理解raft协议
Quorum
Q1:假设我们允许2个错误节点的话,最少需要部署几个节点?为什么4个节点不可以?
假设容忍2个错误,部署4个地方,因为你容忍2个错误,所以至少需要确认3个地方已经记录了一笔交易,我们就假设A B C D四个地方吧,A B C都记录了这笔交易,D也许落后一些,没关系。然后A B发生错误挂掉了,此时没有关系,因为C还保持正确的记录,系统还是可以工作的。过了一会A B都重新起来了,注意这个时候C D需要把记录同步到A和B,但是此时如果C和D都发生错误挂掉了(系统还是容忍两个错误,因为A B已经起来了),A和B拿不到正确的记录,所以整个系统是不能工作的。
所以这个时候我们需要E,并且C D E都必须保持正确的记录,这样即使他们其中的两个挂掉了,我们也可以确保正确的记录不会丢掉,所以容忍两个错误需要5个地方,并且最少有3个地方确认一笔交易就OK。
安全性
Q2:raft的日志复制是单向的(从leader到followers),那么如何保证新选出来的leader拥有所有已经committed的log?
竞选者想要当选leader的话必须联系集群中的大多数节点,以便能获得大多数的选票,那么就意味着这些节点(大多数节点)中必然至少有一个节点拥有最新的已经committed的log。这样只要保证竞选者的log至少和,所有这些节点的每一个log,都up-to-date,那么竞选者肯定就拥有已经committed的所有log。raft通过在投票的过程中限定只有你的log至少比我新,我才投票给你,这样就能达到上述的要求。
工程化
Q3:raft是如何处理线性只读请求的呢?
网友评论