转载自 关于分布式一致性的探究

随着大型网站的各种高并发访问、海量数据处理等场景越来越多,如何实现网站的高可用、易伸缩、可扩展、安全等目标就显得越来越重要。为了解决这样一系列问题,大型网站的架构也在不断发展。提高大型网站的高可用架构,不得不提的就是分布式。在初识分布式系统一文中简单介绍了分布式的基本概念,本文将在上篇文章的基础上继续学习分布式的一致性问题。主要介绍分布式一致性的基本概念、重要性、一致性模型等。

  • 一致性的重要性

分布式领域CAP理论告诉我们,任何一个分布式系统都无法同时满足Consistency(一致性),Availability(可用性), Partition tolerance(分区容错性) 这三个基本需求。最多只能满足其中两项。 但是,一个分布式系统无论在CAP三者之间如何权衡,都无法彻底放弃一致性(Consistency),如果真的放弃一致性,那么就说明这个系统中的数据根本不可信,数据也就没有意义,那么这个系统也就没有任何价值可言。所以,无论如何,分布式系统的一致性问题都需要重点关注。(分布式系统的CAP理论、分布式系统的BASE理论)

这里先简单提一下,由于一个分布式系统不可能放弃一致性,那么为什么有的架构师还说在某些场景中可以牺牲一致性呢?通常这里说的放弃一致性指的是放弃数据的强一致性(后文介绍什么是强一致性)。

通常情况下,我们所说的分布式一致性问题通常指的是数据一致性问题。那么我们就先来了解一下什么是数据一致性。

  • 数据一致性

数据一致性其实是数据库系统中的概念。我们可以简单的把一致性理解为正确性或者完整性,那么数据一致性通常指关联数据之间的逻辑关系是否正确和完整。我们知道,在数据库系统中通常用事务(访问并可能更新数据库中各种数据项的一个程序执行单元)来保证数据的一致性和完整性。而在分布式系统中,数据一致性往往指的是由于数据的复制,不同数据节点中的数据内容是否完整并且相同。

  • 为什么会有数据一致性问题

在初识分布式系统中我们介绍过,虽然分布式系统有着诸多优点,但是由于采用多机器进行分布式部署的方式提供服务,必然存在着数据的复制。分布式系统的数据复制需求主要来源于以下两个原因:

可用性。将数据复制到分布式部署的多台机器中,可以消除单点故障,防止系统由于某台(些)机器宕机导致的不可用。
性能。通过负载均衡技术,能够让分布在不同地方的数据副本全都对外提供服务。有效提高系统性能。

在分布式系统引入复制机制后,不同的数据节点之间由于网络延时等原因很容易产生数据不一致的情况。复制机制的目的是为了保证数据的一致性。但是数据复制面临的主要难题也是如何保证多个副本之间的数据一致性。


假设有这样的场景,有两个人同时去两个不同的火车站买票(A去A火车站,B去B火车站),为了保证合理的卖票,需要在A火车站和B火车站之间共享关于剩余票数的数据。但是A和B要买的票只剩下一张。一张票当然只能卖给一个人。 如果为了保证系统性能,那么A和B在买票的时候应该都可以买票成功(因为他们在买票过程中余票数据都显示还有一张余票)。两人在买完票之后,系统在做数据复制时发现一张票被卖出了两次,这时就要让A和B两人其中一人手中得票作废掉。这时就要花费很大的力气来通知后买到这张票的人这个消息。。。 如果为了保证数据一致性,那么就需要在A买票的过程中,B只能等着。等A买票结束,并且把余票结果同步到B火车站的售票窗口。然后B才能知道还有没有余票可以购买。

上面的例子可以简单的说明一个系统如果想保证数据一致性很有可能影响其性能。因为并发的写请求需要在前一个写请求结束之后才能进行。

因此,如何能既保证数据一致性,又保证系统的性能,是每一个分布式系统都需要重点考虑和权衡的。一致性模型可以在做这些权衡的时候给我们很多借鉴和思考。

  • 一致性模型

  • 强一致性

当更新操作完成之后,任何多个后续进程或者线程的访问都会返回最新的更新过的值。这种是对用户最友好的,就是用户上一次写什么,下一次就保证能读到什么。但是这种实现对性能影响较大。

  • 弱一致性

系统并不保证续进程或者线程的访问都会返回最新的更新过的值。系统在数据写入成功之后,不承诺立即可以读到最新写入的值,也不会具体的承诺多久之后可以读到。但会尽可能保证在某个时间级别(比如秒级别)之后,可以让数据达到一致性状态。

  • 最终一致性

弱一致性的特定形式。系统保证在没有后续更新的前提下,系统最终返回上一次更新操作的值。在没有故障发生的前提下,不一致窗口的时间主要受通信延迟,系统负载和复制副本的个数影响。DNS是一个典型的最终一致性系统。

  • 最终一致性模型的变种

因果一致性:如果A进程在更新之后向B进程通知更新的完成,那么B的访问操作将会返回更新的值。如果没有因果关系的C进程将会遵循最终一致性的规则。读己所写一致性:因果一致性的特定形式。一个进程总可以读到自己更新的数据。会话一致性:读己所写一致性的特定形式。进程在访问存储系统同一个会话内,系统保证该进程读己之所写。单调读一致性:如果一个进程已经读取到一个特定值,那么该进程不会读取到该值以前的任何值。单调写一致性:系统保证对同一个进程的写操作串行化。

