轻松理解CAP理论

轻松理解CAP理论

Consistency: Every read receives the most recent write or an error
Availability: Every request receives a (non-error) response – without the guarantee that it contains the most recent write
Partition tolerance: The system continues to operate despite an arbitrary number of messages being dropped (or delayed) by the network between nodes

翻译一下就是:
①一致性:对于客户端的每次读操作,要么读到的是最新的数据,要么读取失败。换句话说,一致性是站在分布式系统的角度,对访问本系统的客户端的一种承诺:要么我给您返回一个错误,要么我给你返回绝对一致的最新数据,不难看出,其强调的是数据正确。

②可用性:任何客户端的请求都能得到响应数据,不会出现响应错误。换句话说,可用性是站在分布式系统的角度,对访问本系统的客户的另一种承诺:我一定会给您返回数据,不会给你返回错误,但不保证数据最新,强调的是不出错。

③分区容忍性:由于分布式系统通过网络进行通信,网络是不可靠的。当任意数量的消息丢失或延迟到达时,系统仍会继续提供服务,不会挂掉。换句话说,分区容忍性是站在分布式系统的角度,对访问本系统的客户端的再一种承诺:我会一直运行,不管我的内部出现何种数据同步问题,强调的是不挂掉。

三、权衡 C、A

之前提到,CAP理论说一个分布式系统不可能同时满足C、A、P这三个特性。那么我们就来分析C、A、P的权衡吧。

note:其实这里有个关于CAP理论理解的误区。不要以为在所有时候都只能选择两个特性。在不存在网络失败的情况下(分布式系统正常运行时),C和A能够同时保证。只有当网络发生分区或失败时,才会在C和A之间做出选择。

对于一个分布式系统而言,P是前提,必须保证,因为只要有网络交互就一定会有延迟和数据丢失,这种状况我们必须接受,必须保证系统不能挂掉。所以只剩下C、A可以选择。要么保证数据一致性(保证数据绝对正确),要么保证可用性(保证系统不出错)。

当选择了C(一致性)时,如果由于网络分区而无法保证特定信息是最新的,则系统将返回错误或超时。

当选择了A(可用性)时,系统将始终处理客户端的查询并尝试返回最新的可用的信息版本,即使由于网络分区而无法保证其是最新的。

四、C、A、P三者之间的冲突

本部分主要参考分布式CAP定理,为什么不能同时满足三个特性?

假设有两台服务器,一台放着应用A和数据库V,一台放着应用B和数据库V,他们之间的网络可以互通,也就相当于分布式系统的两个部分。

在满足一致性的时候,两台服务器(假设为N1,N2)的数据是一样的,DB0=DB0。在满足可用性的时候,用户不管是请求N1或者N2,都会得到立即响应。在满足分区容错性的情况下,N1和N2有任何一方宕机,或者网络不通的时候,都不会影响N1和N2彼此之间的正常运作。

轻松理解CAP理论

轻松理解CAP理论

图1中,用户通过N1中的A应用请求数据更新到服务器DB0,这时N1中的服务器DB0变为DB1,通过分布式系统的数据同步更新操作,N2服务器中的数据库V0也更新为了DB1(图2),这时,用户通过B向数据库发起请求得到的数据就是即时更新后的数据DB1。

上面是正常运作的情况,但分布式系统中,最大的问题就是网络,现在假设一种极端情况,N1和N2之间的网络断开了,但我们仍要支持这种网络异常,也就是满足分区容错性,那么这样能不能同时满足一致性和可用性呢?

轻松理解CAP理论

假设N1和N2之间通信的时候网络突然出现故障,有用户向N1发送数据更新请求,那N1中的数据DB0将被更新为DB1,由于网络是断开的,N2中的数据库仍旧是DB0;

如果这个时候,有用户向N2发送数据读取请求,由于数据还没有进行同步,应用程序没办法立即给用户返回最新的数据DB1,怎么办呢?有二种选择,第一,牺牲数据一致性,响应旧的数据DB0给用户;第二,牺牲可用性,阻塞等待,直到网络连接恢复,数据更新操作完成之后,再给用户响应最新的数据DB1。

参考:

https://zhuanlan.zhihu.com/p/98393679

https://baijiahao.baidu.com/s?id=1650890231453975345&wfr=spider&for=pc

https://zhuanlan.zhihu.com/p/50990721

