首页 > 其他分享 >详解分布式系统核心概念——CAP、CP和AP

详解分布式系统核心概念——CAP、CP和AP

时间:2023-09-27 10:36:30浏览次数:49  
标签:可用性 分区 CAP AP 分布式系统 CP


最近研究Sykwalking,当调研 oap如何进行集群部署时发现:skywalking oap 之间本身不能搭建集群,需要一个集群管理器来组建集群,它支持nacos、zookeeper、Kubernetes、Consul、Etcd 五种集群管理器。我重点比较了nacos和zookeeper,发现二者最大的区别是Zookeeper采用了CP架构,nacos既支持CP架构又支持AP架构。关于CP 和AP属于CAP理论的东东,而CAP理论作为分布式系统的基石,所以在这里我对分布式系统和CAP理论做一个总结。

分布式系统

目前的互联网应用用户数量越来越多,产生的数据规模也越来越大,应用系统必须支持高并发访问和海量数据处理的需求,显然这是集中式架构无法解决的问题,于是分布式系统成为了主角,在一个分布式系统中,一组独立的计算机展现给用户的是一个统一的整体,就好像是一个系统似的。系统拥有多种通用的物理和逻辑资源,可以动态的分配任务,分散的物理和逻辑资源通过计算机网络实现信息交换。

布式系统的核心是可扩展性,通过对服务、存储的扩展,来提高系统的处理能力,通过对多台服务器协同工作,来完成单台服务器无法处理的任务,尤其是高并发或者大数据量的任务。另外不出现单点故障,单点不影响整体,也是分布式系统的设计目标之一。

由于分布式系统的特点,所以在分布式环境中更容易出现问题,例如节点之间通信失败、网络分区故障、多个副本的数据不一致等,为了更好地在分布式系统下进行开发,专家们提出了一系列的理论,其中具有代表性的就是 CAP 理论。

什么是CAP

  • CAP

CAP 理论可以表述为,一个分布式系统最多只能同时满足一致性(Consistency)、可用性(Availability)和分区容忍性(Partition Tolerance)这三项中的两项。




详解分布式系统核心概念——CAP、CP和AP_服务器


在分布式中P是必须要有的,所以分布式有CP和AP两种模式。AP的就是可用性强,一致性弱;CP就是一致性强,可用性弱。我们可以把强弱理解成优缺点。

  • 一致性

指“所有节点同时看到相同的数据”,即更新操作成功并返回客户端完成后,所有节点在同一时间的数据完全一致,等同于所有节点拥有数据的最新版本。我们可以更深入的理解一致性,它是指任何的读写都应该看起来是“原子”的,或串行的,写后面的读一定能读到前面写的内容,所有的读写请求都好像被全局排序;

  • 可用性

指“任何时候,读写都是成功的”,即服务一直可用,而且是正常响应时间。我们平时会看到一些公司的对外说自己系统稳定性已经做到 3 个 9、4 个 9,即 99.9%、99.99%,这里的 N 个 9 就是对可用性的一个描述,叫做 SLA,即服务水平协议。比如我们说年度 99.99% 的 SLA,则计算公式如下:

1年 = 365天 = 8760小时

99.99 = 8760 * 0.0001 = 0.876小时 = 0.876 * 60 = 52.6分钟

是不是很牛逼,系统一年里只有52.6分钟不能提供服务。

  • 分区容忍性

指“当部分节点出现消息丢失或者分区故障的时候,分布式系统仍然能够继续运行”,即系统容忍网络出现分区,并且在遇到某节点或网络分区之间网络不可达的情况下,仍然能够对外提供满足一致性和可用性的服务。

  • 分区容忍性和可用性的区别

分区容忍性和可用性二者很像,在这里我们做一下简单的总结:

分区容错性:因为网络等硬件引起的问题,一台服务器崩溃了,保证能在其他服务器上也能顺利完成业务。

可用性:因为软件代码层面的问题,一台服务器上的服务崩溃了,保证能在其他服务器上完成该业务。

二者主要区别是:分区容错性更偏向于硬件引起的问题;可用性更偏向于软件代码层面的问题。

在分布式系统中,由于系统的各层拆分,P 是确定的,CAP 的应用模型就是 CP 架构和 AP 架构。分布式系统所关注的,就是在 Partition Tolerance 的前提下,如何实现更好的 A (系统可用性)和更稳定的 C(数据一致性)。

CP和AP的典型应用

CP典型应用就是电商的产品价格,商家修改价格后要实时生效。

