How to beat the CAP theorem

2023-12-29 17:50
文章标签 cap beat theorem

本文主要是介绍How to beat the CAP theorem,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

http://nathanmarz.com/blog/how-to-beat-the-cap-theorem.html

http://kb.cnblogs.com/page/124567/

 

面对大数据, 提出一种不同的思路

传统的方法在保证可用性的前提下, 必须用很复杂的逻辑来保证数据的最终一致性, 比如Dynamo的方案, 矢量时钟(vector clock)记录数据的版本历史合并...

作者认为复杂的原因不是 CAP 系统,而是数据增量算法和数据的可变状态

所以他的solution是,

首先, 数据是与时间相关和不可变的, CR(而非CRUD), 只能create新数据, 而非update历史数据

其次, 采用全数据分析, 而不是增量分析, 符合作者对数据系统的定义, 全集的查询

全集查询, 我们可以使用Hadoop, 但是问题是这个比较慢, 会有几个小时的延迟, 但是可以简单的保证最终一致性, 最终的结果最多延迟几个小时, 不会丢失, 不会被更改, 因为数据不可变.

问题是某些领域无法容忍几个小时的延长, 那么就加上实时的分析, 实时的分析是一个补充, 不用保证强一致性, 更加可以采用近似的算法来提高处理的效率, 反正最终会由全集查询给出正确的答案, 以保证最终的一致性

 

-------------------------------------------------------------------------------------------------------------------------------------------------------

 

CAP 定理指出,一个数据库不可能同时满足一致性(Consistency)、可用性(Availability)和分区容错性(Partition-Tolerance)

而分区容错性是不能牺牲的,因此只能在一致性和可用性上做取舍,如何处理这种取舍正是目前 NoSQL 数据库的核心焦点

但是牺牲可用性时问题会很多,牺牲一致性时构建和维护系统的复杂度又很高,但这里又只有两个选择,不管怎样做都会不完美。CAP 定理是改不了的,那么还有什么其他可能的选择吗?

 

你并不能避开 CAP 定理,但可以把复杂的问题独立出来,免得你丧失对整个系统的掌控能力。CAP 定理带来的复杂性,其实是我们如何构建数据系统这一根本问题的体现。 
其中有两点特别重要:数据库中可变状态和更新状态的增量算法 (the use of mutable state in databases and the use of incremental algorithms to update that state) 
复杂性正是这两点和 CAP 定理之间的相互作用导致的。

本文将挑战你对数据系统如何构建这一问题的假设,通过颠覆传统数据系统构建方法,我会让大家看到一个前所未见的优雅、扩展性强、健壮的数据系统。

 

什么是数据系统?

下面这个简单的定义:

Query = Function (All Data)

概括了数据库和数据系统的所有领域。每一个领域——有 50 年历史的 RDBMS、索引、OLAP、OLTP、MapReduce、EFL、分布式文件系统、流处理器、NoSQL 等——都可以被概括进这个方程。

所谓数据系统就是要回答数据集问题的系统,这些问题我们称之为“查询”。上面的方程表明,查询就是数据上的一个函数。

A data system answers questions about a dataset. Those questions are called "queries". And this equation states that a query is just a function of all the data you have.

这个方程里面有两个关键概念:数据、查询。这两个完全不同的概念经常被混为一谈,所以下面来看看这两个概念究竟是什么意思。

数据

关于“数据”有两个关键的性质。

首先,数据是跟时间相关的,一个真实的数据一定是在某个时间点存在于那儿。比如,假如 Sally 在她的社交网络个人资料中写她住在芝加哥,你拿到的这个数据肯定是她某个时间在芝加哥填写的。假如某天 Sally 把她资料里面居住地点更新为亚特兰大,那么她肯定在这个时候是住在亚特兰大的,但她住在亚特兰大的事实无法改变她曾经住在芝加哥这个事实——这两个数据都是真实的。

 

其次,数据无法改变。由于数据跟某个时间点相关,所以数据的真实性是无法改变的。没有人可以回到那个时间去改变数据的真实性,这说明了对数据操作只有两种:读取已存在的数据和添加更多的新数据。 
那么 CRUD 就变成了 CR【译者注:CRUD 是指 Create Read Update Delete,即数据的创建、读取、更新和删除】。

查询

查询是一个针对数据集的推导,就像是一个数学里面的定理。

前面我已经定义查询是整个数据集上的函数,当然,不是所有的查询都需要整个数据集,它们只需要数据集的一个子集。但我的定义是涵盖了所有的查询类型,如果想要“打败”CAP 定理,我们需要能够处理所有的查询。

打败 CAP 定理

CAP 定理仍然适用, 但是通常的那些因为 CAP 定理带来的问题,都可以通过不可改变的数据和从原始数据中计算查询来规避 (using immutable data and computing queries from scratch)

所谓打败CAP, 就是在保证可用性的情况下, 还能保证一致性.

