CAP,BASE和最终一致性是NoSQL数据库存在的三大基石。

CAP

C: Consistency 一致性

A: Availability 可用性(指的是快速获取数据)

P: Tolerance of network Partition 分区容忍性(分布式)

在足球比赛里,一个球员在一场比赛中进三个球,称之为帽子戏法(HAT-TRICK)。在分布式数据系统中,也有一个帽子原理(CAP THEOREM),不过此帽子非彼帽子。CAP原理中,有三个要素:

CAP原理指的是,这三个要素最多只能同时实现两点,不可能三者兼顾。因此在进行分布式架构设计时,必须做出取舍。

而对于分布式数据系统,分区容忍性是基本要求,否则就失去了价值。因此设计分布式数据系统,就是在一致性和可用性之间取一个平衡。

对于大多数WEB应用,其实并不需要强一致性,因此牺牲一致性而换取高可用性,是多数分布式数据库产品的方向。

当然,牺牲一致性,并不是完全不管数据的一致性,否则数据是混乱的,那么系统可用性再高分布式再好也没有了价值。

牺牲一致性,只是不再要求关系型数据库中的强一致性,而是只要系统能达到最终一致性即可,考虑到客户体验,这个最终一致的时间窗口,要尽可能的对用户透明,也就是需要保障“用户感知到的一致性”。通常是通过数据的多份异步复制来实现系统的高可用和数据的最终一致性的,“用户感知到的一致性”的时间窗口则取决于数据复制到一致状态的时间。

最终一致性(EVENTUALLY CONSISTENT)

对于一致性,可以分为从客户端和服务端两个不同的视角。从客户端来看,一致性主要指的是多并发访问时更新过的数据如何获取的问题。从服务端来看,则是更新如何复制分布到整个系统,以保证数据最终一致。一致性是因为有并发读写才有的问题,因此在理解一致性的问题时,一定要注意结合考虑并发读写的场景。

从客户端角度,多进程并发访问时,更新过的数据在不同进程如何获取的不同策略,决定了不同的一致性。

对于关系型数据库,要求更新过的数据能被后续的访问都能看到,这是强一致性。

如果能容忍后续的部分或者全部访问不到,则是弱一致性。

如果经过一段时间后要求能访问到更新后的数据,则是最终一致性。最终一致性根据更新数据后各进程访问到数据的时间和方式的不同,又可以区分为:

因果一致性(CAUSAL CONSISTENCY)

如果进程A通知进程B它已更新了一个数据项,那么进程B的后续访问将返回更新后的值,且一次写入将保证取代前一次写入。与进程A无因果关系的进程C的访问遵守一般的最终一致性规则。“读己之所写(READ-YOUR-WRITES)”一致性。当进程A自己更新一个数据项之后,它总是访问到更新过的值,绝不会看到旧值。这是因果一致性模型的一个特例。会话(SESSION)一致性。这是上一个模型的实用版本,它把访问存储系统的进程放到会话的上下文中。只要会话还存在,系统就保证“读己之所写”一致性。如果由于某些失败情形令会话终止,就要建立新的会话,而且系统的保证不会延续到新的会话。单调(MONOTONIC)读一致性。如果进程已经看到过数据对象的某个值,那么任何后续访问都不会返回在那个值之前的值。单调写一致性。系统保证来自同一个进程的写操作顺序执行。要是系统不能保证这种程度的一致性,就非常难以编程了。上述最终一致性的不同方式可以进行组合,例如单调读一致性和读己之所写一致性就可以组合实现。并且从实践的角度来看,这两者的组合,读取自己更新的数据,和一旦读取到最新的版本不会再读取旧版本,对于此架构上的程序开发来说,会少很多额外的烦恼。

从服务端角度,如何尽快将更新后的数据分布到整个系统,降低达到最终一致性的时间窗口,是提高系统的可用度和用户体验非常重要的方面。对于分布式数据系统:

N — 数据复制的份数,W — 更新数据是需要保证写完成的节点数,R — 读取数据的时候需要读取的节点数如果W+R>N,写的节点和读的节点重叠,则是强一致性。例如对于典型的一主一备同步复制的关系型数据库,N=2,W=2,R=1,则不管读的是主库还是备库的数据,都是一致的。

如果W+R<=N,则是弱一致性。例如对于一主一备异步复制的关系型数据库,N=2,W=1,R=1,则如果读的是备库,就可能无法读取主库已经更新过的数据,所以是弱一致性。

对于分布式系统,为了保证高可用性,一般设置N>=3。不同的N,W,R组合,是在可用性和一致性之间取一个平衡,以适应不同的应用场景。

如果N=W,R=1,任何一个写节点失效,都会导致写失败,因此可用性会降低,但是由于数据分布的N个节点是同步写入的,因此可以保证强一致性。如果N=R,W=1,只需要一个节点写入成功即可,写性能和可用性都比较高。但是读取其他节点的进程可能不能获取更新后的数据,因此是弱一致性。这种情况下,如果W

BASE

说起来很有趣,BASE的英文意义是碱,而ACID是酸。真的是水火不容啊。

Basically Availble --基本可用

