一致性协议与Raft算法

北城以北 提交于 2021-01-29 05:36:00

CAP理论

CAP理论作为分布式系统的基础理论,它描述的是一个分布式系统在以下三个特性中:

  • 一致性(Consistency)
  • 可用性(Availability)
  • 分区容错性(Partition tolerance)

对于一个分布式系统来说,上述三个特性不能同时兼得,分为CP和AP的系统。例如银行必须是CP。

一致性协议

分为两种:

  1. 弱一致性(最终一致性)
  2. 强一致性

弱一致性,也称为最终一致性,也就是说各个节点不会立即保证系统同步,属于AP范畴,典型的应用如DNS域名解析服务。

强一致性,表示各个节点的数据必须保持一致,属于CP,典型的应用有Zookeeper。

通常所说的一致性协议算法,指的其实就是强一致性算法,这些算法都是由Lamport提出的Paxos算法演变出来。Paxos算法有三个变种,base paxos,multi paxos和fast paxos。其他一致性算法又是由multi paxos的简化版演变而来,主要RaftZAB

强一致性协议的内容

强一致性协议主要包括的内容可以概括为:

  1. 选主机制

  2. 数据一致性

    1)写数据

    2)提交数据

  3. saft容错策略

Paxos

Paxos本身只是一个理论,并没有落地实现,paxos协议中,存在较多的角色,包括议案发起人,议员和记录员等。

base paxos,是通过议案编号大小来进行的,当一个编号较大的议案被提出,议员就会抛弃正在处理的小编号议案,有多个议案发起人,这就会造成"活锁",人话就是,会有不停的议案被提出,导致没有一个议案被处理,可以使用计时器解决,被挤掉的议案必须等待一定时间后才能再发起议案。

mutil paxos改进了base paxos,只允许有一个议案发起人,简化后,产生一个议员既是议案发起人也是议员本身,Raft算法就是由简化后的mutil paxos算法演变的。

Raft

使用了Raft算法保证CP强一致性的应用有服务发现框架consulNacosk8s等。

Nacos同时实现了CP和AP。

一个集群中,各个节点可以充当一下角色:

  1. Candidate,集群或其中一个分区中没有Leader,则发起选主的节点称为Candidate,从Follower变成Candidate。
  2. Follower,只能根据Leader的命令进行写入和提交操作。
  3. Leader,负责接收写请求,并发给其他Follower,保证数据一致。

1.选主过程

  1. 集群初始状态下,没有Leader,各节点为Follower,并等待一个随机的时间,先超时的节点成为Candidate,假设为A,发起投票,内容是A要成为Leader,其他节点收到请求,并同意,A收到响应后,如果收到响应的数量为包括自己在内的节点占多数,则A节点成为Leader,并且各节点标志任期Term为1(以后每次产生Leader,Term+1)。

要保证集群中数据的一致性,必须要保证大多数节点有相同的共识。 节点设置为奇数的原因是,保证选主和数据一致性(数据响应时多数派才能提交数据)。

  1. A成为Leader后,定时向各个Follower发送心跳,证明自己是Leader。

    1)如果Follower收到心跳或收到同步数据请求,就会重新刷新计时器

    2)如果Follower长时间没有收到心跳,超时后,自己成为Candidate,向其他节点发起投票想成为Leader

平票

选主过程中,如果两个节点成为Candidate,并发起投票,选票多的成为Leader,不影响。

如果两个节点的选票一样,则两个Candidate都会等待一个随机的Timeout后,重新发起选举。

2.数据一致性

集群中任何一个节点收到的所有写请求都要经过Leader节点,转发给各个Follower节点,Follower写入数据并响应,如果包括Leader在内的所有响应数量占多数派,Leader会在发送Commit,让多数派提交刚刚写入的数据。

3.saft容错策略

假设有5个集群节点,当网络状态不好时,产生2个分区,假设3个节点为一组的分区P12个节点为一组的分区P2,分区内节点能通信。

此时。

  1. 如果Leader所在的分区为P1多数派,则客户请求到这个分区的业务可以正常处理。而分区P2都为Follower,则会发起选主,但是,因为选票最大为2,达不到大多数,因此P2分区无法产生Leader,所有写请求不会被处理
  2. 如果Leader所在分区为P2少数派,那么P1分区内的节点发起选主,可以达到占多数3,因此,可以产生一个Leader,任期Term为原来的+1。此时,P1收到的请求可以正常处理。P2收到的写请求,Leader会转发给Follower写入,但是Leader收到Follower的响应不占大多数,因此Leader不会给Follower发送commit请求

上述情况,当网络恢复时,集群又成为一个节点,则所有节点会选择任期Term大的Leader作为现任Leader,并且与Leader数据保持一致,如果旧Leader存在未提交的数据将丢弃。

原理动画解释 http://thesecretlivesofdata.com/raft/

场景测试 https://raft.github.io/

ZAB

ZAB是Zookeeper所使用的强一致性算法。

与Raft类似。

参考bilibili视频 一致性算法(Paxos、Raft、ZAB)

转载请注明出处 一致性协议与Raft算法

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!