也叫CAP定理,指的是在一个分布式系统中,有三个非常重要的特性:一致性C、可用性A、分区容错性P
上面已经说明,分区容错性是分布式系统必须考虑的
为了保证可用性,肯定要增加节点,此时可用性确实提升。但节点的增多带来的问题是,这么多的节点之间的数据同步是一个很多的消耗,极其容易造成数据不一致。
当我们强调一致性的时候,节点越少,数据同步的消耗就小,但带来的节点少却又造成服务的可用性差。
所以一致性和可用性是不可兼顾的,他们处于一个对立面!
明白了基本的原理,可以知道可能的组合有3
CA :单点应用的选择,因为没有分区
以下两种就是分布式系统的取舍选择组合,无论是CP还是AP都不代表完全放弃了另外一个,只是弱支持
CP:强调一致性,放弃一些可用性,如Zookeeper,选举过程会短暂的使系统不可用,如银行系统必须要求数据一致
AP:强调可用性,放弃一些一致性,比如一些退款业务,2小时内到账这样,在用户接受的范围内满足要求
前面都是铺垫,为了引出paxos,zookeeper遵循CP原则,强调一致性
那么问题来了,如何保证分布式系统一致性?
paxos算法!目前公认的解决分布式一致性问题最有效的算法之一,其解决的问题就是在分布式系统中如何就某个值(决议)达成一致。
zookeeper的底层原理ZAB协议就是基于paxos提出的
所以要先搞懂paxos算法
网上抄来的介绍:
是指拜占庭帝国军队的将军们必须全体一致的决定是否攻击某一支敌军。问题是这些将军在地理上是分隔开来的,只能依靠通讯员进行传递命令,但是通讯员中存在叛徒,它们可以篡改消息,叛徒可以欺骗某些将军采取进攻行动;促成一个不是所有将军都同意的决定,如当将军们不希望进攻时促成进攻行动;或者迷惑某些将军,使他们无法做出决定。
一句话:你的集群内网络是安全的,不存在通信的消息被篡改的情况
而paxos算法的大前提就是你的分布式系统不存在拜占庭将军问题
当然一般情况下确实是不存在这个问题的,大多数系统都是部署在一个局域网中,因此消息被篡改的情况很罕见;另一方面,由于硬件和网络原因而造成的消息不完整问题,只需要一套简单的校验算法即可。在此我向大家推荐一个架构学习交流圈。交流学习指导伪鑫:1253431195(里面有大量的面试题及答案)里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化、分布式架构等这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多
非常有意思的是paxos算法可以通过一个简单的故事描述出来,这个故事中有三个角色:
Proposer :提议者,提出意见 (议员)
Acceptor:接受者,接受意见 or 拒绝意见 (议员)
Learner:只能接受最后的结果意见 (平民)
而paxos算法的故事也是在这几个角色之间展开的
前面的故事背景里面有特别的提到 : 每个提议都需要超过半数的议员同意才能生效
这就是所谓的过半原则
Paxos基于的过半数学原理: 我们称大多数(过半)进程组成的集合为法定集合,两个法定(过半)集合必然存在非空交集,即至少有一个公共进程,称为法定集合性质。 例如A,B,C,D,F进程组成的全集,法定集合Q1包括进程A,B,C,Q2包括进程B,C,D,那么Q1和Q2的交集必然不在空,C就是Q1,Q2的公共进程。如果要说Paxos最根本的原理是什么,那么就是这个简单性质。也就是说:两个过半的集合必然存在交集,也就是肯定是相等的,也就是肯定达成了一致。
举个例子:3个人,一个提议,只要2个人同意就算通过;4个人,一个提议,要3个人同意才算通过
一般有两阶:
咋一看paxos没啥问题,但在极端情况下会出现活锁

选主,只有主能提Propose,其他人想提只能告诉主,让主来提出
作者|GnaixOar1997|掘金