文档章节

数据一致性

爱宝贝丶
 爱宝贝丶
发布于 2018/12/31 08:57
字数 4173
阅读 37
收藏 0

1. 概念

  • 数据一致性就是指在对一个副本数据进行更新的同时,必须确保也能够更新到其他的副本,否则不同的副本之间的数据将不再一致。

2. 一致性级别

  • 强一致性:这种一致性级别是最符合用户直觉的,它要求系统写入什么,读出来的也会是什么,用户体验好,但实现起来往往对系统的性能影响比较大;
  • 弱一致性:这种一致性级别约束了系统在写入成功后,不承诺立即可以读到写入的值,也不具体承诺多久之后数据能够达到一致,但会尽可能地保证到某个时间级别(比如秒级)后,数据能够达到一致状态。弱一致性还可以再进行细分:
    • 会话一致性:该一致性级别只保证对于写入的值,在同一个客户端会话中可以立即读到一致的值,但其他的会话不能保证;
    • 用户一致性:该一致性级别只保证对于写入的值,在同一个用户中可以立即读到一致的值,但其他用户不能保证。
  • 最终一致性:最终一致性是弱一致性的一个特例,系统会保证在一定时间内,能够达到一个数据一致的状态。这里之所以将最终一致性单独提出来,是因为它是弱一致性中非常重要的一种一致性模型,也是业界在大型分布式系统的数据一致性上比较推崇的模型。

3. 分布式的特点

  • 分布性:分布式系统中的多台计算机都会在空间上随意分布,同时,机器的分布情况也会随时变动;
  • 对等性:分布式系统中的计算机没有主/从之分,既没有控制整个系统的主机,也没有被控制的从机,组成分布式系统的所有计算机节点都是对等的。副本是分布式系统最常见的概念之一,指的是分布式系统对数据和服务提供的一种冗余方式,常见的副本有数据副本和服务副本。数据副本指的是在不同的节点上持久化同一份数据,当某一个节点上存储的数据丢失时,可以从副本上读取到该数据,这是解决分布式系统数据丢失问题最有效的手段;服务副本指的是多个节点提供同样的服务,每个节点都有能力接收来自外部的请求并进行相应的处理;
  • 并发性:同一个分布式系统中的多个节点,可能会并发的操作一些共享资源,诸如数据库或分布式存储等,如何准确并高效地协调分布式并发操作也称为了分布式系统架构与设计中最大的挑战之一;
  • 缺乏全局时钟:分布式系统中,很难定义两个事件究竟谁先谁后,因为分布式系统缺乏一个全局的时钟序列控制。
  • 故障总是会发生:任何在设计阶段考虑到的异常情况,一定会在系统实际运行中发生,并且,在系统实际运行过程中还会遇到很多在设计时未能考虑到的异常故障。

4. 分布式环境的各种问题

  • 通信异常:由于网络本身的不可靠性,分布式系统需要在各个节点之间进行网络通信,因此每次网络通信都会伴随着网络不可用的风险,网络光纤、路由器或是DNS等硬件设备或是系统不可用都会导致最终分布式系统无法顺利完成一次网络通信;
  • 网络分区:当网络由于发生异常情况,导致分布式系统中部分节点之间的网络延迟不断增大,最终导致组成分布式系统的所有节点中,只有部分节点之间能够进行正常通信,而另一些节点则不能,我们称之为网络分区或脑裂;
  • 三态:分布式系统的每一次请求与响应,存在特有的“三态”的概念,即成功、失败与超时;
    • 由于网络原因,该请求并没有被成功地发送到接收方,而是在发送过程中就发生了消息丢失的现象;
    • 该请求成功的被接收方接收后,并进行了处理,但是在将响应反馈给发送方的过程中,发生了消息丢失现象;
  • 节点故障:指的是组成分布式系统的服务器节点出现的宕机或“僵死”现象。