这里的关键在于数据是不可变的。不可变数据意味着这里没有更新操作,所以不可能出现数据复制不同这种不一致的情况,也意味着不需要版本化的数据、矢量时钟或者读取修复。 
之前的复杂度主要来自增量更新操作和 CAP 定理之间的矛盾,在最终一致性系统中可变的值需要通过读取修复来保证最终一致性。通过使用不可变数据,去掉增量更新,使用不可变数据,每次从原始数据计算查询,你可以规避那些复杂的问题。CAP 定理就被打败了。

在数据不可变的情况下, 可以给设计带来很大的简化这点上, 很类似MVCC和HBase

MVCC 和 HBase 类似的行版本管理并不能达到上面人为错误容忍级别。MVCC 和 HBase 行版本管理不能永久保存数据,一旦数据库合并了这些版本,旧的数据就会丢失。只有不可变数据系统能够保证你在写入错误数据时可以找到一个恢复数据的方法。

 

批量计算

“如何让任意一个函数可以在任意一个数据集上快速执行完成”这个问题太过于复杂,所以我们先放宽了一下这个问题依赖条件。首先假设,可以允许数据滞后几小时。放宽这个条件之后,我们可以得到一个简单、优雅、通用的数据系统构建解决方案。之后,我们会通过扩展这个解决方案使得它可以不用放宽条件来解决问题。

 

我们将数据以文件形式存储到 HDFS 中去。文件可以包括一个数据记录序列。新增数据时,我们只需要在包括所有数据的文件夹中新增一个包含这条新记录的文件即可。像这样在 HDFS 存储数据满足了“能够很容易存储大的、不断增长的数据集”这个要求。

预计算数据集上的查询也很直观,MapReduce 是一个足够复杂的框架,使得几乎所有的函数都可以按照多个 MapReduce 任务这种方式实现。像 Cascalog、Cascading 和 Pig 这样的工具使实现这些函数变得十分简单。

最后,为了可以快速访问这些预计算查询结果,你需要对查询结果进行索引,这里有许多数据库可以完成这个工作。ElephantDB 和 Voldemort read-only 可以通过从 Hadoop 中导出 key/value 数据来加快查询速度。这些数据库支持批量写和随机读,同时不支持随机写。随机写使得数据库变得复杂,所以通过不支持随机写,这些数据库设计得特别简洁,也就几千行代码而已。简洁使得这些数据库鲁棒性变得非常好。

 

实时层

上面的批量处理系统几乎完全解决了在任意数据集上运行任意函数的实时性需求。任何超过几个小时的数据已经被计算进入了批处理视图中,所以剩下来要做的就是处理最近几个小时的数据。我们知道在最近几小时数据上进行查询比在整个数据集上查询要容易,这是关键点。

为了处理最近几个小时的数据,需要一个实时系统和批处理系统同时运行。这个实时系统在最近几个小时数据上预计算查询函数。要计算一个查询函数,需要查询批处理视图和实时视图,并把它们合并起来以得到最终的数据。

图 3 计算一个查询

在实时层,可以使用 Riak 或者 Cassandra 这种读写数据库,而且实时层依赖那些数据库中对状态更新的增量算法。

让 Hadoop 模拟实时计算的工具是 Storm。我写 Storm 的目的是让 Hadoop 可以健壮、可扩展地处理大量的实时数据。Storm 在数据流上运行无限的计算,并且对这些数据处理提供了强有力的保障。

图 4 批处理/实时架构示例

 

批处理层+实时层、CAP 定理和人为错误容忍性

貌似又回到一开始提出的问题上去了,访问实时数据需要使用 NoSQL 数据库和增量算法。这就说明回到了版本化数据、矢量时钟和读取修复这些复杂问题中来。但这是有本质区别的。由于实时层只处理最近几小时的数据,所有实时层的计算都会被最终批处理层重新计算。所以如果犯了什么错误或者实时层出了问题,最终都会被批处理层更正过来,所有复杂的问题都是暂时的

 

总结

让可扩展的数据系统复杂的原因不是 CAP 系统,而是数据增量算法和数据的可变状态。 
最近由于分布式数据库的兴起导致了复杂度越来越不可控。前面讲过,我将挑战对传统数据系统构建方法的假设。我把 CRUD 变成了 CR,把持久化层分成了批处理和实时两个层,并且得到对人为错误容忍的能力。我花费了多年来之不易的经验打破我对传统数据库的假设,并得到了这些结论。

批处理/实时架构有许多有趣的能力我并没有提到,下面我总结了一些。

  • 算法的灵活性。随着数据量的增长,一些算法会越来越难计算。比如计算标识符的数量,当标识符集合越来越大时,将会越来越难计算。批处理/实时分离系统给了你在批处理系统上使用精确算法和在实时系统上使用近似算法的灵活性。批处理系统计算结果会最终覆盖实时系统的计算结果,所以最终近似值会被修正,而你的系统拥有了“最终精确性”。
  • 数据结构迁移变得很容易。数据结构迁移的难题将一去不复返。由于批量计算是系统的核心,很容易在整个系统上运行一个函数,所以很容易更改你数据的结构或者视图。
  • 简单的 Ad-Hoc 网络。由于批处理系统的任意性,使得你可以在数据上进行任意查询。由于所有的数据在一个点上都可以获取,所以 Ad-Hoc 网络变得简单而且方便。
  • 自我检查。由于数据是不可变的,数据集就可以自我检查。数据集记录了它的数据历史,对于人为错误容忍性和数据分析很有用。
