1.1 CAP定理
cap定理是下面三个单词的首字母缩写:
(1)Consistency:一致性
通信超时和更新延迟都属于一致性问题,出现这个问题原因是存在多台服务器,而且每台服务器都有自己的数据,
输入数据冗余可以提高系统的可用性和分区容错性,但是难以满足强一致性。如果想要解决一致性问题,也就是达到
强一致性,比如把所有的请求都通过单台服务器处理,那么就很难达到高可用性。
(2)Availability:可用性
对于高可用性的系统来说,往往会保留强一致性。典型的就是延迟处理,利用消息队列之类的中间件,在后台逐个处理
队列中的请求,当处理完毕之后,系统达到了强一致性状态。但是要求强一致的系统,比如元数据系统,分布式数据库系统,
它们的可用性往往是有上限的。
(3)Partition-tolerance:分区容错性
CAP定理指出,在异步网络模型中,不存在一个系统可以同时满足上面3个属性。换句话说,分布式系统必须舍弃其中的一个属性。
从经验上来说,可用性或者一致性都是往往被弱化的对象。
分布式系统中不存在同时覆盖3个属性的区域,但是可以找到同时覆盖两个属性的区域,如下维恩图:
1.2 共识算法
保证所有的参与者都有相同的认知(可以理解为强一致性)。共识算法本身可以依据是是否有恶意节点分为两类,
大部分时候共识算法都是没有恶意节点的那一类,系统中的节点不会向其他的节点发送恶意请求,比如欺骗请求。
共识算法最有名的应该是Paxos算法。
1.2.1 Paxos算法
由Leslie Lamport在1998年发表的The Part-Time Parliament中提出的共识算法。
大体的流程,三种角色:
(1)Proposer(提案人):提出提案,并向Acceptor发送提案。
(2)Acceptor(接受者):参与决策,回应提案,如果提案获得多数过半Acceptor接受,则认为提案被批准。
(3)learner(学习者):不参与决策,只学习最新达成一致的提案。
Paxos算法中的决议过程分两种,一种是对单个value(值)的决议过程,也就是对单个值达成一致。
另一种是针对连续多个value的决议过程。前者称为Basic Paxos,后者称为Multi Paxos。
Basic Paxos:
(1)Proposer生成全局唯一且递增的proposal id,并向所有的Acceptor发送prepare请求。
(2)Acceptor收到请求后,如果proposal id正常,则回复已接受的proposal id种最大的决议id和value。
(3)Proposer接收到多数Acceptor的响应后,从答应中选择proposal id最大的value,并发送给所有的Acceptor。
(4)Acceptor收到proposal之后,接受并持久化当前的proposal id和value。
(5)Proposer收到多数Acceptor的响应之后形成决议,Proposer发送决议给所有learner。
对于多个value,来回两次的决议使其性能不是很理想,所以针对连续的多个value决议的Multi Paxos。
Multi Paxos基本思想是先使用Basic Paxos决议出leader,再由leader推进决议。Multi Paxos和Basic Paxos的具体不同:
(1)每个Proposer使用唯一的id标志。
(2)使用basic paxos在所有Proposer中选取一个leader,由leader提交proposal给Acceptor表决,这样Basic Paxos中的
(1)-(3)都可以跳过,提高效率。