相比关系型数据库,NoSQL解决方案提供了shared-nothing、容错和可扩展的分布式架构等特性,同时也放弃了关系型数据库的强数据一致性和隔离性,美其名曰:“最终一致性”。

最终一致性将读取不一致和不可靠的写带来的麻烦推给了软件开发人员。以如此弱的数据保证能力构建一个如今互联网需求的复杂、可扩展的系统是异常困难的,我们需要停止接受最终一致性,去探索能提供数据强一致性的可扩展的、分布式数据库设计。

最终一致性的概念频繁出现在分布式数据库的讨论中,主要的NoSQL数据库像Riak、Couchbase和DynamoDB,为客户端程序提供了“最终一致性”,MongoDB和Cassandra在一些配置中保证最终一致性。

最终一致性意味着:该系统最终一致——如果相当长的一段时间内,没有更新一个给定的数据项,最终,硬件和网络故障修复以后,所有该项目的读取都将返回相同一致的值。这也意味着:如果客户没有等足够长的时间,他们根本不能保证一致性。

最终一致性的问题

虽然最终一致性被吹捧为一种新的模式,但它同样有一定的负面含义,因为它不是在所有的情况下都很吸引人,这和分布式系统是一样的。

当一个工程师使用最终一致性数据库构建一个应用程序时,他们每次从数据库访问数据都要解决一些棘手的问题:

  • 如果数据库读取返回一个任意的旧值对应用程序的影响是什么?
  • 如果对数据库的修改顺序发生了错误对应用程序的影响是什么?
  • 如果我在其他用户修改数据库时,读取数据对应用程序的影响是什么?
  • 我的数据库更新对其它试图读取数据的客户有什么影响?

这是一个繁重的任务,并且占用大量的开发人员的时间。从本质上说,工程师需要手动去大量的工作,以确保多个用户不产生冲突和处理过期数据。

最终一致性带给软件开发者巨大的负担,在一个不能保证准确性的数据库上,设计一个准确的应用程序是一个巨大的挑战。谷歌最近发布的一篇关于其F1数据库的论文中指出了最终一致性的痛点:

谷歌在最终一致性系统方面有很多的经验。在所有这些系统中,我们发现开发人员花费相当一部分时间构建极其复杂且容易出错的机制来应对最终一致性和处理可能过时的数据。我们认为这是一个不可接受的强加给开发者的负担,并且一致性问题应该在数据库级别解决。

为什么是最终一致性?

构建一个最终一致性数据库有两个优势,一是构建一个弱一致性保证的系统更容易,第二个是从大型数据库机器中分割出来的数据库服务器仍然可以接受应用程序的写入。然而,第二个理由是由第一代NoSQL系统的创始人给出的,其可信度值得探究。

许多第一代NoSQL系统设计都是基于对Eric Brewer的CAP定理的早期理解:(C)onsistency、(A)vailability和(P)artition-tolerance三者只能满足两个。

这个定理适用于任何通信网络可能出错的分布式系统,根据这个原理,假设系统的可用性是必不可少的,早期的NoSQL数据库放弃了一致性(即采用了最终一致性)。

怎样解决这个问题?

CAP理论中的可用性,意味着每一个节点即使无法与系统其它部分通信时,仍然能够读取和写入。很容易看到可用性和一致性的矛盾:如果一个节点不能与其它任何节点通信,怎么能保持它们的一致性?

然而,一个优秀的备选方案是可能的:一个分区内部分结点可读写的系统是不可用的,从CAP理论来看是不可用的,但是从用户仍然能够与连接的节点进行交互的角度来说是可用的。可以构建这种没有单点故障的容错型数据库,而不是诉诸最终一致性。

处理最终一致性带来的麻烦不应该交给开发人员去处理。供应商应该停止以CAP定理作为理由来推崇最终一致性。新的分布式、一致的系统,例如谷歌的Spanner,在强一致性和高可用性之间演示了虚假的一种权衡。

下一代的商业分布式强一致性数据库虽然不容易构建,但它们将比它们的前任更加强大。像第一代,它们拥有真正的shared-nothing分布式架构、容错性和可扩展性。然而,相比最终一致性,他们也应该采取更强有力的模型如ACID,使他们在企业生产工具中更强大。

