记录一下对CAP的理解,CAP理论是分布式系统的基本理论,已得到证明,分布式系统最多只能满足其中的两个。
CAP基本概念
CAP是三个特性关键字的简写。
(1)C:Consistency,一致性
(2)A:Availability,可用性
(3)P:Partition tolerance,分区容忍性
一致性:对某个节点写操作后,其他节点可以读取到最新的数据,这个写操作的更新需要对其他节点可见。
可用性:任意一个没有发生故障的节点,需要在有限的时间返回一个合理的结果。
分区容忍性:分布式系统中,就算部分节点宕机或者无法与其他节点通信时,系统整体依然可以对外提供服务。
不能同时满足
CAP是不能同时满足的,最多只能满足其中的2个特性。
如果满足了CA,意味着一致性和可用性同时满足,这种情况只有一个节点才能满足,即对单个节点的写操作,对外读取时可以立即生效。
在CA的基础上,在增加一个P会是什么情况?如果增加一个节点,一定保证分区一致性的话,CA就只能留下其中的一个。
如果留下C,保证了CP,就意味着数据必须要保证各个节点的一致,在节点通信进行数据同步时,会存在节点等待而无法对外提供合理的数据,这就不能满足A。
如果留下A,保证了AP,意味着需要在有限的时间返回一个合理结果,但是在这个时间范围数据可能还没有在节点间同步结束,导致返回的数据不同节点会有不一致的可能,这样就不能满足C。
因此CAP只能满足其中的两个,一般分布式系统中,是满足CP,如Hadoop、HBase、Zookeeper、Kafka等都满足CP。
一致性实现的方法
要实现一致性,有多种选择。
(1)ZAB
ZAB(ZooKeeper Automic Broadcast)原子广播协议,就是实现一致性的一种方式,zab来自raft(共识算法),而raft来自paxos,zookeeper就是用的zab,实现分布式一致性。
参考文末博文,消息广播的大致步骤如下:
a.客户端发送给zookeeper的写请求,请求会被leader先转化成事务proposal提案,并为proposal提供一个全局的txid。
b.leader会将proposal提案发送给所有的follower,但是不是直接发送给follower,而是先让一个队列先接收着,其中每个follower都会有一个队列。队列采用FIFO的策略,先发给队列再处理可以实现异步解耦,提升性能。
c.当follower处理完proposal成功后会返回一个ack信号给leader,当过半的follower都返回了ack,leader就认为可以commit这个proposal了,除了自己会提交事务会外,还会给每个follower广播这个commit信息,follower随后也都会提交事务。
有了消息广播还不能保证一致,还不够健壮,ZAB还有两个特征,可以保证一致性:
a.当leader提交了proposal,这样每个follower也需要完成commit提交。
b.当leader提出proposal后就挂掉了,这个proposal会被丢弃。
这样,就算leader挂掉了,可以做到"对应该提交的proposal不会漏过,对不该提交的proposal绝不留存"。
(2)主从模式
主从模式也是一种实现方式,如Hadoop有一个主节点namenode,多个从节点datanode,如果给集群写入数据,会先将请求发送namenode,主节点通过心跳机制得到各个从节点的信息,选出合适写入数据的节点后,数据会在多个从节点间建立pipeline进行平行复制,保证数据同步。
(3)WNR
可以按照理解抽屉原理来理解WNR,其中W代表每次写操作能保证的最少成功副本数,R代表每次读操作能确保读取到的副本数,N代表副本总数。当W+R>N时,这样可以保证每次读取到的数据,有一个副本是最新的数据,这样也可以实现一致性。数据库Cassandra就是采用这种策略,使用WNR比较耗费资源,通俗一点说是属于"牺牲资源,换心安"。
参考博文
(1)https://www.cnblogs.com/mingorun/p/11025538.html CAP
(2)https://www.jianshu.com/p/2bceacd60b8a ZAB
(3)https://www.cnblogs.com/yaohaitao/p/8907022.html
(4)https://www.jianshu.com/p/8e4bbe7e276c paxos和raft