首页 > 编程知识 正文

cap base理论,cap原理和base思想

时间:2023-05-04 06:49:00 阅读:244561 作者:1378

基础理论

先简单介绍下数据一致性的基础理论。

强一致 
当更新操作完成之后,任何多个后续进程或者线程的访问都会返回最新的更新过的值。这种是对用户最友好的,就是用户上一次写什么,下一次就保证能读到什么。根据 CAP 理论,这种实现需要牺牲可用性。

弱一致性 
系统并不保证续进程或者线程的访问都会返回最新的更新过的值。系统在数据写入成功之后,不承诺立即可以读到最新写入的值,也不会具体的承诺多久之后可以读到。

最终一致性 
弱一致性的特定形式。系统保证在没有后续更新的前提下,系统能最终返回上一次更新操作的值。在没有故障发生的前提下,不一致窗口的时间主要受通信延迟,系统负载和复制副本的个数影响。DNS 是一个典型的最终一致性系统。

ACID模型

ACID是传统数据库常用的设计理念,追求强一致性模型。 
关系数据库的ACID模型拥有 高一致性 + 可用性 很难进行分区: 
Atomicity 原子性:一个事务中所有操作都必须全部完成,要么全部不完成。 
Consistency 一致性: 在事务开始或结束时,数据库应该在一致状态。 
Isolation 隔离性: 事务将假定只有它自己在操作数据库,彼此不知晓。 
Durability 持久性:一旦事务完成,更新就是持久性的,无论断电或者宕机数据都不会丢失。

ACID模型要求一个事物必须满足上面的四点,这是对关系型传统数据库的指导性依据。而非关系型数据库NoSql则不再依赖这一模型。

CAP理论

2000年7月,加州大学伯克利分校的Eric Brewer教授在ACM PODC会议上提出CAP猜想。2年后,麻省理工学院的Seth Gilbert和欢呼的樱桃 Lynch从理论上证明了CAP。之后,CAP理论正式成为分布式计算领域的公认定理。

CAP理论为: 
一个分布式系统最多只能同时满足

Consistency(一致性), 数据一致更新,所有数据变动都是同步的Availability(可用性), 好的响应性能Partition tolerance(分区容错性) 可靠性

这三项中的两项。

BASE理论

BASE是指基本可用(Basically Available)、软状态( Soft State)、最终一致性( Eventual Consistency)。

BASE:Basically Available,Soft state,Eventually consistent四个词组的首字母,它的意思是:基本可用+软状态+最终一致性 。
eBay的架构师Dan Pritchett源于对大规模分布式系统的实践总结,在ACM上发表文章提出BASE理论,BASE理论是对CAP理论的延伸,核心思想是即使无法做到强一致性(Strong Consistency,CAP的一致性就是强一致性),但应用可以采用适合的方式达到最终一致性(Eventual Consitency)。

基本可用(Basically Available) 
基本可用是指分布式系统在出现故障的时候,允许损失部分可用性,即保证核心可用。 
电商大促时,为了应对访问量激增,部分用户可能会被引导到降级页面,服务层也可能只提供降级服务。这就是损失部分可用性的体现。

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

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

BASE模型是传统ACID模型的反面,不同与ACID,BASE强调牺牲高一致性,从而获得可用性,数据允许在一段时间内的不一致,只要保证最终一致就可以了

BASE模型反ACID模型,完全不同ACID模型,牺牲高一致性,获得可用性或可靠性: Basically Available基本可用。支持分区失败(e.g. sharding碎片划分数据库) Soft state软状态 状态可以有一段时间不同步,异步。 Eventually consistent最终一致,最终数据是一致的就可以了,而不是时时一致。

BASE思想的主要实现有 
1.按功能划分数据库 
2.sharding碎片

BASE思想主要强调基本的可用性,如果你需要高可用性,也就是纯粹的高性能,那么就要以一致性或容错性为牺牲,BASE思想的方案在性能上还是有潜力可挖的。

现在NoSQL运动丰富了拓展了BASE思想,可按照具体情况定制特别方案,比如忽视一致性,获得高可用性等等,NOSQL应该有下面两个流派: 
1. Key-Value存储,如Amaze Dynamo等,可根据CAP三原则灵活选择不同倾向的数据库产品。 
2. 领域模型 + 分布式缓存 + 存储 (Qi4j和NoSQL运动),可根据CAP三原则结合自己项目定制灵活的分布式方案,难度高。

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

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

分布式事务的一致性处理方案

一致性问题 
一致性可分为强一致性和弱一致性,弱一致性又称为最终一致性。

使用消息队列

在单机环境中,强一致性可以由数据库的事务保证。但在多机环境中,强一致性就很难做到。尽管可以使用2PC来实现分布式事务(例如使用消息队列MQ),但它的低性能(很多情况下满足不了可用性需求)使得不适合于互联网应用。这种强一致性效果的取得,其实是让提交处理过程同步化。

主从复制

在多机环境中,通过使提交处理半同步半异步、或者全异步,取得最终一致性效果。例如数据库中的主从复制,在提交时就是主库同步从库异步,这对从库复制进度落后不多的场景很简单有效,但在从库落后主库很多时,如果应用还从从库读数据,就会读出脏数据,可以通过监控从库复制进度来选择读哪个从库以避免这个问题。在NOSQL模式下,以Dynamo为例,可以通过确定NRW的不同取值,可以做到同步、半同步半异步、或者全异步的效果。

最终一致性使得数据的提交效果具有延时性,而在一定的延时性范围内(比如1秒以内),应用的可用性就是OK的,比如提交后在客户端通过JS等停一段时间刷新页面就是要取得这种效果。

特点:

优点是:实现简单,适合于提交压力不会使得从库复制明显落后的场景。 
缺点是,当主从提交压力增大、或者存在耗时长的提交命令时,从库复制进度会明显落后于主库

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。