5. 事务的ACID理论

  • 事务是由一系列对系统中数据进行访问与更新的操作所组成的一个程序执行逻辑单元,狭义上的事务特指数据库事务。一方面,当多个应用程序并发访问数据库时,事务可以在这些应用程序之间提供一个隔离方法,以防止彼此的操作互相干扰。另一方面,事务为数据库操作序列提供了一个从失败中恢复到正常状态的方法,同时提供了数据库即使在异常状态仍能保持数据一致性的方法。
  • 原子性:事务的原子性是指事务必须是一个原子的操作序列单元,事务中包含的各项操作在一次执行过程中,只允许出现以下两种状态之一:全部执行成功;全部不执行。
  • 一致性:事务的一致性是指事务的执行不能破坏数据库数据的完整性和一致性,一个事务在执行之前和执行之后,数据库都必须处于一致性状态。也就是说,事务执行的结果必须是使数据库从一个一致性状态转变到另一个一致性状态,因此当数据库只包含成功事务提交的结果时,就能说数据库处于一致性状态。
  • 隔离性:事务的隔离性是指在并发环境中,并发的事务是相互隔离的,一个事务的执行不能被其他事务干扰。也就是说,不同的事务并发操纵相同的数据时,每个事务都有各自完整的数据空间,即一个事务内部的操作及使用的数据对其他并发事务是隔离的,并发执行的各个事务之间不能互相干扰。事务隔离性存在如下四个级别:
    • 未授权读(Read Uncommitted):该隔离级别允许脏读,其隔离级别最低。换句话说,如果一个事务正在处理某一数据,并对其进行了更新,但同时尚未完成事务,因此还未进行事务提交,与此同时,允许另一个事务也能够访问到该数据;
    • 授权读取(Read Committed):它与Read Uncommitted的区别就是Read Committed只允许读取已经提交的数据;
    • 可重复读(Repeatable Read):简单的说,就是保证在事务处理过程中,多次读取同一个数据时,其值都和开始时刻是一致的。因此该隔离级别解决了不可重复读取和脏读的问题,但是没有解决幻读的问题。所谓的幻读指的是,在同一时刻,一个事务对某一批量的数据进行处理,比如读取id>5的数据或是更新type=1的数据,在同一时刻,另一个事务进行了某个插入操作,而插入的数据正好满足上一个事务的条件,那么该事务就会发现,其进行批量处理之后,还存在没有处理到的数据,这些数据就像幻影数据一样。这里需要区别的是,对于不可重复读的问题和幻读的问题,不可重复读针对的是已经存在的数据,而幻读则针对的是当前不存在的数据。
    • 串行化(Serializable):该隔离级别是最严格的事务隔离级别。它要求所有事务都被串行执行,即事务只能一个接一个地进行处理,不能并发执行。
  • 持久性:事务的持久性也被称为永久性,是指一个事务一旦提交,那么它对数据库中对应数据的状态变更就应该是永久性的。换句话说,一旦某个事务成功结束,那么它对数据库所做的变更就必须永久保存下来,即使发生系统崩溃或机器宕机等故障,只要数据库能够重新启动,那么一定能够将数据恢复到事务成功结束时的状态。

