分布式系统与一致性协议

本贴最后更新于 2060 天前,其中的信息可能已经渤澥桑田

CAP 原理

CAP 原理被奉为分布式系统的设计准则. 这是在分布式届无人不知无人不晓的.

  • C: Consistency(一致性) 这里的一致性特指的是强一致性, 通俗的讲, 就是所有节点上的数据时时刻刻保持同步. 也就是原子读写. 所有的读写请求都好像是经全局排序过的一样, 写后面的读一定能读到前面写的内容.
  • A: Availability(可用性) 任何非故障的节点都应该在有限的时间内给出请求的响应, 这里不关心请求是否成功.
  • P: Tolerance to the partition of network(分区容忍性) 当发生网络分区的时候(也就是节点见无法通讯), 在丢失任意多消息的情况下, 系统仍然能够正常的工作.

但是我们也清楚的是在现实的分布式系统中, 三种是不可兼得的. 以下是直观的说明:
          AP 满足但 C 不满足 如果既要求系统共可用性又要求分区容错性, 那么就要放弃一致性了. 因为一旦发生网络分区, 节点之间将无法通讯. 为了满足可用性, 没个节点就只能用本地数据进行服务的提供. 这样就会导致数据的不一致.
          CP 满足但 A 不满足 如果要求数据在各个服务器上是强一致性的, 然后网络分区了会导致同步时间无限延长, 那么如此一来可用性就得不到保障了.
          CA 满足但 P 不满足 如果不存在网络分区, 那么强一致性和可用性是可以满足的.

一致性

