数据库的CAP理论:一致性、可用性以及分区容忍性

数据库的CAP理论:一致性、可用性以及分区容忍性

乔纳珊.约翰逊
2020.12.9

译者:东南门吹雪
2023.4.14

  CAP理论是来自理论计算机科学关于分布式数据存储的一个信念,它断言:假如分布式数据库发生网络失败,则只能提供一致性、可用性二者之其中一项,而不是全部两者。
  让我们一起来看下:
在这里插入图片描述

什么是CAP理论

  CAP理论由3个部分组成(也是名字的由来):

>一致性,全部读操作收到最新的写入或一个错误(error)。

>可用性,全部读都包含数据,但可能不是最新的。

>分区容忍性,即使网络失败(也就是失联的分区、慢网络连接,或节点间不可用的网络连接),系统也继续运转。

  在正常的系统运转中,你的数据存储提供全部三项职能。但是CAP理论坚持认为:当分布式数据库经历网络失败时,你能提供要么一致性,要么可用性。

  这是一个权衡。其它的全部时间里,三项是全部可以提供的。但是万一网络失败,则必须做出一个取舍。

  在这个理论中,分区容忍性是必须的。其假设系统运行在分布式数据存储之上,所以系统天然伴随着网络分区而运转。网络分区会发生,所以为了提供任何类型的可靠服务,分区容忍性是必要的——CAP中的P。

  然后剩下在C与A两者之间的决定。当网络失败发生时,人们可以选择保证一致性或者可用性:

>高一致性带来更低的可用性的代价

>高可用性带来更低的一致性的代价

  在CAP中的一致性(Consistency)跟ACID中的一致性(Consistency)概念不同。CAP中的一致性表示有最时新的信息。(ACID指另一个不同的数据库事件。在ACID,一致性表示任何新的数据库事务不会破坏数据库的正确性)

用户查询:一致的或可用的

  现在思考一下用户查询的问题。我们假定一个用户对一个数据库做一个查询,然后这个网络数据库要返回一个值。

  无论从数据库返回哪个值,都依赖于我们是提供一致性还是可用性的选择。这里看下这种选择过程的来龙去脉:

>发生一个查询时,我们使用服务器上的当前值向用户响应,以提供一个高可用的服务。如果我们这样做,就不能保证返回的值是最新提交到数据库的。可能最新的写入还卡在某处的传输过程中。

>如果我们要保证高一致性,则我们不得不等待这个新的写入或者针对这次查询返回一个错误。因此,我们牺牲了可用性来确保查询返回的数据是一致的。

选择系统需要的

  对于有些人,在一致性与可用性之间的选择真正是一个哲学讨论的课题,实际上很少做过。这些分布式系统的可靠性是相当的好。即便如此,问题确实发生了。AWS就刚刚在2020年感恩节之前经历了一次大停电。

  这个理论说在三个特性中你们只能拥有两个选择,而专业人员说情况并不总是如此。Eric Brewer,计算机科学家与CAP理论的初始提出者,澄清了一些关于这个理论的困惑,将它从僵硬的“不是/就是‘’说法扩展到依赖于系统的需要。他说:

  现代的CAP目标应该是一致性与可用性的最大的结合,这对于特定应用有意义。这样一种方法包含网络分区期间的操作与后期恢复的计划,从而帮助设计者超越它历史以来被意识到的限制来思考CAP。

  挑选哪种数据库类型时,一致性与可用性的选择随之而来,比如SQL对NoSQL。NoSQL数据库可以基于是否支持高可用性或高一致性来进行分类。

NoSQL

  NoSQL数据库不需要“预定义的模式规范”(SCHEMA),并且不强制表间的关系。它的全部文档都是JSON文档,是完整的实体,人们可以方便地阅读与理解。他们广泛被认为:

易用

性能可扩展

恢复力强

广泛的可用性

  NoSQL数据库例子包括:

>Cloud Firestore

>Firebase Real-time DB

>MongoDB

>MarkLogic

>Couchbase

>CloudDB

>Amazon DynamoDB

数据库中的一致性

  当返回信息值需要保证准确,则应该使用强一致性数据库。

  金融数据是一个好的例子。当一个用户登录到他们的银行业务机构时,他们不想看到一个无数据返回的错误、或相比实际数值偏高或偏低。银行业务APP应该返回用户账户信息的准确数值。这种情况下,银行应该依赖强一致性数据库。

  强一致性数据库例子包括:

>银行账户余额

>文本信息

  一致性数据库选项:

>MongoDB

>Redis

>HBase