6. 分布式事务

  • 概念:分布式事务是指事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于分布式系统的不同节点之上。
  • CAP理论:一个分布式系统不可能同时满足一致性(C:Consistency)、可用性(A:Availability)和分区容错性(P:Partition tolerance)这三个基本需求,最多只能同时满足其中两项。
    • 一致性:在分布式环境中,一致性是指数据在多个副本之间能够保持一致的特性。在一致性的需求下,当一个系统在数据一致的状态下执行更新操作后,应该保证系统的所有数据副本仍然处于一致的状态;
    • 可用性:可用性是指系统提供的服务必须一直处于可用的状态,对于用户的每一个操作请求总是能够在有限的时间内返回结果;
      • 有限的时间:对于用户请求,系统必须存在一个合理的响应时间,否则用户便会对系统感到失望,对于不同的系统,这个“合理的响应时间”是不同的;
      • 返回结果:它要求系统在完成对用户请求的处理后,返回一个正常的响应结果,无论是成功还是失败;
    • 分区容错性:分布式系统在遇到任何网络分区故障的时候,仍然需要能够保证对外提供满足一致性和可用性的服务,除非是整个网络环境都发生了故障。
  • CAP理论说明:
    • 对于一个分布式系统,不可能同时满足一致性、可用性和分区容错性这三个需求;
    • 需要明确的一点是,对于一个分布式系统而言,分区容错性可以说是一个基本要求。因为系统是分布式的,因而必然会出现因网络故障灯原因导致的节点不可用情况,因而分区容错性是分布式系统必须要面对和解决的问题;
    • 在可用性和一致性之间进行权衡时,需要明确的是,放弃一致性指的是放弃数据的强一致性,而保留数据的最终一致性。这样的系统无法保证数据保持实时一致性,但是能够承诺的是,数据最终会达到一个一直的状态。这就引入了一个时间窗口的概念,具体多久能够达到数据一致取决于系统的设计,主要包括数据副本在不同节点之间的赋值时间长短。
  • BASE理论:BASE是Basic Abailable(基本可用)、Soft State(软状态)和Eventually Consistency(最终一致性)三个短语的简写。
  • BASE是对CAP中一致性和可用性权衡的结果,其来源于对大规模互联网系统分布式实践的总结,是基于CAP定理逐步演化而来的,其核心思想是即使无法做到强一致性,但每个应用都可以根据自身的业务特点,采用适当的方式来使系统达到最终一致性。
    • 基本可用:基本可用是指分布式系统在出现不可预知故障的时候,允许损失部分可用性,但需要注意的是,这绝不等价于系统不可用;
      • 响应时间上的损失:正常情况下,一个请求需要在0.5秒之内返回结果,但是由于系统故障,查询结果的响应时间增加到了1~2秒;
      • 功能上的损失:在某些情况下,比如购物网站进行大促时,为了保证系统整体可用,部分消费者可能会被引导到一个降级页面。
    • 弱状态:弱状态也称为软状态,和硬状态相比,是指允许系统中的数据存在中间状态,并认为该中间状态的存在不会影响系统的整体可用性,即允许系统在不同节点的数据副本之间进行数据同步的过程存在延时;
    • 最终一致性:最终一致性强调的是系统中所有的数据副本,在经过一定时间的同步之后,最终能够达到一个一致的状态。因此,最终一致性的本质是需要系统保证最终数据能够达到一致,而不需要实时保证系统数据的强一致性。
      • 因果一致性:该一致性是指如果进程A在更新完某个数据项后通知了进程B,那么进程B之后对该数据项的访问都应该能够获取到进程A更新后的最新值,并且如果进程B要对该数据项进行更新操作的话,务必基于进程A更新后的最新值,即不能发生丢失更新的情况。与此同时,与进程A无因果关系的进程C的数据访问则没有这样的限制;
      • 读己之所写:该一致性是指进程A更新一个数据项之后,它自己总是能够访问到更新过的最新值,而不会看到旧值。也就是说,对于单个数据获取者来说,其读取到的数据,一定不会比自己上次写入的值旧。因此,读己之所写可以看做是一种特殊的因果一致性;
      • 会话一致性:该一致性将对系统数据的访问过程框定在一个会话当中,系统能保证在同一个有效的会话中实现“读己之所写”的一致性。也就是说,执行更新操作之后,客户端能够在同一个会话中始终读取到该数据项的最新值;
      • 单调读一致性:单调读一致性是指如果一个进程从系统中读取出一个数据项的某个值后,那么系统对于该进程后续的任何数据访问都不应该返回更旧的值;
      • 单调写一致性:该一致性是指一个系统需要能够保证来自同一个进程的写操作被顺序地执行。
  • 总结:BASE理论面向的是大型高可用可扩展的分布式系统,和传统事务的ACID特性是相反的,它完全不同于ACID的强一致性模型,而是提出通过牺牲强一致性来获得可用性,并允许数据在一段时间内是不一致的,但最终达到一致状态。但同时,在实际的分布式场景中,不同业务单元和组件对数据一致性的要求是不同的,因此在具体的分布式系统架构设计过程中,ACID特细是哪个与BASE理论往往又会结合在一起使用。

