目录

CAP原理和BASE思想

原文:https://www.jdon.com/37625

CAP理论

分布式领域CAP理论,

  • Consistency(一致性), 数据一致更新,所有数据变动都是同步的

  • Availability(可用性), 好的响应性能

  • Partition tolerance(分区容忍性) 可靠性

分区容忍性

一个分布式系统里面,节点组成的网络本来应该是连通的。然而可能因为一些故障,使得有些节点之间不连通了,整个网络就分成了几块区域。数据就散布在了这些不连通的区域中。这就叫分区。

当你一个数据项只在一个节点中保存,那么分区出现后,和这个节点不连通的部分就访问不到这个数据了。这时分区就是无法容忍的。

提高分区容忍性的办法就是一个数据项复制到多个节点上,那么出现分区之后,这一数据项就可能分布到各个区里。容忍性就提高了。

然而,要把数据复制到多个节点,就会带来一致性的问题,就是多个节点上面的数据可能是不一致的。要保证一致,每次写操作就都要等待全部节点写成功,而这等待又会带来可用性的问题。

总的来说就是,数据存在的节点越多,分区容忍性越高,但要复制更新的数据就越多,一致性就越难保证。为了保证一致性,更新所有节点数据所需要的时间就越长,可用性就会降低。 参考:https://www.zhihu.com/question/54105974/answer/139037688

https://gitee.com/lienhui68/picStore/raw/master/null/image-20200927135047286.png

出自:Raft动画演示

如上产生分区,Node C会成为上面分区的主节点,上面的现象称为脑裂。为了防止脑裂后投票出现平票的情况,节点数一般为单数。

下面的分区主节点已经不可写,因为commit时会发现是少数派。总共5个节点。

定理:任何分布式系统只可同时满足二点,没法三者兼顾。

忠告:架构师不要将精力浪费在如何设计能满足三者的完美分布式系统,而是应该进行取舍。

BASE思想

关系数据库的ACID模型拥有 高一致性 + 可用性 很难进行分区:

  • Atomicity原子性:一个事务中所有操作都必须全部完成,要么全部不完成。

  • Consistency一致性. 在事务开始或结束时,数据库应该在一致状态。

  • Isolation隔离性. 事务将假定只有它自己在操作数据库,彼此不知晓。

  • Durability持久性. 一旦事务完成,就不能返回。

一致性强调的最终状态,要么是初始状态(有可能事务回滚了),要么是最终状态,事务成功执行后;原子性强调的是操作的完整性,连续的操作不可分割,要么全部成功,要么全部失败。

跨数据库两段提交事务:2PC (two-phase commit), 2PC is the anti-scalability pattern (Pat Helland) 是反可伸缩模式的,JavaEE中的JTA事务可以支持2PC。因为2PC是反模式,尽量不要使用2PC,使用BASE来回避。

为什么2pc是反模式?

可伸缩性是指系统通过增加或减少硬件水平从而提升或降低系统性能的难易程度。可伸缩性分为scale up和scale out。scale up是指提高单台服务器的硬件水平来提高系统的整体处理能力,可以调整的有CPU,存储,内存等;scale out是指通过增加系统的处理节点的方式来提高系统的整体处理能力。 可扩展性是软件系统应对需求增加或需求变化的能力。

试想一下一阶段回复yes的节点在二阶段提交或回滚之前被摘掉就会导致各节点间数据的不一致,所以2pc是反模式。

柔性事务和刚性事务

  • 柔性事务满足BASE理论(基本可用,最终一致)
  • 刚性事务满足ACID理论,eg:2pc

BASE模型反ACID模型,完全不同ACID模型,牺牲高一致性,获得可用性或可靠性。

是指分布式事务,如果在分布式事务里还遵循强一致性,可用性会很差。

定义:BASE就是为了解决关系数据库强一致性引起的问题而引起的可用性降低而提出的解决方案

BASE其实是下面三个术语的缩写:

  • 基本可用(Basically Available)

    基本可用是指分布式系统在出现故障的时候,允许损失部分可用性,即保证核心可用。

    电商大促时,为了应对访问量激增,部分用户可能会被引导到降级页面,服务层也可能只提供降级服务。这就是损失部分可用性的体现。

  • 软状态(Soft state)

    软状态是指允许系统存在中间状态,而该中间状态不会影响系统整体可用性。分布式存储中一般一份数据至少会有三个副本,允许不同节点间副本同步的延时就是软状态的体现。mysql replication的异步复制也是一种体现。

  • 最终一致(Eventually consistent)

    最终一致性是指系统中的所有数据副本经过一定时间后,最终能够达到一致的状态。弱一致性和强一致性相反,最终一致性是弱一致性的一种特殊情况。

    它的思想是通过让系统放松对某一时刻数据一致性的要求来换取系统整体伸缩性和可用性上的改观。为什么这么说呢,缘由就在于大型系统往往由于地域分布和极高性能的要求,不可能采用分布式事务来完成这些指标,要想获得这些指标,我们必须采用另外一种方式来完成,这里BASE就是解决这个问题的办法。

ACID和BASE的区别与联系

ACID是传统数据库常用的设计理念,追求强一致性模型。BASE支持的是大型分布式系统,提出通过牺牲强一致性获得高可用性。

ACID和BASE代表了两种截然相反的设计哲学,在分布式系统设计的场景中,系统组件对一致性要求是不同的,因此ACID和BASE又会结合使用。

同意banq老师的观点。BASE讲究soft state,这种状态是一种非即时性的状态,是一种无连接,或者说是尽量短连接的状态,而ACID是讲究强的一致性,要求即时性的事务hard state,这是一种完全面向连接的状态(比如2pc)。强的一致性就以牺牲性能和高可用性为代价,目前 JDON的风格是一种符合BASE策略的架构风格。

NoSql

现在NOSQL运动丰富了拓展了BASE思想,可按照具体情况定制特别方案,比如忽视一致性,获得高可用性等等,NOSQL应该有下面两个流派:

选择产品

Key-Value存储,如Amaze Dynamo等,可根据CAP三原则灵活选择不同倾向的数据库产品。

定制方案

领域模型 + 分布式缓存 + 存储 (Qi4j和NoSql运动),可根据CAP三原则结合自己项目定制灵活的分布式方案,难度高。

这两者共同点:都是关系数据库SQL以外的可选方案,逻辑随着数据分布,任何模型都可以自己持久化,将数据处理和数据存储分离,将读和写分离,存储可以是异步或同步,取决于对一致性的要求程度。

不同点:NOSQL之类的Key-Value存储产品是和关系数据库头碰头的产品BOX,可以适合非Java如PHP RUBY等领域,是一种可以拿来就用的产品,而领域模型 + 分布式缓存 + 存储是一种复杂的架构解决方案,不是产品,但这种方式更灵活,更应该是架构师必须掌握的。