当前位置: 首页 > news >正文

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

最近研究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)这三项中的两项。

在分布式中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的典型应用就是各大内容网站的点赞和评论功能,用户不太在意点赞和评论的实时性,更在意的时查看感兴趣内容的可访问性

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

相关文章:

  • 【JavaEE初阶】第二节.进程篇
  • dockerfile笔记
  • 解决: 您目前无法访问 因为此网站使用了 HSTS。网络错误和攻击通常是暂时的,因此,此网页稍后可能会恢复正常
  • 【程序员陪你过大年】html+css+js 实现春节动态烟花特效及服务器部署
  • 后台生成4位图像验证码
  • 移动端App自动化之触屏操作自动化
  • requests页面常用操作(post、put、get、head、patch、delete方法)
  • 力扣sql基础篇(九)
  • 目标跟踪心得篇四:多目标跟踪的测评(性能指标)详解
  • 实现通讯录(C语言)
  • Linux - Buildroot简介和生成工具链SDK
  • Python库functools详解
  • MyBatis中TypeHandler的使用教程
  • Cookie和Session以及相关的方法
  • 【C语言】柔性的数组是什么?C/C++程序的内存开辟又是?
  • 从0到1完成一个Node后端(express)项目(四、路由、模块化、中间件、跨域)
  • 3D游戏引擎系统源码C++本科毕业设计,C++ 3D引擎源码,渲染系统使用的OpenGL 及 OpenGL ES
  • Linux-文件权限命令
  • 【C++】stack和queue的使用
  • 《Linux Shell脚本攻略》学习笔记-第七章