© 著作权归作者所有

上一篇: 一致性协议
下一篇: 分布式事务
爱宝贝丶

爱宝贝丶

粉丝 340
博文 136
码字总数 456051
作品 0
武汉
程序员
私信 提问
CAP原理和最终一致性(Eventually Consistency)

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

liangtee
2014/07/30
656
0
理解数据库的事务,ACID,CAP和一致性

什么是事务 事务是指由一系列数据库操作组成的一个完整的逻辑过程,这个过程中的所有操作要么都成功,要么都不成功。比如:常见的例子就是银行转账的例子,一次转账操作会包含多个数据库操作...

geekpy
2018/01/08
0
0
学习分布式不得不会的ACP理论

原创: Hollis 2000年7月,加州大学伯克利分校的Eric Brewer教授在ACM PODC会议上提出CAP猜想。2年后,麻省理工学院的Seth Gilbert和Nancy Lynch从理论上证明了CAP。之后,CAP理论正式成为分...

Java填坑之路
2018/07/17
0
0
二:分布式系统事务

一:事务 --->是由一系列对系统中数据进行访问与更新的操作所组成的一个程序执行逻辑单元。保证数据在业务逻辑上是正确的。 --->事务的四大特征:原子性,一致性,隔离性,持久性。简称事务的...

无信不立
2016/02/17
0
0
《分布式服务架构:原理、设计与实战》第二章彻底解决分布式系统一致性的问题

1、什么是一致性 一致性指分布式服务化系统之间的弱一致性,包括应用系统的一致性和数据的一致性。无论是水平拆分还是垂直拆分,都解决了特定场景下的特定问题,但拆分后的系统或者服务化的系...

Lienson
02/15
59
0

没有更多内容

加载失败,请刷新页面

加载更多

Python查询比特币实时价格

在本文中我们将学习如何使用使用coinmarketcap提供的比特币行情API,编写Python程序来获取像比特币、莱特币或以太币之类的区块链数字货币的实时行情/实时价格。 1、比特币行情API调用代码 我...

汇智网教程
16分钟前
2
0
爬虫平台Crawlab核心原理--自动提取字段算法

⚠注意: 可配置爬虫现在仅在Python版本(v0.2.1-v0.2.4)可用,在最新版本Golang版本(v0.3.0)还暂时不可用,后续会加上,请关注近期更新 背景 实际的大型爬虫开发项目中,爬虫工程师会被要...

tikazyq
34分钟前
3
0
postman批量测试

postman批量调用: 先单个调用,成功了 再save为collection 再点击三角形,点击run 设置1000次,run就可以 见《postman批量测试.docx》

Danni3
40分钟前
8
0
js 对象操作 js 对象和对象赋值 去除关联性 对象原型操作 把一个对象A赋值给另一个对象B 并且对象B 修改 不会影响 A对象

当我们在项目需要 复制一个对象到另一个对象并且 被复制的对象不能受复制后的对象的影响。 我先总结下 我们哪些方法可以复制对象 // 直接赋值var obj1 = { a: 1 };var obj2 = obj1;...

xiaogg
42分钟前
7
0
Go微服务全链路跟踪详解

在微服务架构中,调用链是漫长而复杂的,要了解其中的每个环节及其性能,你需要全链路跟踪。 它的原理很简单,你可以在每个请求开始时生成一个唯一的ID,并将其传递到整个调用链。 该ID称为C...

倚天码农
56分钟前
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部