Soft-state --软状态/柔性事务

"Soft state" 可以理解为"无连接"的, 而 "Hard state" 是"面向连接"的

Eventual Consistency --最终一致性

最终一致性, 也是是 ACID 的最终目的。

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

BASE思想的主要实现有

1.按功能划分数据库

2.sharding碎片

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

base cap 分布式_分布式基础(1):CAP原理、BASE思想和最终一致性相关推荐

  1. base cap 分布式_神一样的CAP理论被应用在何方?

    " 对于开发或设计分布式系统的架构师工程师来说,CAP 是必须要掌握的理论. 图片来自 Pexels But:这个文章的重点并不是讨论 CAP 理论和细节,重点是说说 CAP 在微服务中的开 ...

  2. 分布式和非分布式_分布式防御虚假信息

    分布式和非分布式 I spoke recently at Disclosure - a conference started by Marc Rogers, bringing together int ...

  3. python ray分布式_分布式框架Ray及RLlib简易理解

    最近阅读了 Ray: A Distributed Framework for Emerging AI Applications RLlib: Abstractions for Distributed ...

  4. java id生成器 分布式_分布式高效唯一ID生成器(sequence)

    分布式高效唯一ID生成器(sequence) 简介 高效GUID产生算法(sequence),基于Snowflake实现64位自增ID算法. Twitter-Snowflake算法产生的背景相当简单, ...

  5. java分布式_分布式锁的四种JAVA实现方式

    前言 作为这一段时间学习分布式锁的总结,本文总结了四种Java分布式锁的实现方式,简单编写了代码,进行模拟实现.相关代码存放在我的github仓库. 为什么要用锁 系统内,有多个消费者,需要对同一共享 ...

  6. java activemq 分布式_分布式--ActiveMQ 消息中间件(一)

    1). ActiveMQ ActiveMQ是Apache所提供的一个开源的消息系统,完全采用Java来实现,因此,它能很好地支持J2EE提出的JMS(Java Message Service,即Jav ...

  7. 逻辑代数01律的理解_零基础学习计算机原理:布尔逻辑和逻辑门

    Hello World!我是老乔,欢迎来到超智星球.在这里,每篇都学一个小知识. 微号:超智星球 网站:http://chaozhixingqiu.com 这期呢,还是计算机原理系列,上期最后讲到了自 ...

  8. 前端解析token中的数据_[前端基础]数据类型判定原理解析

    在日常业务开发当中,经常会遇到需要对某种数据类型进行判断,这里介绍几种判断js数据类型的方式~ typepf 关键字 console.log(typeof 1) // number console.l ...

  9. base cap 分布式_1、分布式基础之CAP和BASE理论

    ACID 是数据库事务完整性的理论,CAP 是分布式系统设计理论,BASE 是 CAP 理论中 AP 方案的延伸. 一.从集中式到分布式 1.集中式 集中式是指有一台或者多台计算机组成的中心节点,数据 ...

最新文章

  1. 汇编语言 利用and运算 将字符串中的某个字母变成大写
  2. 理解ATL中的一些汇编代码
  3. 借用虚拟机在真机安装 ubuntu, 亦可安装至移动硬盘
  4. linux睡眠进程,linux一个进程如何睡眠
  5. java二叉树的创建,遍历及其他方法
  6. JavaScript_HTML DEMO_2_事件
  7. mac搜索文件什么都没有,是为什么
  8. 抽象实现接口,default修饰接口方法
  9. android studio 自定义生成BuildConfig文件,形成打包配置
  10. 警惕,最新SCI/SSCI期刊14本期刊被剔除?
  11. 【​观察】同方谋定而后动 云局突破三板斧
  12. OpenHarmony命令行调试工具hdc_std介绍
  13. 嵌入式软件未来发展趋势
  14. 楼氏电子推出Raspberry Pi 开发工具包,为新物联网应用和行业语音整合提供支持
  15. 手写代码详解Android Hook入门demo,android应用案例开发大全第四版源码
  16. Elasticsearch _search查询参数及过滤
  17. Oracle 知识篇+RMAN带库备份恢复/带库全备恢复/带库0级备份恢复操作概要
  18. 蓝汛之,关于硬件设计导致的RF干扰GND导致产生的底噪问题【篇】
  19. java erp 视频_Java开发ERP项目视频教程
  20. Kotlin 协程 (1/7篇) - 协程概念 Coroutine

热门文章

  1. adb 查看磁盘占用_如何使用adb 指令查看机器序列号
  2. 申请iso9001认证的好处?
  3. web前端中制作简单页面实现让文字在图片旁边
  4. 实证研究的步骤_环环相扣!牢记这些步骤,论文变轻松
  5. 网络摄像机测试用例设计思路工作随感
  6. 2022-2028全球与中国医疗设备包装市场现状及未来发展趋势
  7. 大学生想做兼职应该怎么找,适合大学生的线上线下靠谱兼职推荐
  8. Windows/Linux/Mac上蜂鸣器报警
  9. wifi大师小程序专业版源码小程序源码内含教程
  10. 联想x3850x6重装系统_联想 System x3850 X6 和x3950 X6 安装与维护指南 PDF