zoukankan      html  css  js  c++  java
  • 初识CAP

    记录一下对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

  • 相关阅读:
    mac配置ls命令显示不同文件不同颜色
    nginx安装
    PostgreSQL的架构
    /etc/sysctl.conf配置文件
    pg_hba.conf配置文件
    gitlab不支持mysql,这就是我学习PostgreSQL的原因
    postgresql安装
    git的三个区域比较
    mysql备份时的快照原理
    mysql密码管理
  • 原文地址:https://www.cnblogs.com/youngchaolin/p/12512565.html
Copyright © 2011-2022 走看看