第七篇 CAP

https://zhuanlan.zhihu.com/p/20399316?refer=auxten
 

CAP定理(CAP theorem),又被称作布鲁尔定理(Brewer’s theorem),它指出对于一个分布式计算系统来说,不可能同时满足以下三点:

  • 一致性 (Consistency)(等同于所有节点访问同一份最新的数据副本)
  • 可用性(Availability)(对数据更新具备高可用性)
  • 网络分区容忍性(Partition tolerance)(以实际效果而言,分区相当于对通信的时限要求。系统如果不能在时限内达成数据一致性,就意味着发生了分区的情况,必须就当前操作在C和A之间做出选择。)
  • (上面的解释不好,看这个)系统中有部分服务或模块挂掉或失效的时候,不影响系统正常服务。分区容忍性:分布式系统在遇到任何网络分区故障的时候,仍然能够保证对外提供满足一致性和可用性的服务,除非是整个网络环境都发生了故障。

根据定理,分布式系统只能满足三项中的两项而不可能满足全部三项。

理解CAP理论的最简单方式是想象两个节点分处分区两侧。 允许至少一个节点更新状态会导致数据不一致,即丧失了C性质。 如果为了保证数据一致性,将分区一侧的节点设置为不可用,那么又丧失了A性质。 除非两个节点可以互相通信,才能既保证C又保证A,这又会导致丧失P性质。

CAP原理实例推导

单实例

所有单机版的系统都属于这个范畴,例如MySQL、memcached、redis。

Sharding

由于数据库之间没有互相通信,并不依赖彼此的存在,所以分区可容忍性依旧没有破坏。

这种情况下CAP各项指标虽然没有提升,但好处是:

  1. 单个服务器宕机只会导致服务降级;
  2. 集群有了扩容缩容的可能性,这就叫做scalability。

这种分布式的方式常用于:

  • 分布式memcached、redis
  • 传统的数据库Sharding
  • BigTable (列存储式数据库)
  • Hypertable (列存储式数据库)
  • HBase (列存储式数据库)
  • MongoDB (文档式数据库)
  • Terrastore (文档式数据库)
  • Redis (KV数据库)
  • Scalaris (KV数据库)
  • MemcacheDB (KV数据库)
  • Berkeley DB (KV数据库)

多副本写入

Clustering

多副本模式:

由于上述方案是强一致性( C )的,这种应用场景常见于金融系统,这种这方面典型的代表有:

  • ZooKeeper (KV数据库)
  • Vertica (列存储式数据库)
  • Aster Data (关系型数据库)
  • Greenplum (关系型数据库)

由于大多数互联网公司的需求不是要求强一致性( C ), 所以通过放弃一致性,达到更高的可用性( A )和分区可容忍性 ( P )成了目前市面上大多数NoSQL数据库的核心思想。

这方面典型的代表还有:

  • Dynamo (KV数据库)
  • Voldemort (KV数据库)
  • Tokyo Cabinet (KV数据库)
  • KAI (KV数据库)
  • Cassandra (列存储式数据库)
  • CouchDB (文档式数据库)
  • SimpleDB (文档式数据库)
  • Riak (文档式数据库)
  • MooseFS (类GFS分布式文件系统)

有没有可能将CAP同时提升呢?答案是:Sure, ofcourse.

我们可以通过用更高可靠性的服务器、更可靠的网络设备达到CAP同时提升。

但注意,只是提升,不是完全解决。

BASE & ACID

数据库的事务有ACID的保证。

后来,随着NoSQL的兴起,技术界又提出了BASE的概念:

  • Basically Availble --基本可用

    支持分区失败(Sharding碎片划分数据库),出了问题服务仅降级(部分不可用)。

  • Soft-state --软状态/柔性

    事务"Soft state" 可以理解为"无连接"的, 而 "Hard state" 是"面向连接"的。 软状态就是可以有一段时间不同步,异步。

  • Eventual Consistency --最终一致性

    最终数据是一致的就可以了,而不是时时一致。

合起来就是BASE。

比较有意思的是:在英语里ACID是酸的意思;BASE也有碱的意思。

最后来一张存储框架的全家福:

 
 