下一代NoSQL:最终一致性的末日的更多相关文章

  1. NoSQL的三大基石(CAP、BASE和最终一致性)

    CAP,BASE和最终一致性是NoSQL数据库存在的三大基石.而五分钟法则是内存数据存储了理论依据.这个是一切的源头. CAP C: Consistency 一致性 A: Availability 可 ...

  2. NoSql的三大基石:CAP理论&BASE&最终一致性

    关系型数据库的局限 NoSql出现在关系型数据库之后,主要是为了解决关系型数据库的短板,我们先来看看随着软件行业的发展,关系型数据库面临了哪些挑战: 1.高并发 一个最典型的就是电商网站,例如双11, ...

  3. NoSQL生态系统——一致性RWN协议,向量时钟,gossip协议监测故障

    13.5 一致性 在NoSQL中,通常有两个层次的一致性:第一种是强一致性,既集群中的所有机器状态同步保持一致.第二种是最终一致性,既可以允许短暂的数据不一致,但数据最终会保持一致.我们先来讲一下,在 ...

  4. CAP和最终一致性

    查阅资料整理了最终一致性.CAP 相关的内容.由于图省事儿,没有做文字的整理记载,只有 slides 和一些查阅过的链接,大家将就着看.欢迎指正. slides: slides 链接:请戳这里 背景 ...

  5. 解决分布式事务基本思想Base和CPA理论、最终一致性|刚性事务、柔性事务

    在学习解决分布式事务基本思路之前,大家要熟悉一些基本解决分布式事务概念名词比如:CAP与Base理论.柔性事务与刚性事务.理解最终一致性思想,JTA+XA.两阶段与三阶段提交等. 如何保证强一致性呢? ...

  6. 脑裂 CAP PAXOS 单元化 网络分区 最终一致性 BASE

    阿里技术专家甘盘:浅谈双十一背后的支付宝LDC架构和其CAP分析 https://mp.weixin.qq.com/s/Cnzz5riMc9RH19zdjToyDg 汤波(甘盘) 技术琐话 2020- ...

  7. [转]CAP原理与最终一致性 强一致性 透析

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

  8. 大数据 --> CAP原理和最终一致性

    CAP原理和最终一致性 CAP原理和最终一致性(Eventually Consistency)

  9. .NET Core微服务之基于MassTransit实现数据最终一致性(Part 1)

    Tip: 此篇已加入.NET Core微服务基础系列文章索引 一.预备知识:数据一致性 关于数据一致性的文章,园子里已经有很多了,如果你还不了解,那么可以通过以下的几篇文章去快速地了解了解,有个感性认 ...

随机推荐

  1. 学习Webservice测试

    2014-04-01 可用Myeclipse10自带工具生成客户端, 也可用CXF生成,注意,不要用CXF3.0.0milestone,该版本不能生成,请用CXF2.2.8 2015-01-12 下载 ...

  2. spark1.2.0版本SparkSQL使用parquet类型注意事项

    在Spark1.2.0版本中是用parquet存储类型时注意事项: sql语句: select * from order_created_dynamic_partition_parquet; 在spa ...

  3. C++静态代码分析工具推荐——PVS-Studio

    长假归来,最近一直没更新,节前本来就想写这篇了,一直到今天才有时间. 关于静态代码分析在维基百科上可以查到很详细的介绍:https://en.wikipedia.org/wiki/List_of_to ...

  4. mysql 二进制安装文件 下载

    在linuex环境下安装mysql,二进制安装包是最合适的方式,下载下来不用编译就可用了. 官方说明文档:http://dev.mysql.com/doc/refman/5.1/en/binary-i ...

  5. Andriod项目开发实战(2)——JSON和XML的区别

    详情见: 1.http://www.cnblogs.com/SanMaoSpace/p/3139186.html 2.http://www.cnblogs.com/yank/p/4028266.htm ...

  6. 使用CORS:跨域两三事

    本文为译文. 简介 APIS是可以将富网页应用串连在一起的线程.但是这个应用难以转给浏览器,跨域请求技术的选择被限制了,类似JSONP(由于安全考虑,使用会被限制),或者配置代理(设置和维护都比较头痛 ...

  7. jetty简介

    Jetty 是一个开源的servlet容器,它为基于Java的web容器,例如JSP和servlet提供运行环境.Jetty是使用Java语言编写的,它的API以一组JAR包的形式发布.开发人员可以将 ...

  8. c++ 类模版、成员函数模版、函数模版 用法

    C++函数模版与类模版. template <class T> void SwapFunction(T &first, T &second){ }//函数模版 templa ...

  9. C/C++中几种操作位的方法

    参考How do you set, clear and toggle a single bit in C? c/c++中对二进制位的操作包括设置某位为1.清除某位(置为0).开关某位(toggling ...

  10. centos kvm

    http://linux.dell.com/files/whitepapers/KVM_Virtualization_in_RHEL_6_made_easy.pdf http://linux.dell ...