Raft共识 (一)(个人的通俗易懂的见解)

什么是共识算法?

共识算法,顾名思义最主要就是共识,共识在现实生活就经常使用到。比如班级里投票选班长。这个共识就是少数服从多数共识。班主任在投票之前,设定好规则,谁的票数最高,谁就担任班长,所有同学同意了这个规则。

投票开始后,学生A得到的票数最多,说明班上大部分人都认可A当班长,最后按照这个规则,达成了一致性的共识。这个人就成为了班长。共识是按照一定的规则,来达成所有人的一致性。前提是所有人都认可这个规则。

 

为什么需要共识算法?

在互联网的应用开发中,以及服务器运行的过程中,不可避免的会发生一些不可抗力,比如服务器遭到洪水淹没,地震,黑客入侵,断电,以及误操作导致的数据损坏。这个时候就需要多个服务器,来储存相同的数据

假如我有多个服务器,我把我的数据存放到这多个服务器上面,然后每个服务器上的数据一模一样,最笨的办法就是拿U盘拷,一台一台拷贝过去。这样所有服务器上都有我的数据,即使其中一台出现故障或者意外情况,我的数据也可以在其他服务器上找到。但是实际上用U盘拷的方法是很笨的,而且每次我的数据更新一次我就需要重新拷贝一遍,假如2秒钟更新一次。能做到2秒钟拷贝一遍吗?所以后面使用网络传输的方式来保证各个服务器上的数据的一致性。既快而又方便。但是在用网络传输的过程中,遇到上述的数据损坏或者篡改等问题。比如我有5台服务器。其中2台数据遭到了篡改,那么应该怎么办,这时候就需要共识算法了,最简单的共识算法,上面提到的少数服从多数,即以大多数服务器里面的数据为准,这时候2台故障服务器与另外3台正常服务器互相通信,发现我们的数据不一样。这时候他们就会开始投票,对数据进行投票,哪个数据得票最多,就听谁的。结果肯定是另外3台服务器的数据被承认的票数最多。最后他们达成一致,2台故障服务器自动从另外3台服务器中获取正确的数据。

 

共识算法在区块链当中的作用?

在区块链中,区块链的节点就是一个服务器的集群,他们互相通信。并且要保证服务器间数据的一致性可以理解为分布式的数据库。

这时候他们就需要一个共识来达成数据的一致。就像上述最简单的那个例子一样。

共识算法可以影响一个链的 性能,节点数量,安全性,一致性。我个人认为共识算法对链的影响比重很大。

 

Raft共识是什么?

Raft共识算法在分布式系统中是常用的共识算法之一。在Raft中,不容许服务器里有捣蛋的节点。可以容许有一定数量的故障节点。在Raft中它把服务器集群中的服务器进行分工,分为领导者(leader)和(follwer)追随者。在实际应用中,还需要一个(client)客户端,来向服务器传递指令。服务器要处理客户端发来的指令,并为客户端提供相应的服务。在Raft中,所有人都必须听从领导者(leader)的安排,在数据一致性方面,领导者说什么就是什么。追随者(follwer)只需要把自己的数据同步成和领导一样即可。

 raft角色

领导者(leader),追随者(follwer),客户端(client),Candidate(候选人)

Raft是如何选举出领导的呢?

首先,在共识达成之前,所有节点都是追随者(follwer),这个时候,他们每个服务器都准备一个倒计时的计时器。计时时间是随机的。各个节点倒计时到期时间都不一样。然后等到倒计时完毕,最先倒计时完毕的节点服务器在倒计时完毕后变为Candidate(候选人)身份,并向其他节点发送消息,告诉它们我的倒计时时间到了,我想成为领导者(leader),你们同意吗?

这时,当其他节点收到了最先倒计时完毕的Candidate(候选人)发来的消息,就关闭本地的计时器不再计时。同时检查候选人的log日志是否比当前节点的log完整,如果完整则投票给Candidate(候选人)否则不投票。当Candidate(候选人)接收到所有投票后,如果票数大于服务器集群的一半(包括自己投自己的那票),那么就发送消息给其他追随者(follwer),我现在是领导者(leader)了。这时候领导者就产生了。

如果有多个节点计时器同时到期怎么办?

如果多个节点同时倒计时完毕,并且同时获得相同的票数,那么等待若干时间后重新计时选举。在投票过程中,每个节点只能投一次票.

如果领导节点故障了怎么办?

如果领导者退出,那么就开始重新选举,重复上述选举领导者的过程,选举成功后如果原来的领导者重新上线。

老领导者自动变为追随者.同步新领导者的数据。

如果追随者节点故障了怎么办?

当追随者重新连接到网络后,自动从领导者那里接受数据并同步

当出现多个追随者与领导者失去通信,并且失去通信的追随者之间互相又重新选举出领导者怎么办?

当它们重新连接老领导者的时候,如果新领导者的成员数>老领导者的成员数,则老领导者自动变为追随者.否则新领导和它的成员都重新变为老领导者的追随者。

Raft的数据同步过程

当领导者(leader)收到客户端(client)发来的指令,假如客户端需要对领导者账本上的数据进行修改,这时候领导者会把这个指令传递给其他追随者(follwer)节点。追随者(follwer)节点接收到指令后并返回接收成功,当领导者(leader)接收到过半节点接收成功的情况下,再在本地提交该指令,并且告知并请求所有追随者(follwer)执行该指令,追随者(follwer)接受执行指令后验证指令是否合法,如果合法则执行.

如果客户端发送指令给追随者(follwer)节点会怎么办?

如果是追随者(follwer)收到客户端的一笔交易,它会首先发送消息给领导者(leader)节点,领导者(leader)节点再执行上述流程

如果流程有什么错误希望能下方评论留言一下。

这里附上一个更加通俗易懂的动画,帮助你们理解http://www.kailing.pub/raft/index.html

如果有时间下次就写Raft代码分析以及详细流程 。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值