上述最终一致性的不同方式可以进行组合,例如单调读一致性和读己之所写一致性就可以组合实现。并且从实践的角度来看,这两者的组合,读取自己更新的 数据,和一旦读取到最新的版本不会再读取旧版本,对于此架构上的程序开发来说,会少很多额外的烦恼。


为了解决分布式的一致性问题,在长期的研究探索过程中,涌现出了一大批经典的一致性协议和算法,其中比较著名的有二阶段提交协议,三阶段提交协议和Paxos算法。 下一篇文章将介绍这些和分布式一致性相关的协议和算法。

关于分布式一致性的探究相关推荐

  1. [分布式]:关于分布式一致性的探究

    声明以下分布式系列的文章大多转自Hollis 随着大型网站的各种高并发访问.海量数据处理等场景越来越多,如何实现网站的高可用.易伸缩.可扩展.安全等目标就显得越来越重要.为了解决这样一系列问题,大型网 ...

  2. 从分布式一致性算法到区块链共识机制

    引言 分布式一致性是一个很"古典"的话题,即在分布式系统中,如何保证系统内的各个节点之间数据的一致性或能够就某个提案达成一致.这个问题想必对于很多技术同学而言并不陌生,几乎在所有的 ...

  3. 分布式一致性(共识)算法(Paxos,raft,ZAB)的一些总结

    文章目录 前言 CAP理论 C consistency 一致性 A availability 可用性 P partition tolerance 分区容错性 一致性模型 弱一致性 强一致性 强一致性算 ...

  4. 一致 先验分布 后验分布_遇到分布式一致性问题,咋整?

    分布式一致性是一个常见的问题,比如在本地表中插入了一条记录,同时又远程调用了一个服务,很有可能插入记录成功了,但远程调用超时了,亦或本地记录插入成功了,此时刚好机器重启了......我们遇到的实际问题 ...

  5. 分布式一致性算法Raft

    导语 | 对于很多工程人员来说,Paxos算法不容易理解和落地实现.因此斯坦福学者提出了一个更易理解和实现的共识算法Raft.本文主要介绍Raft的基本原理.算法流程以及和Paxos的区别. 一.Ra ...

  6. Paxos分布式一致性算法简介和Apache ZooKeeper的概念映射

    为什么80%的码农都做不了架构师?>>>    Paxos是一个基于消息传递的一致性算法,近几年被广泛应用于分布式计算中,Google的Chubby,Apache的Zookeeper ...

  7. Elasticsearch分布式一致性原理剖析(一)-节点篇

    2019独角兽企业重金招聘Python工程师标准>>> 摘要: ES目前是最流行的开源分布式搜索引擎系统,其使用Lucene作为单机存储引擎并提供强大的搜索查询能力.学习其搜索原理, ...

  8. 架构师之路 — 分布式系统 — 分布式一致性难题

    目录 文章目录 目录 分布式一致性难题 分布式一致性算法 Paxos 算法 Raft 算法 Quorum NWR 算法 分布式一致性的实现方式 主动复制 被动复制 同步复制 异步复制 分布式一致性难题 ...

  9. Distributed Systems-leader based分布式一致性协议

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/feilengcui008/article/details/50843779 上一篇文章推导了基本Pa ...

最新文章

  1. SSC:基于点云语义上下文的大规模激光SLAM的位置识别方法
  2. Python - 在CentOS7.5系统中安装Python3
  3. R语言pmax函数和pmin函数按位计算向量最大值、最小值实战
  4. 开源阿牛图像处理实验室
  5. 使用JS 加入收藏,设为首页.
  6. ubuntu中用wine安装office2007
  7. 英特网rst服务器未在运行,技术员示范win7系统提示“英特尔(R)RST服务未在运行”的详细办法...
  8. 《Python Cookbook 3rd》笔记(4.12):不同集合上元素的迭代
  9. Mono for Android布局控件属性小结
  10. php返回成功信息msg_使用PHP实现的服务端socket
  11. 联调测试是什么意思_功能模块提测前注意这几件事,再也不怕被测试diss了
  12. LeetCode 222. 完全二叉树的节点个数(递归)
  13. TensorFlow 2.0官方风格与设计模式指南
  14. 面试必会 MySql的锁机制(InnoDB)
  15. lzg_ad:EWF RAM Reg模式原理介绍
  16. 下钻图生成 highcharts-column-drilldown
  17. 基于权重的地图匹配技术
  18. 使用Moment.js 格式化时间为今天,昨天,明天
  19. (转)国内外三个不同领域巨头分享的Redis实战经验及使用场景
  20. java id pid 递归,父子结构数据(id,pid)递归查询所有子id合集和父id合集

热门文章

  1. leetcode134. 加油站
  2. leetcode257. 二叉树的所有路径(两种做法)
  3. [蓝桥杯2019初赛]数列求值-模拟+数论
  4. AcWing 1381. 阶乘
  5. 常用决策树集成模型Random Forest、Adaboost、GBDT详解
  6. [object detection] TypeError: can't pickle dict_values objects
  7. Codeforces Round #613 (Div. 2) E. Delete a Segment 离散化
  8. 【洛谷P5114】八月脸【边分治】【闵可夫斯基和】
  9. Atcoder Keyence Programming Contest 2020 D - Swap and Flip
  10. Knowledge Test about Match