什么是一致性? 在分布式存储系统中通常会通过维护多个副本来进行容错, 以此来提高系统的可用性. 但是一致性这个词不管是中文还是英文在计算机的不同领域有着不同的含义:

  • Coherence 这个词只出现在 Cache Coherence 中, 其所关注的是多核共享内存的 CPU 架构下, 各个核的 Cache 上的数据应如何保持一致.
  • Consensus 是共识, 它强调的是多个提议者就某件事情达成共识, 其所关注的是达成共识的过程, 例如 Paxos, Raft 选举等.
  • Consistency 广义上讲, 描述了系统本身的不变量的维护程度对上层业务客户端的影响, 以及该系统的并发状态会向客户端暴露什么样的异常. CAP, ACID 中的 C 都是这个意思.
    分布式的一致性通俗的讲就是不同的副本服务器认可同一份数据. 一旦这些服务器对某份数据达成了一致, 那么该决定便是最终决定.
    一致性与结果的正确性没有关系, 而是对外呈现的状态是否一致(统一). 例如所有节点都达成一个错误的共识也是一致性的一种表现.
    一致性协议解决的正是这样的问题, 它能使的一组机器像一个整体一样工作, 即使其中的一些机器发生了错误, 也能正常的工作.
    一致性协议是在复制状态机(Replicated State Machines, RSM)的背景下提出的, 在这之前, 我们先了解一下一致性模型.
    ###一致性模型
    在很多人看来, 银行间的转账应该是强一致性的, 但是仔细分析一下就会发现, 小王向小张转账 1000 元, 小王的账户扣除了 1000 元, 此时小张并一定会同步收到 1000, 可能会存在一个不一致的时间窗口. 也就是小王的账户中扣除了 1000 元, 小张还没收到 1000.
    在我们的世界中, 网络分区是任何时刻, 任何地点都有可能正在或者即将发生的. 交换机, 网卡, 主机硬件, 操作系统, 磁盘, 虚拟化层和语言运行时间都会延误, 丢弃, 复制或者重新排序我们的信息. 那么我们需呀直观的正确性去让自己的软件按照确定的规则运行.
  • 分布式
    80 引用 • 149 回帖 • 4 关注
  • RAFT
    2 引用
  • PAXOS
    6 引用 • 2 回帖
  • CAP

    CAP 指的是在一个分布式系统中, Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),三者不可兼得。

    12 引用 • 5 回帖 • 631 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • 创造

    你创造的作品可能会帮助到很多人,如果是开源项目的话就更赞了!

    184 引用 • 1020 回帖 • 1 关注
  • Unity

    Unity 是由 Unity Technologies 开发的一个让开发者可以轻松创建诸如 2D、3D 多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

    25 引用 • 7 回帖 • 122 关注
  • 深度学习

    深度学习(Deep Learning)是机器学习的分支,是一种试图使用包含复杂结构或由多重非线性变换构成的多个处理层对数据进行高层抽象的算法。

    54 引用 • 44 回帖 • 1 关注
  • Thymeleaf

    Thymeleaf 是一款用于渲染 XML/XHTML/HTML5 内容的模板引擎。类似 Velocity、 FreeMarker 等,它也可以轻易的与 Spring 等 Web 框架进行集成作为 Web 应用的模板引擎。与其它模板引擎相比,Thymeleaf 最大的特点是能够直接在浏览器中打开并正确显示模板页面,而不需要启动整个 Web 应用。

    11 引用 • 19 回帖 • 391 关注
  • 链滴

    链滴是一个记录生活的地方。

    记录生活,连接点滴

    175 引用 • 3857 回帖
  • RemNote
    2 引用 • 16 回帖 • 14 关注
  • OAuth

    OAuth 协议为用户资源的授权提供了一个安全的、开放而又简易的标准。与以往的授权方式不同之处是 oAuth 的授权不会使第三方触及到用户的帐号信息(如用户名与密码),即第三方无需使用用户的用户名与密码就可以申请获得该用户资源的授权,因此 oAuth 是安全的。oAuth 是 Open Authorization 的简写。

    36 引用 • 103 回帖 • 29 关注
  • 印象笔记
    3 引用 • 16 回帖
  • PHP

    PHP(Hypertext Preprocessor)是一种开源脚本语言。语法吸收了 C 语言、 Java 和 Perl 的特点,主要适用于 Web 开发领域,据说是世界上最好的编程语言。

    182 引用 • 408 回帖 • 490 关注
  • WiFiDog

    WiFiDog 是一套开源的无线热点认证管理工具,主要功能包括:位置相关的内容递送;用户认证和授权;集中式网络监控。

    1 引用 • 7 回帖 • 610 关注
  • 程序员

    程序员是从事程序开发、程序维护的专业人员。

    589 引用 • 3538 回帖
  • 阿里巴巴

    阿里巴巴网络技术有限公司(简称:阿里巴巴集团)是以曾担任英语教师的马云为首的 18 人,于 1999 年在中国杭州创立,他们相信互联网能够创造公平的竞争环境,让小企业通过创新与科技扩展业务,并在参与国内或全球市场竞争时处于更有利的位置。

    43 引用 • 221 回帖 • 60 关注
  • OneDrive
    2 引用
  • 一些有用的避坑指南。

    69 引用 • 93 回帖
  • Sym

    Sym 是一款用 Java 实现的现代化社区(论坛/BBS/社交网络/博客)系统平台。

    下一代的社区系统,为未来而构建

    524 引用 • 4601 回帖 • 706 关注
  • 快应用

    快应用 是基于手机硬件平台的新型应用形态;标准是由主流手机厂商组成的快应用联盟联合制定;快应用标准的诞生将在研发接口、能力接入、开发者服务等层面建设标准平台;以平台化的生态模式对个人开发者和企业开发者全品类开放。

    15 引用 • 127 回帖 • 2 关注
  • 自由行
  • Spark

    Spark 是 UC Berkeley AMP lab 所开源的类 Hadoop MapReduce 的通用并行框架。Spark 拥有 Hadoop MapReduce 所具有的优点;但不同于 MapReduce 的是 Job 中间输出结果可以保存在内存中,从而不再需要读写 HDFS,因此 Spark 能更好地适用于数据挖掘与机器学习等需要迭代的 MapReduce 的算法。

    74 引用 • 46 回帖 • 562 关注
  • SVN

    SVN 是 Subversion 的简称,是一个开放源代码的版本控制系统,相较于 RCS、CVS,它采用了分支管理系统,它的设计目标就是取代 CVS。

    29 引用 • 98 回帖 • 688 关注
  • JavaScript

    JavaScript 一种动态类型、弱类型、基于原型的直译式脚本语言,内置支持类型。它的解释器被称为 JavaScript 引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在 HTML 网页上使用,用来给 HTML 网页增加动态功能。

    733 引用 • 1280 回帖
  • Linux

    Linux 是一套免费使用和自由传播的类 Unix 操作系统,是一个基于 POSIX 和 Unix 的多用户、多任务、支持多线程和多 CPU 的操作系统。它能运行主要的 Unix 工具软件、应用程序和网络协议,并支持 32 位和 64 位硬件。Linux 继承了 Unix 以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。

    952 引用 • 944 回帖
  • Vue.js

    Vue.js(读音 /vju ː/,类似于 view)是一个构建数据驱动的 Web 界面库。Vue.js 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件。

    268 引用 • 666 回帖 • 1 关注
  • Access
    1 引用 • 3 回帖 • 1 关注
  • 创业

    你比 99% 的人都优秀么?

    82 引用 • 1395 回帖 • 1 关注
  • Webswing

    Webswing 是一个能将任何 Swing 应用通过纯 HTML5 运行在浏览器中的 Web 服务器,详细介绍请看 将 Java Swing 应用变成 Web 应用

    1 引用 • 15 回帖 • 638 关注
  • Typecho

    Typecho 是一款博客程序,它在 GPLv2 许可证下发行,基于 PHP 构建,可以运行在各种平台上,支持多种数据库(MySQL、PostgreSQL、SQLite)。

    12 引用 • 67 回帖 • 451 关注
  • Scala

    Scala 是一门多范式的编程语言,集成面向对象编程和函数式编程的各种特性。

    13 引用 • 11 回帖 • 158 关注