CAP理论
CAP理论作为分布式系统的基础理论,它描述的是一个分布式系统在以下三个特性中:
- 一致性(Consistency)
- 可用性(Availability)
- 分区容错性(Partition tolerance)
对于一个分布式系统来说,上述三个特性不能同时兼得,分为CP和AP的系统。例如银行必须是CP。
一致性协议
分为两种:
- 弱一致性(最终一致性)
- 强一致性
弱一致性,也称为最终一致性,也就是说各个节点不会立即保证系统同步,属于AP范畴,典型的应用如DNS域名解析服务。
强一致性,表示各个节点的数据必须保持一致,属于CP,典型的应用有Zookeeper。
通常所说的一致性协议算法,指的其实就是强一致性算法,这些算法都是由Lamport提出的Paxos算法演变出来。Paxos算法有三个变种,base paxos,multi paxos和fast paxos。其他一致性算法又是由multi paxos的简化版演变而来,主要Raft和ZAB。
强一致性协议的内容
强一致性协议主要包括的内容可以概括为:
-
选主机制
-
数据一致性
1)写数据
2)提交数据
-
saft容错策略
Paxos
Paxos本身只是一个理论,并没有落地实现,paxos协议中,存在较多的角色,包括议案发起人,议员和记录员等。
base paxos,是通过议案编号大小来进行的,当一个编号较大的议案被提出,议员就会抛弃正在处理的小编号议案,有多个议案发起人,这就会造成"活锁",人话就是,会有不停的议案被提出,导致没有一个议案被处理,可以使用计时器解决,被挤掉的议案必须等待一定时间后才能再发起议案。
mutil paxos改进了base paxos,只允许有一个议案发起人,简化后,产生一个议员既是议案发起人也是议员本身,Raft算法就是由简化后的mutil paxos算法演变的。
Raft
使用了Raft算法保证CP强一致性的应用有服务发现框架consul,Nacos和k8s等。
Nacos同时实现了CP和AP。
一个集群中,各个节点可以充当一下角色:
- Candidate,集群或其中一个分区中没有Leader,则发起选主的节点称为Candidate,从Follower变成Candidate。
- Follower,只能根据Leader的命令进行写入和提交操作。
- Leader,负责接收写请求,并发给其他Follower,保证数据一致。
1.选主过程
- 集群初始状态下,没有Leader,各节点为Follower,并等待一个随机的时间,先超时的节点成为Candidate,假设为A,发起投票,内容是A要成为Leader,其他节点收到请求,并同意,A收到响应后,如果收到响应的数量为包括自己在内的节点占多数,则A节点成为Leader,并且各节点标志任期Term为1(以后每次产生Leader,Term+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个节点为一组的分区P1和2个节点为一组的分区P2,分区内节点能通信。
此时。
- 如果Leader所在的分区为P1多数派,则客户请求到这个分区的业务可以正常处理。而分区P2都为Follower,则会发起选主,但是,因为选票最大为2,达不到大多数,因此P2分区无法产生Leader,所有写请求不会被处理。
- 如果Leader所在分区为P2少数派,那么P1分区内的节点发起选主,可以达到占多数3,因此,可以产生一个Leader,任期Term为原来的+1。此时,P1收到的请求可以正常处理。P2收到的写请求,Leader会转发给Follower写入,但是Leader收到Follower的响应不占大多数,因此Leader不会给Follower发送commit请求。
上述情况,当网络恢复时,集群又成为一个节点,则所有节点会选择任期Term大的Leader作为现任Leader,并且与Leader数据保持一致,如果旧Leader存在未提交的数据将丢弃。
ZAB
ZAB是Zookeeper所使用的强一致性算法。
与Raft类似。
参考bilibili视频 一致性算法(Paxos、Raft、ZAB)
转载请注明出处 一致性协议与Raft算法
来源:oschina
链接:https://my.oschina.net/feistel/blog/4932976