1.研究分布式一致性算法,我们应该关注分布式一致性算法上,而不是关注paxos和raft,无论这个算法叫A也好叫B也好,我们并不关心这个名字。只是paxos给分布式一致性算法提供了一种思路,这种思路其实是很好理解的,就算是稍微有点逻辑的都绝对能看懂,所以不用觉得这个有多神奇。
2. paxos
看一下paxos能保证的极限,或者说它能保证一致的前提条件,或者说它的边界在哪里,首先paxos是保证2n+1台机器中n台挂了,不影响数据的一致性,但是大于 n+1台挂了,就不能保证数据的一致性了( n+1 台存数据 的全部挂了)。所以paxos并不是神。
3. paxos的具体流程
paxos把分布式进程分成3个角色proposer(发起提案,就是说要提出更新数据了)、acceptor(对于提出的提案判决)、learner(同步已经通过的提案)。当然一个程序可以身兼3职,也就是我是proposer,也是acceptor和learner。 一大家子人一起生活,想要统一思想就要大家都认可才行。简单来说想要更新数据,就要通过大家的认可(也就是n+1个人的认可,总数是2n+1)。想要通过大家的认可,要执行两个步骤:
第一步:proposer(想要更新数据的人),向acceptor发送一个id提案,等待超过 n+1 个acceptor的反馈,当n+1个acceptor回复proposer时,proposer进行第二步操作,这一步的目的是看看大多数的acceptor是不是都在一个级别,如果proposer提议一个id为5的提案,大家的id都在3阶段,大家事务4还没同步呢,大家根本就不理你,等大家都到4了,proposer提5大家说前面的都同步了,5可以通过,这样才能进行下一步。
第二步:proposer看大家都可以接受,然后通知acceptor同步这条更新数据,acceptor自己更新完成之后,依然要回复proposer更新成功,proposer等到收到n+1个acceptor回复更新成功,就认为这个数据更新成功。然后通知所有的节点更新成功(这一步不可或缺)。这个时候就算n台挂了,有一个节点保存数据,这个数据就不会丢。
4.raft
raft在paxos的基础是,限定了只能有一个proposer,也就是只有一个节点能发起提案更新数据。
raft的角色划分:
leader 领导者,接受事务请求,同步数据给follower
follower 追随者,同步数据,接受读请求,转发事务请求到leader
candidate 候选者,为参与选举状态
raft多了一个选举leader的过程,当leader选好之后就变成只有一个proposer的paxos。
5.无论是paxos,还是raft我们只关心一致性算法的思路,核心的东西,事物的本质。
这些一致性算法的本质是在2n+1个进程中,当数据已经同步到n+1台机器中的时候,可以保证在n台进程挂了之后还能保证数据的一致性。好吧,我们已经看到这个算法的边界了。它有它不能保证的。
留一问题:如果你想要保证2n+1台机器中,只要小于2n+1台进程挂了都不会影响数据的一致性,该怎么办呢,相信你已经想到了。