数据库中的可用性

  当服务比信息更加重要时,应该使用强可用性数据库。

  一个使用高可用性数据库的例子可以在电子商务业务中看到。在线商店想要使他们的商店和购物车功能7*24小时可用,从而使购物者可以按需随时购物。

  强可用性数据库选项:

>Cassandra

>DynamoDB

>Cosmos DB

  一些候选数据库,比如Cosmos 和Cassandra,允许用户操作一个旋钮,来确保他们的偏好:一致性或者可用性。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
第一部分  NoSQL入门 第1章  NoSQL的概念及适用范围 2 1.1  定义和介绍 3 1.1.1  背景与历史 3 1.1.2  大数据 5 1.1.3  可扩展性 7 1.1.4  MapReduce 8 1.2  面向列的有序存储 9 1.3  键/值存储 11 1.4  文档数据库 14 1.5  图形数据库 15 1.6  小结 16 第2章  NoSQL上手初体验 17 2.1  第一印象——两个简单的例子 17 2.1.1  简单的位置偏好数据集 17 2.1.2  存储汽车品牌和型号数据 22 2.2  使用多种语言 30 2.2.1  MongoDB驱动 30 2.2.2  初识Thrift 33 2.3  小结 34 第3章  NoSQL接口与交互 36 3.1  没了SQL还剩什么 36 3.1.1  存储和访问数据 37 3.1.2  MongoDB数据存储与访问 37 3.1.3  MongoDB数据查询 41 3.1.4  Redis数据存储与访问 43 3.1.5  Redis数据查询 47 3.1.6  HBase数据存储与访问 50 3.1.7  HBase数据查询 52 3.1.8  Apache Cassandra数据存储与访问 54 3.1.9  Apache Cassandra数据查询 55 3.2  NoSQL数据存储的语言绑定 56 3.2.1  Thrift 56 3.2.2  Java 56 3.2.3  Python 58 3.2.4  Ruby 59 3.2.5  PHP 59 3.3  小结 60 第二部分  NoSQL基础 第4章  理解存储架构 62 4.1  使用面向列的数据库 63 4.1.1  使用关系型数据库中的表格和列 63 4.1.2  列数据库对比RDBMS 65 4.1.3  列数据库当做键/值对的嵌套映射表 67 4.1.4  Webtable布局 70 4.2  HBase分布式存储架构 71 4.3  文档存储内部机制 73 4.3.1  用内存映射文件存储数据 74 4.3.2  MongoDB集合和索引使用指南 75 4.3.3  MongoDB的可靠性和耐久性 75 4.3.4  水平扩展 76 4.4  键/值存储Memcached和Redis 78 4.4.1  Memcached的内部结构 78 4.4.2  Redis的内部结构 79 4.5  最终一致性非关系型数据库 80 4.5.1  一致性哈希 81 4.5.2  对象版本 82 4.5.3  闲话协议和提示移交 83 4.6  小结 83 第5章  执行CRUD操作 84 5.1  创建记录 84 5.1.1  在以文档为中心的数据库中创建记录 85 5.1.2  面向列数据库的创建操作 91 5.1.3  键/值映射表的创建操作 93 5.2  访问数据 96 5.2.1  用MongoDB访问文档 96 5.2.2  用HBase访问数据 97 5.2.3  查询Redis 98 5.3  更新和删除数据 98 5.3.1  使用MongoDB、HBase和Redis更新及修改数据 98 5.3.2  有限原子性和事务完整性 99 5.4  小结 100 第6章  查询NoSQL存储 101 6.1  SQL与MongoDB查询功能的相似点 101 6.1.1  加载MovieLens数据 103 6.1.2  MongoDB中的MapReduce 108 6.2  访问HBase等面向列数据库中的数据 111 6.3  查询Redis数据存储 113 6.4  小结 116 第7章  修改数据存储及管理演进 117 7.1  修改文档数据库 117 7.1.1  弱schema的灵活性 120 7.1.2  MongoDB的数据导入与导出 121 7.2  面向列数据库中数据schema的演进 124 7.3  HBase数据导入与导出 125 7.4  键/值存储中的数据演变 126 7.5  小结 126 第8章  数据索引与排序 127 8.1  数据库索引的基本概念 127 8.2  MongoDB的索引与排序 128 8.3  MongoDB里创建和使用索引 131 8.3.1  组合与嵌套键 136 8.3.2  创建唯一索引和稀疏索引 138 8.3.3  基于关键字的搜索和多重键 139 8.4  CouchDB的索引与排序 140 8.5  Apache Cassandra的索引与排序 141 8.6  小结 143 第9章  事务和数据完整性的管理 144 9.1  RDBMS和ACID 144 9.2  分布式ACID系统 147 9.

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值