iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >分布式系统知识分享:正确理解CAP定理
  • 707
分享到

分布式系统知识分享:正确理解CAP定理

2023-06-05 07:06:45 707人浏览 独家记忆
摘要

  前言   CAP的理解我也看了很多书籍,也看了不少同行的博文,基本每个人的理解都不一样,而布鲁尔教授得定义又太过的简单,没有具体描述和场景案例分析。因此自己参考部分资料梳理了一篇与大家互相分享一下。  标题写了正确理解,或许某些点不是百

  前言

  CAP的理解我也看了很多书籍,也看了不少同行的博文,基本每个人的理解都不一样,而布鲁尔教授得定义又太过的简单,没有具体描述和场景案例分析。因此自己参考部分资料梳理了一篇与大家互相分享一下。

  标题写了正确理解,或许某些点不是百分百正确或者有歧义,但是希望与各位分享讨论后达到最终正确。

  简介

  CAP定理,又被称作布鲁尔定理(Brewer's theorem),是埃里克·布鲁尔教授在2000 年提出的一个猜想,它指出对于一个分布式系统来说,不可能同时满足以下三点:

  ·Consistency(一致性): where all nodes see the same data at the same time.(所有节点在同一时间具有相同的数据)

  ·Availability(可用性): which guarantees that every request receives a response about whether it succeeded or failed.(保证每个请求不管成功或者失败都有响应)

  ·Partition tolerance(分隔容忍): where the system continues to operate even if any one part of the system is lost or fails.(系统中任意信息的丢失或失败不会影响系统的继续运作)

  很多书籍与文章引用Robert Greiner在2014年8月写的一篇博文 Http://robertgreiner.com/2014/08/cap-theorem-revisited/。相比与看着布鲁尔教授一脸懵逼的定义,Robert Greiner的更加容易理解。

  定义

  原文:In a distributed system (a collection of interconnected nodes that share data.), you can only have two out of the following three guarantees across a write/read pair: Consistency, Availability, and Partition Tolerance - one of them must be sacrificed.

  翻译:在一个分布式系统(指互相连接并共享数据的节点的集合)中,当涉及读写操作时,只能保证一致性(Consistence)、可用性(Availability)、分区容错性(Partition Tolerance)三者中的两个,另外一个必须被牺牲。

  关键字:interconnected nodes(互连节点)、share data(共享数据)、a write/read pair(读/写)

  从上面一段话,有几个,也就是说我们聊CAP定理的时候,是在具有数据读写、数据共享和节点互连的前提下,对上面三者选其二,也是建议我们不要花费时间与精力同时满足三者。

  举例说明,WEB集群、memcached集群不属于讨论对象

  web集群只是资源复制分配在不同的节点上,然而节点间没有互连、也没有数据共享(sessionid、memory cache)。

  memcached集群数据存储是通过客户端实现哈希一致性,但是集群节点间不互连的,也没有数据共享。

  总得来说,CAP定理讨论的并不是分布式系统所有的功能。

  一致性(Consistency)

  原文:A read is guaranteed to return the most recent write for a given client.

  翻译:对某个指定的客户端来说,读操作保证能够返回最新的写操作结果

  关键字:a given client(指定的客户端)。

  这里的一致性与我们平常了解ACID的一致性有点偏差,ACID的一致性关注的是数据库的数据完整性。

  上面定义没说明是所有节点必须在同一时间数据一致,而关注点在客户端,假如有个场景,您在ATM(客户端)往某张银行卡存500元后,立刻在ATM发起查询余额的时候会显示加了500元后的余额,随后我们也能把这500元取出来。查询余额读操作可以是写后立刻读的主库,也或者写后某个时间段过后(中途无写)读从库。

  可用性(Availability)

  原文:A non-failing node will return a reasonable response within a reasonable amount of time (no error or timeout).

  翻译:非故障节点将在合理的时间内返回合理的响应(不是错误或超时)。

  关键字:non-failing node(非故障节点)、reasonable response(合理的响应)

  这里的可用性和我们平常所理解的高可用性有点偏差,高可用性指系统无中断的执行其功能的能力。

  已故障的节点就不具有可用性了,因为请求结果要么error要么 timeout。合理的响应没有说明是成功还是失败,但是响应应该具有是否成功的精确描述。例如我们读取SQL Server集群的某从库,同步需要时间,读取出来可能不是最新的数据,但却是合理的响应。

  分区容错性(Partition tolerance)

  原文:The system will continue to function when network partitions occur.

  翻译:当网络分区发生时,系统将继续正常运作

  关键字:continue to function(继续正常运作)

  假如做了一个redis的一主两从的集群,某天某个从节点因为网络故障变成不可用,但是另外的一主一 从仍然能正常运作,那么我们认为它具有分区容错性。

  CA-牺牲分区容错性

  作为分布式系统,分区必然总会发生(2年1次50分钟还是1年3次共10分钟?),因此认为CAP的讨论是大部分建立在P确立前提下。假设我们牺牲了P这个时候因为网络故障发生了分区导致节点不可用,这个时候请求响应了error、timeout,与可用性的定义相冲突了。

  但是,我们又假如分区大部分时间是不存在的,这时对单节点的读\写,那么就无需作出C、A的取舍。但是上面说分区总会发生这不互相矛盾么,还是取舍。假如1年时间内99.99%时间是正常的,不可用时间为0.01%(52.56分钟)不可用,若这个时间属于业务接受范围,或者只在某个地区(华南、华北、华中?)有影响,那么CA也是可以选择的。

  PC-牺牲可用性

  最典型的案例是RDBMS集群与Redis集群,这两种都是利用主从复制实现读写分离的方案。假如两者都是建立一主多从的集群,在主节点写入数据,为了保证随后的读操作获取最新数据(一致性),这个读操作仍会请求主节点(读写分离的复杂点在从库同步不及时导致业务的异常,为了保证业务的正常性写后的读会请求主库),某个从节点挂了但是只要主节点和其他从节点仍然正常运作,就满足分区容错性。但是哪天主节点因为网络故障导致写操作的error或者timeout,那么这个系统就不可用了(牺牲可用性)。

  这个时候可以引入其他功能和机制完成,例如Redis哨兵模式、故障转移功能。

  PA-牺牲一致性

  最典型的案例是Cassanda集群和Riak集群,这种类型的分布式数据库,可以任意节点写入,任意节点读取,当作为集群出现,无论写入哪个节点,都将会把该节点的数据同步到其他节点上,因为这种同步方式,读取数据时只要访问一个节点就足够了(喜欢任意访问也不拦着你),但是因为其他节点数据同步原因,数据可能并不是最新的(牺牲一致性)。如果当前节点因为网络异常导致分区变得不可用(无论读\写),可以转移访问节点(可用性)。

  另外这里说的牺牲一致性,并不代表放弃一致性,而PA选择的是最终一致性(系统中所有的数据副本,在经过一段时间的同步后,最终能够达到一个一致的状态)

  总结

  上面涉及“牺牲”字眼,并不代表非此即彼的选择,可以根据子系统、模块之间的设计上进行混搭使用(例如PA和PC、CA和PC)。

  本文对CAP定理做了一个简单的梳理描述,参考了部分书籍和文章加上自己的理解希望可以跟大家做个分享,如果有不同建议和看法包括文章内描述错误,请在下方评论指出,我将及时作出修改。

  作 者: 陈珙

  出 处:http://www.cnblogs.com/skychen1218/ 

  关于作者:专注于微软平台的项目开发。如有问题或建议,请多多赐教! 

--结束END--

本文标题: 分布式系统知识分享:正确理解CAP定理

本文链接: https://www.lsjlt.com/news/241723.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 分布式系统知识分享:正确理解CAP定理
      前言   CAP的理解我也看了很多书籍,也看了不少同行的博文,基本每个人的理解都不一样,而布鲁尔教授得定义又太过的简单,没有具体描述和场景案例分析。因此自己参考部分资料梳理了一篇与大家互相分享一下。  标题写了正确理解,或许某些点不是百...
    99+
    2023-06-05
  • 分布式系统CAP定理中的P原理解析
    目录引言什么是 CAP 定理(CAP theorem)分区容错性(Partition tolerance)几个常用的 CAP 框架对比EurekaZookeeperConsul引言 ...
    99+
    2023-02-05
    分布式系统CAP 分布式系统
  • 分布式系统CAP的原理介绍
    CAP原理中,有三个要素: 一致性(Consistency) 可用性(Availability) 分区容错性(Partition tolerance) Consistency 一致性 一致性指“all ...
    99+
    2024-04-02
  • 分布式系统CAP定理中的P原理是什么
    这篇文章主要介绍“分布式系统CAP定理中的P原理是什么”,在日常操作中,相信很多人在分布式系统CAP定理中的P原理是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”分布式系统CAP定理中的P原理是什么”的疑...
    99+
    2023-07-05
  • 学习笔记分享:PHP、Spring和分布式系统的关键知识点。
    学习笔记分享:PHP、Spring和分布式系统的关键知识点 在现代软件开发中,PHP、Spring和分布式系统是非常重要的技术。本文将分享这些技术的关键知识点,并附带演示代码。 一、PHP PHP是一种流行的服务器端脚本语言,用于Web开发...
    99+
    2023-08-04
    spring 分布式 学习笔记
  • 如何在Java分布式系统中正确处理重定向和打包问题?
    Java分布式系统是现代软件开发的重要组成部分,但在开发过程中会遇到一些常见的问题,比如重定向和打包问题。本文将详细介绍如何在Java分布式系统中正确处理这些问题,同时提供一些实用的演示代码供读者参考。 一、重定向问题 在Java分布式系统...
    99+
    2023-09-29
    分布式 重定向 打包
  • web分布式系统怎么理解
    本篇内容介绍了“web分布式系统怎么理解”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!分布式系统理论基础 - 一致性、2PC和3PC引言狭义...
    99+
    2023-06-03
  • 分析Java分布式系统原理
    这篇文章主要讲解了“分析Java分布式系统原理”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“分析Java分布式系统原理”吧!1 概念1.1 模型节点在具体的...
    99+
    2024-04-02
  • 如何理解分布式系统下基于Redis的分布式锁
    这篇文章主要介绍“如何理解分布式系统下基于Redis的分布式锁”,在日常操作中,相信很多人在如何理解分布式系统下基于Redis的分布式锁问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大...
    99+
    2024-04-02
  • Java分布式系统的重定向技术解析?
    Java分布式系统的重定向技术解析 随着互联网和移动互联网的发展,分布式系统已经成为现代软件开发的主要趋势。在分布式系统中,重定向技术是非常重要的一环,它可以帮助我们实现负载均衡、容错等功能。本文将介绍Java分布式系统中的重定向技术,并提...
    99+
    2023-09-29
    分布式 重定向 打包
  • ASP 分布式系统如何处理大数据?
    ASP 是一种常用的分布式系统,它可以实现高效的大数据处理。在分布式系统中,数据被分割成多个部分,然后由不同的服务器进行处理。这种方式可以大大提高数据处理的速度和效率。下面,我们将介绍 ASP 分布式系统如何处理大数据。 一、ASP 分布...
    99+
    2023-10-17
    分布式 大数据 npm
  • Java中如何处理分布式文件系统?
    随着互联网的发展,越来越多的应用需要处理大量的文件数据,而传统的单机文件系统已经无法满足这种需求。因此,分布式文件系统应运而生。分布式文件系统是一种能够将数据存储在多台服务器上的文件系统,通过将数据分散到不同的服务器上,可以提高数据的可靠...
    99+
    2023-07-28
    文件 分布式 numpy
  • 深入理解分布式系统中的缓存架构(上)
    本文主要介绍大型分布式系统中缓存的相关理论,常见的缓存组件以及应用场景。1 缓存概述缓存概述2 缓存的分类缓存主要分为以下四类缓存的分类1 CDN缓存基本介绍CDN(Content Delivery Network 内容分发网络)的基本原理...
    99+
    2023-06-02
  • 分布式文件系统FastDFS的原理是什么
    今天就跟大家聊聊有关分布式文件系统FastDFS的原理是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。什么是FastDFS?FastDFS是一个开源的轻量级分布式文件系统。它解决...
    99+
    2023-06-16
  • 必须理解的分布式系统中雷同的集群技术及原理
    写在前面在当今信息爆炸的时代,单台计算机已经无法负载日益增长的业务发展,虽然也有性能强大的超级计算机,但是这种高端机不仅费用高昂,也不灵活,一般的企业是负担不起的,而且也损失不起,那么将一群廉价的普通计算机组合起来,让它们协同工作就像一台超...
    99+
    2023-06-05
  • 如何理解Oracle分布式系统中的全局数据库名
    今天就跟大家聊聊有关如何理解Oracle分布式系统中的全局数据库名,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。在分布式系统中,每个数据库都有一个唯...
    99+
    2024-04-02
  • 怎么用centos搭建Git分布式管理控制系统
    本篇内容介绍了“怎么用centos搭建Git分布式管理控制系统”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Git是一个开源的分布式版本控制...
    99+
    2023-06-20
  • 分布式系统中 Golang 函数的异常处理实践
    golang 分布式系统中异常处理采用 errgroup 包,它提供了并发的错误组。实操案例中,通过 errgroup.withcontext 创建带有上下文的 errgroup,并使用...
    99+
    2024-04-19
    golang 异常处理
  • PHP中如何处理分布式系统的数据同步?
    随着互联网技术的不断发展,越来越多的应用程序需要使用分布式系统来支持其业务需求。在分布式系统中,数据同步是一个至关重要的问题。而在PHP技术中,对于分布式系统数据同步的处理方法,也有着不同的实现方式。处理分布式系统的数据同步问题,常使用的技...
    99+
    2023-05-14
    PHP 分布式系统 数据同步
  • 分布式系统中,PHP如何处理大数据类型?
    随着互联网技术的不断发展,分布式系统已经成为了现代软件开发的一个重要方向。在分布式系统中,处理大数据类型是一项非常常见的任务。PHP作为一种流行的编程语言,也被广泛应用于分布式系统中。那么,在分布式系统中,PHP如何处理大数据类型呢?本文将...
    99+
    2023-11-06
    分布式 数据类型 大数据
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作