AP的典型应用就是各大内容网站的点赞和评论功能,用户不太在意点赞和评论的实时性,更在意的时查看感兴趣内容的可访问性

原创不易,如果文章帮到了您,劳烦点赞转发!

标签:可用性,分区,CAP,AP,分布式系统,CP
From: https://blog.51cto.com/liwen629/7621176

相关文章

  • 详解git pull命令和使用过程中遇到的常见问题:fatal: ‘origin‘ does not appear to b
    使用gitpull同步远程代码使用git管理测试相关代码时,因为测试代码本身量级不大,所以很少使用分支,默认都使用master(主分支),当我们想要从远程origin(origin是远程仓remoterepository,clone到本地的默认名字)。当主机的master分支拉取代码过来和本地的当前分支进行合并时,需要使用如下命令:g......
  • CH32V208以太网IAP修改用户区大小注意事项
    CH32v208以太网IAP修改用户区大小注意事项    CH32v208的以太网IAP程序中将FLASH分为3个区域,boot区40k、用户区44k和备份区44k,通过以太网接收到对端设备发来的以太网数据存到备份区中,之后复制到用户区,然后校验跳转,详细使用方法可以看一下例程中附带的使用教程。   ......
  • Apache Hudi 使用指南
    欢迎参观我的博客,一个Vue与SpringBoot结合的产物:https://poetize.cn博客:https://gitee.com/littledokey/poetize-vue2.git聊天室:https://gitee.com/littledokey/poetize-im-vue3.git后端:https://gitee.com/littledokey/poetize.git七牛云登录/注册地址(文件服务器,CDN):https:/......
  • MMU复习--Apple的学习笔记
    一,前言以前看过MMU,因为这是单片机OS中没有的,当时我记得理解的不是很清晰,包括MMU中哪部分是硬件的,哪部分是软件的都没有太搞清楚。由于看了一个自己写linux操作系统的视频,里面有介绍MMU,且演示了虚拟地址和物理地址的转换,此时我才深刻的理解了,所以在看qemu源码的内存管理前,我先复习......
  • MMU复习--Apple的学习笔记
    一,前言以前看过MMU,因为这是单片机OS中没有的,当时我记得理解的不是很清晰,包括MMU中哪部分是硬件的,哪部分是软件的都没有太搞清楚。由于看了一个自己写linux操作系统的视频,里面有介绍MMU,且演示了虚拟地址和物理地址的转换,此时我才深刻的理解了,所以在看qemu源码的内存管理前,我先复习下......
  • Map and Set详解
    在Java编程中,Map和Set是两个非常常用的数据结构。Map提供了一种键值对的映射关系,使我们可以根据键来快速访问和操作对应的值。它的灵活性和高效性使得Map在各种场景中都得到了广泛的应用,比如存储配置信息、缓存数据等等。而Set则是一种不重复元素的集合,它通过哈希表来存储......
  • Hadoop是什么? Hadoop是一个由Apache开发的开源分布式计算框架,它能够处理大规模数据并
    Hadoop是什么?Hadoop是一个由Apache开发的开源分布式计算框架,它能够处理大规模数据并行处理任务,支持大规模数据存储和处理。Hadoop的核心组件包括分布式文件系统HDFS和分布式计算框架MapReduce,它们使得Hadoop可以在廉价的硬件上并行地处理大量数据。Hadoop还包括很多相关的项目和子......
  • 2023年最新京东app端sign签名算法与cipher加解密逆向分析(2023-09-26)
    前言:  本文仅供学习交流,只提供关键思路不会给出完整代码,严禁用于非法用途,若有侵权请联系我删除!技术交流合作请私信!一.工具的选择(抓包工具的选择,是门学问)用到工具如下:1、安卓手机一台,系统版本:android6.01;型号:小米MI4LTE  之所以要选择android6手机,原理如下:  ......
  • Linux的双链表复习—Apple的学习笔记
    一,前言   今天想把linux的双链表base代码拿来单片机用,于是看了下,结果有点混乱了。那么就画了个链表变化图,且做了实验进行巩固。二,分析链表头插方法主要是root然后添加t1,然后添加t2。那么链表的变化是RootRoot->t1Root->t2->t1如下图,R代表root头节点,1代表t1节点,2代表t2节点。......
  • C# WebAPI
    1.WebRequest方法Post: privatevoidbutton1_Click(objectsender,EventArgse){  stringss=HttpPost("http://localhost:41558/api/Demo/PostXXX","{Code:\"test089\",Name:\"test1\"}");}publicstaticstringHttpPo......