网络编程中的CAP & 有趣的存储框架(关系型、NoSQL)全图的更多相关文章

  1. Android编程中的5种数据存储方式

    Android编程中的5种数据存储方式 作者:牛奶.不加糖 字体:[增加 减小] 类型:转载 时间:2015-12-03我要评论 这篇文章主要介绍了Android编程中的5种数据存储方式,结合实例形式 ...

  2. 【Linux网络编程】TCP网络编程中connect()、listen()和accept()三者之间的关系

    [Linux网络编程]TCP网络编程中connect().listen()和accept()三者之间的关系 基于 TCP 的网络编程开发分为服务器端和客户端两部分,常见的核心步骤和流程如下: conn ...

  3. Python的功能模块[1] -> struct -> struct 在网络编程中的使用

    struct模块 / struct Module 在网络编程中,利用 socket 进行通信时,常常会用到 struct 模块,在网络通信中,大多数传递的数据以二进制流(binary data)存在. ...

  4. 浅谈TCP/IP网络编程中socket的行为

    我认为,想要熟练掌握Linux下的TCP/IP网络编程,至少有三个层面的知识需要熟悉: 1. TCP/IP协议(如连接的建立和终止.重传和确认.滑动窗口和拥塞控制等等) 2. Socket I/O系统 ...

  5. socket网络编程中read与recv区别

    socket网络编程中read与recv区别 1.read 与 recv 区别 read 原则: 数据在不超过指定的长度的时候有多少读多少,没有数据则会一直等待.所以一般情况下:我们读取数据都需要采用 ...

  6. VC++学习之网络编程中的套接字

    VC++学习之网络编程中的套接字 套接字,简单的说就是通信双方的一种约定,用套接字中的相关函数来完成通信过程.应用层通过传输层进行数据通信时,TCP和UDP会遇到同时为多个应用程序进程提供并发服务的问 ...

  7. 网络编程中select模型和poll模型学习(linux)

    一.概述 并发的网络编程中不管是阻塞式IO还是非阻塞式IO,都不能很好的解决同时处理多个socket的问题.操作系统提供了复用IO模型:select和poll,帮助我们解决了这个问题.这两个函数都能够 ...

  8. Java网络编程中异步编程的理解

    目录 前言 一.异步,同步,阻塞和非阻塞的理解 二.异步编程从用户层面和框架层面不同角度的理解 用户角度的理解 框架角度的理解 三.为什么使用异步 四.理解这些能在实际中的应用 六.困惑 参考文章 前 ...

  9. [转帖]关于网络编程中MTU、TCP、UDP优化配置的一些总结

    关于网络编程中MTU.TCP.UDP优化配置的一些总结 https://www.cnblogs.com/maowang1991/archive/2013/04/15/3022955.html 感谢原作 ...

随机推荐

  1. java 分布式锁

    转自:http://www.hollischuang.com/archives/1716 目前几乎很多大型网站及应用都是分布式部署的,分布式场景中的数据一致性问题一直是一个比较重要的话题.分布式的CA ...

  2. pair的定义C++

    template <class T1, class T2> struct std::pair { typedef T1 first_type; typedef T2 second_type ...

  3. 排序系列 之 堆排序算法 —— Java实现

       基本概念: 二叉堆是完全二叉树或者是近似完全二叉树. 当父结点的键值总是大于或等于任何一个子节点的键值时为最大堆. 当父结点的键值总是小于或等于任何一个子节点的键值时为最小堆. 一般将二叉堆简称 ...

  4. Oracle 批量插入值

    工作中常遇到将Excel文档数据转为SQL语句,然后再将SQL语句插入到数据库已完成数据转移保存到数据库中,下面介绍下如何一次性插入多条SQL语句,先抛个图: 由于真实数据不变给大家看,所以这里是做了 ...

  5. C - Lucky Numbers (easy)

    Problem description Petya loves lucky numbers. Everybody knows that positive integers are lucky if t ...

  6. HBase编程 API入门系列之delete(客户端而言)(3)

    心得,写在前面的话,也许,中间会要多次执行,连接超时,多试试就好了. 前面的基础,如下 HBase编程 API入门系列之put(客户端而言)(1) HBase编程 API入门系列之get(客户端而言) ...

  7. 【原创】.Net 微信 JS-SDK图片、语音上传接口的实现(MVC)-(一 、上传图片)

    前段时间在做一个微信的项目,遇到了一个上传图片的问题,花了一下午,解决了这个问题,然后把总结出来的代码,分享了出来. 最近又有一个图片+语音的功能, 更是蛋疼, 本次采用的不是File文件上传,然后转 ...

  8. Md2All,把图片轻松上传到云图床,自动生成Markdown

    内容目录 关于Md2AllMd2All的云图床效果直接把图片拖到编辑框截图,直接复制粘贴点图片图标选择图片注册七牛云帐号新建七牛云存储空间设置云图床密钥AK和SKBucketName和BucketDo ...

  9. 用DIV遮罩解决checkbox勾选无效的问题

    在前端开发的过程中,遇到一种情况,需要勾选,为了用户的操作便捷就将click事件放到了DIV上.(其中使用了knockout.js) 代码大概如下: <div id="one" ...

  10. 2013款MacBook Air装Windows7单系统

    经过两天的摸索,查找无数资料终于把2013款的MacBook Air装上了WIN 7,虽然网上有很多的资料但是都不是我想要的,第一个我的是2013款的MacBook Air,跟原来2012 11款Ma ...