Original: https://www.cnblogs.com/fnlingnzb-learner/p/16459095.html
Author: Boblim
Title: 轻松理解CAP理论

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/551754/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Go基础3:函数、结构体、方法、接口

    Go语言的函数属于”一等公民”(first-class),也就是说: 函数本身可以作为值进行传递。 支持匿名函数和闭包(closure)。 函数可以满足接口…

    技术杂谈 2023年7月24日
    071
  • ETCD分布式存储部署

    一、ETCD 概述 ETCD 是一个分布式一致性k-v存储系统,可用于服务注册发现与共享配置。具有一下优点: 简单: 相比于晦涩难懂的paxos算法,etcd基于相对简单且易实现的…

    技术杂谈 2023年7月10日
    087
  • UML图

    依赖(Dependency)关系是一种使用关系,特定事物的改变有可能会影响到使用该事物的其他事物,在需要表示一个事物使用另一个事物时使用依赖关系。大多数情况下,依赖关系体现在某个类…

    技术杂谈 2023年5月31日
    089
  • 千古前端图文教程-HTML011-HTML基础知识回顾

    HTML基础知识回顾 HTML基础知识回顾 本文主要内容 #html 的常见元素 #1、head 区域的 html 元素 #2、html 元素(body 区域) #html 文档的…

    技术杂谈 2023年7月11日
    075
  • 三维城市特效

    基于FreethEarth开发的Web三维数字孪生城市前端效果 饮水思源,不忘初心。 要面包,也要有诗和远方。 Original: https://www.cnblogs.com/…

    技术杂谈 2023年5月31日
    087
  • Base64编码出现换行符

    Base64是一种字符串编码格式,Base64采用A-Z a-z 0-9 “+” “/”这一共64个字符来编码原始字符(还有垫字符&…

    技术杂谈 2023年5月31日
    079
  • Jenkinsfile 同时检出多个 Git 仓库

    前置 通常,在 Jenkinsfile 中使用 Git 仓库是这样的: stage(‘Checkout git repo’) { steps { checkout([ $class…

    技术杂谈 2023年7月11日
    091
  • 区间dp

    顾名思义:区间dp就是在区间上进行动态规划,求解一段区间上的最优解。主要是通过合并小区间的 最优解进而得出整个大区间上最优解的dp算法。 核心思路 既然让我求解在一个区间上的最优解…

    技术杂谈 2023年7月11日
    054
  • Vue动态创建组件实例并挂载到body

    方法一: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 import Vue from ‘vue’ /** * @param Co…

    技术杂谈 2023年5月31日
    095
  • 工厂模式详解

    1.1工厂模式的由来 现实生活中,原始社会(没有工厂)–> 农耕小作坊(简单工厂)–> 工业革命(工厂方法)–> 代工厂(抽象…

    技术杂谈 2023年6月21日
    086
  • [学习笔记]Java异常处理

    程序运行时,可能会发生各种错误,一些错误是可以避免的,还有些错误是随机出现的且不可避免,一个健壮的程序必须能够处理这些错误; Java内置一套异常处理机制,使用异常来表示错误; 异…

    技术杂谈 2023年7月24日
    066
  • 30道关于linux的基础命令小题,先练练手

    1.修改主机名为yuanlai0224命令是: 2.切换⽬录到/yuchao01/data/,再创建脚本/my_website/scripts/start.sh。 绝对路径、相对路…

    技术杂谈 2023年7月10日
    070
  • 网络多人游戏架构与编程2

    【 网络多人游戏架构与编程2】 1.0、虚拟现实游戏是对延迟最敏感的, 因为我们人类只要头旋转了,眼睛就期望看到不同的事物。在这些情况下,保证用户感觉在虚拟现实世界中就要求延迟少于…

    技术杂谈 2023年5月31日
    098
  • q命令-用SQL分析文本文件

    原创:打码日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处。 在Linux上分析文本文件时,一般会使用到grep、sed、awk、sort、uniq等命令,但这些…

    技术杂谈 2023年7月25日
    069
  • 解决Mybatis-plus高版本不向后兼容的问题

    mybatis-plus插件后面的版本没有兼容低版本。即:不存在低版本中EntityWrapper这个类了。而该类采用数据库表真实字段名作查询条件,这样硬编码形式确实不友好,比如如…

    技术杂谈 2023年7月11日
    055
  • OAuth2AuthorizationServer

    基于Spring Security 5 的 Authorization Server的写法 先看演示 pom.xml <?xml version="1.0&quot…

    技术杂谈 2023年7月24日
    082
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球