本文章摘自博客园,原文发布日期:2012-08-07

这篇关于How to beat the CAP theorem的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/550218

相关文章

分布式系统理论基础二-CAP

GitHub:https://github.com/wangzhiwubigdata/God-Of-BigData 关注公众号,内推,面试,资源下载,关注更多大数据技术~大数据成神之路~预计更新500+篇文章,已经更新50+篇~ 引言 CAP是分布式系统、特别是分布式存储领域中被讨论最多的理论,“什么是CAP定理?”在Quora 分布式系统分类下排

阅读笔记(三)CAP理论相关

一. 简介   本文分享一些关于CAP原理介绍的文章和重点内容。 二. 通俗易懂的CAP事例   《A plain english introduction to CAP Theorem》一文用一个通俗易懂的事例讲述了CAP原理。下面是简单概括后的例子。 有一天,你发出广告为他人提供了一项服务:帮他人记录各种信息,并提供查询功能。(单服务器架构)随着业务的增多,一个人渐渐忙不过来了,可能遇

数据库 CAP定理(布鲁尔定理)

在理论计算机科学中,CAP定理(CAP theorem),又被称作布鲁尔定理(Brewer's theorem),它指出对于一个分布式计算系统来说,不可能同时满足以下三点 选项具体意义一致性(Consistency)所有节点访问同一份最新的数据副本可用性(Availability)每次请求都能获取到非错的响应,但是不保证获取的数据为最新数据分区容错性(Partition tolerance)分布

Theorem,Proposition, Lemma 和 Corollary是什么 区别关系

文章中最重要的几个结论用 Prop 或 Thm. 其中有比较普遍意义的(可能被他人引用的)用Thm,比较特定、适用范围不大的用Prop。 用来推出这些 Thm 或 Prop 的引理用 Lemma. Theorem:定理。是文章中重要的数学化的论述,一般有严格的数学证明。 Proposition:可以翻译为命题,经过证明且interesting,但没有Theorem重要,比较常用。

什么是CAP理论和BASE思想?

CAP定理  分布式系统的三个指标: C(一致性) A(可用性) P(分区容错性) Eric Brewer说,分布式系统无法同时满足CAP三个指标,这个结论就叫做CAP定理。 Consitency 用户访问分布式系统中的任意节点,得到的数据必须是一致的  Availability 用户访问分布式系统时,读或写操作总能成功;只能读不能写,或只能写不能读,或两者都不能执行,说

SAP CAP(Cloud Application Programming)知识介绍和学习路径

1. 框架简介 1.1 什么是CAP? CAP(Cloud Application Programming)是SAP推出的一种现代化开发框架,旨在简化和加速云原生应用程序的开发。 CAP框架基于开放标准和技术,如Node.js、Java、OData和SQL,提供了一套工具和库,帮助开发人员快速构建、扩展和运行企业级应用。 1.2 CAP的基础技术框架 CAP框架主要由以下几个部分组成:

业务多活架构和分布式CAP实战

点击上方“朱小厮的博客”,选择“设为星标”后台回复"书",获取后台回复“k8s”,可领取k8s资料 自2008 年双11 以来,在每年双 11 超大规模流量的冲击上,蚂蚁金服都会不断突破现有技术的极限。2010 年双 11 的支付峰值为 2 万笔/分钟,到 2017 年双 11 时这个数字变为了 25.6 万笔/秒。 2018 年双 11 的支付峰值为 48 万笔/秒,2019 年双 11 支

微信红包的CAP

点击上方“朱小厮的博客”,选择“设为星标” 后台回复"书",获取 后台回复“k8s”,可领取k8s资料 本材料出自网络公开材料 不知道为啥 it168 暂时不能访问 http://wenku.it168.com/d_001578840.shtml 其它参考材料: https://www.open-open.com/lib/view/open1427

CAP为什么不能同时满足, BASE理论

在分布式系统中, 我们经常会提到CAP理论和BASE理论. 其中CAP代表什么呢? C(Consistency): 一致性, 就是说我们部署一套系统, 肯定都是部署在多台机器上, 形成一个集群, 而集群中的各个结点上面的数据要保持一致.A(Availability): 可用性, 可用性就是指各个结点都必须保持可用.P(Partition tolerance): 分区容错性, 这点是分布式系

分布式设计原理——CAP原则

1998年,加州大学的计算机科学家 Eric Brewer 提出,分布式系统有三个指标。         一致性(C):在分布式系统中的所有数据备份,在同一时刻是否同样的值,即写操作之后的读操作,必须返回该值。(分为弱一致性、强一致性和最终一致性)         可用性(A):在集群中一部分节点故障后,集群整体是否还能响应客户端的读写请求。(对数据更新具备高可用性)         分区容忍性