分布式与一致性协议之CAP(二)

news/2024/5/18 20:34:47

CAP

CAP不可能三角

在这里插入图片描述

CAP不可能三角是指对于一个分布式系统而言,一致性、可用性、分区容错性指标不可兼得,只能从中选择两个,
如图所示。CAP不可能三角最初是埃里克·布鲁尔(Eric Brewer)基于自己的工程实践提出的一个猜想,后被塞斯·吉尔伯特(Seth Gilbert)
和南希·林奇(Nancy Lynch)证明,(https://dl.acm.org/citation.cfm?id=564601)基于证明的严谨性的考虑,塞斯吉尔伯特和南希林奇对指标的含义做了预设和限制,比如,将一致性限制为原子一致性。
那么如何使用CAP理论来思考和涉及分区容错一致性模型呢?

如何使用CAP理论?

我们都直到,只要有网络交互就一定会有延迟和数据丢失,这种状况我们必须接受,还必须保证系统不能挂掉。就像上面提到的,节点间的分区故障时必然发生的。也就是说,分区容错性§是前提,是必须要保证的。
现在就只剩下一致性©和可用性(A)可以选择了:要么选择一致性,保证数据正确,要么选择可用性,保证服务可用。那么CP和AP的含义是什么呢?

  • 1.当选择了一致性©的时候,系统一定会读到最新的数据,不会读到旧数据,但如果因为消息丢失、延迟过高发生了网络分区,那么当集群节点接收到来自客户端的读请求时,为了不破坏一致性,可能会因为无法响应最新数据,而返回出错信息。
  • 2.当选择了可用性(A)的时候,系统将始终处理客户端的查询,返回特定信息,如果发生了网络分区,一些节点将无法返回最新的特点信息,而是返回自己当前的相对新的信息。

这里需要强调一点,大部分人对CAP理论有一个误解,认为无论在什么情况下,分布式系统都只能在C和A中选择1个。其实,在不存在网络分区的情况下,也就是在分布式系统正常运行时(这也是系统在绝大部分时候所处的状态),即在不需要P时,C和A能够同时保证。只有当发生分区故障的时候,即需要P时,系统才会在C和A之间做出选择。而且如果读操作
会读到旧数据,影响到了系统运行或业务运行(也就是说会有负面的影响),则推荐选择C,否则推荐选择A.

注意

CA模型,在分布式系统中不存在。因为舍弃P,意味着舍弃分布式系统,就比如单机版关系型数据库MySQL,如果MySQL要考虑主备或集群部署,它就必须考虑P.CP模型,采用CP模型的分布式系统,舍弃了可用性,一定会读到最新数据,不会读到旧数据。一旦消息丢失、延迟过高
发生了网络分区,就会影响用户的体验和业务的可用性(比如基于Raft的强一致系统,此时可能无法执行读操作和写操作)典型的应用有ETCD、Consul和HBaseAP模型,采用AP模型的分布式系统,舍弃了一致性,实现了服务器的高可用。用户访问系统时能得到响应数据,不会出现
响应错误,但会读取到旧数据。典型应用有Cassandra和DynamoDB

例子

在这里插入图片描述

以开源版的InfluxDB为例,InfluxDB是由节点和META和DATA节点两个逻辑单元组成的(如图所示),这两个节点的功能和数据特点
不同,需要我们分别为它们涉及分区容错一致性模型。
具体涉及如下:

  • 1.作为分布式系统,分区容错性时必须要实现的,不能因为节点间出现了分区故障,而出现整个系统不工作的情况

  • 2.考虑到META节点保存的是系统运行的关键元信息,比如数据库名、表名、保留策略信息等,所以必须实现一致性。也就是说,每次读都要能读到最新数据,这样才能避免因为查询不到指定的元信息,而导致时序数据记录写入失败或者系统没办法正常运行。比如创建数据库telegraf之后,如果系统不能立刻读取到这条新的元信息,那么相关的时序数据记录就会因为找不到指定数据库信息而写入失败,所以,应该选择CAP理论中的C和P,采用CP架构

  • 3.DATA节点保存的是具体的时序数据记录,比如一条记录CPU负载的时序数据"cpu_usage,host=server0,localtion=cn-sz,user=23,system=57.0".
    虽然这些数据不是系统运行相关的元信息,但服务器会被频繁访问,水平扩展、性能、可用性等是关键,所以,应该选择CAP理论中的A和P,采用AP架构。

  • 综上,基于CAP理论分别设计了InfluxDB的META节点和DATA节点的分区容错一致性模型,我们也可以采用类似的思考方法,设计出符合自己业务场景的分区容错一致性模型。

如果在上述例子中没有应用CAP理论,或者对CAP理论理解不深入,在设计DATA节点的分区容错一致性模型是不采用AP架构,而是之解使用现在
比较流行的共识算法,比如Raft算法,会有什么问题呢?

  • 1.受限于Raft的强领导者模型。所有写请求都在领导者节点上处理,整个集群的写性能等于单机性能。这样会造成集群接入性能低下,无法支撑海量或大数据量的时序数据

  • 2.受限于强领导者模型,以及Raft的节点和副本一一对应的限制,无法实现水平扩展。分布式集群扩展了读性能,但并没有提升写性能

  • 在多年的开发实践中,埃里克布鲁尔的猜想将会起到一个关键的作用,不是因为它是CAP理论的本源,意义重大,而是因为它源自高可用、高扩展的大型互联网系统的实践,强调在数据一致性(ACID)和服务可用性(BASE)之间权衡取舍。

注意

在当前分布式系统开发中,延迟是非常重要的一个指标。比如,在QQ后台的名字路由系统中,通过延迟评估服务可用性进行负载均衡和容灾;
再比如再Hashicorp Raft实现中,通过延迟评估领导者节点的服务可用性,以及是否发起领导者选举,所以,希望大家在分布式系统的开发中,
也能意识到延迟的重要性,能通过延迟来衡量服务的可用性


http://www.mrgr.cn/p/02702306

相关文章

如何在CentOS搭建docker compose ui可视化工具并无公网IP远程管理容器

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

在一台笔记本电脑上试用Ubuntu22.04

在一台笔记本电脑上试用Ubuntu22.04。 本来想看以下该操作系统能否识别笔记本电脑上的硬盘,于是下载试一下。选了一个国内镜像网站下载。下载速度很快。下载以后用软件win image 将下载的iso文件写到U盘上,用的是usb2.0的U盘,该操作用时11分…

【八股】计算机网络篇

网络模型 应用层【HTTP👉报文/消息】 传输层【TCP或UDP👉段👉MSS】网络层【IP、寻址和路由👉MTU】 ①IP(Internet Protocol,网际协议)主要作用是定义数据包的格式、对数据包进行路由和寻址&…

9.Eureka服务发现+Ribbon+RestTemplate服务调用

order-service服务通过服务名称来代替 ip:port的方式访问user-service服务的接口。 原来的请求代码: Service public class OrderServiceImpl implements OrderService {Autowiredprivate OrderMapper orderMapper;Autowiredprivate RestTemplate restTemplate;Ov…

深度学习中的熵、交叉熵、相对熵(KL散度)、极大释然估计之间的联系与区别

熵的最初来源于热力学。在热力学中,熵代表了系统的无序程度或混乱程度,也可以理解为系统的热力学状态的一种度量。后来被广泛引用于各个领域中,如信息学、统计学、AI等,甚至社会学当中。接下来将大家领略一下深度学习中熵的应用。…

npm、yarn与pnpm详解

🔥 npm、yarn与pnpm详解 🔖 一、npm 🔍 简介: npm是随Node.js一起安装的官方包管理工具,它为开发者搭建了一个庞大的资源库,允许他们在这个平台上搜索、安装和管理项目所必需的各种代码库或模块。 &#…

面向对象三大特征(python)

目录 1. 封装 为什么使用封装? 如何实现封装? 一个简单的封装示例 二.继承 为什么使用继承? 如何实现继承? 一个简单的继承示例 使用继承的好处 三.多态 为什么使用多态? 如何实现多态? 一个简…

Django模型继承之多表继承

在Django模型继承中,支持的第二种模型继承方式是层次结构中的每个模型都是一个单独的模型。每个模型都指向分离的数据表,并且可以被独立查询和创建。在继承关系中,子类和父类之间通过一个自动创建的OneToOneField进行连接。示例代码如下&…

4.26日学习记录

[湖湘杯 2021 final]Penetratable SUID提权 SUID是一种对二进制程序进行设置的特殊权限,可以让二进制程序的执行者临时拥有属主的权限 SUID具有一定的限制: 1.仅对于二进制有效; 2.执行者在程序中有可以执行的权限; 3.权限仅在程序…

公开课学习——基于索引B+树精准建立高性能索引

文章目录 遇到慢查询怎么办?—— 创建索引联合索引的底层的数据存储结构长什么样? mysql脑图 阿里开发手册 遇到慢查询怎么办?—— 创建索引 不用索引的话一个一个找太慢了,用索引就快的多。 假如使用树这样的结构建立索引&#x…

[Algorithm][前缀和][和为K的子数组][和可被K整除的子数组][连续数组][矩阵区域和]详细讲解

目录 1.和为 K 的子数组1.题目链接2.算法原理详解3.代码实现 2.和可被 K 整除的子数组1.题目链接2.算法原理详解3.代码实现 3.连续数组1.题目链接2.算法原理详解3.代码实现 4.矩阵区域和1.题目链接2.算法原理详解3.代码实现 1.和为 K 的子数组 1.题目链接 和为 K 的子数组 2.…

数据可视化-ECharts Html项目实战(14)

在之前的文章中,我们深入学习ECharts鼠标左键触发。想了解的朋友可以查看这篇文章。同时,希望我的文章能帮助到你,如果觉得我的文章写的不错,请留下你宝贵的点赞,谢谢。 数据可视化-ECharts Html项目实战(…

【蓝桥杯2025备赛】素数判断:从O(n^2)到O(n)学习之路

素数判断:从O( n 2 n^2 n2)到O(n)学习之路 背景:每一个初学计算机的人肯定避免不了碰到素数,素数是什么,怎么判断? 素数的概念不难理解:素数即质数,指的是在大于1的自然数中,除了1和它本身不再有其他因数的自然数。 …

动手写sql 《牛客网80道sql》

第1章:SQL编写基础逻辑和常见问题 基础逻辑 SELECT语句: 选择数据表中的列。FROM语句: 指定查询将要从哪个表中检索数据。WHERE语句: 过滤条件,用于提取满足特定条件的记录。GROUP BY语句: 对结果进行分组。HAVING语句: 对分组后的结果进行条件过滤。O…

mac安装nvm详细教程

0. 前提 清除电脑上原有的node (没有装过的可以忽略)1、首先查看电脑上是否安装的有node,查看node版本node -v2、如果有node就彻底删除nodesudo rm -rf /usr/local/{bin/{node,npm},lib/node_modules/npm,lib/node,share/man/*/node.*}2、保证自己的电脑上有安装git,不然下载n…

Unity之OpenXR+XR Interaction Toolkit快速监听手柄任意按键事件

前言 当我们开发一个VR时,有时希望监听一个手柄按键的点击事件,或者一个按钮的Value值等。但是每次有可能监听的按钮有不一样,有可能监听的值不一样,那么每次这么折腾,有点累了,难道就没有一个万能的方法,让我可以直接监听我想要的某个按钮的事件么? 答案是肯定的,今…

Docker基本管理和虚拟化

一、docker的发展历史 https://www.cnblogs.com/rongba/articles/14782624.htmlhttps://www.cnblogs.com/rongba/articles/14782624.html 二、docker的概述 Docker是一个开源的应用容器引擎,基于go语言开发并遵循了apache2.0协议开源。 Docker是在Linux容器里运行…

URL地址解析至页面展示全过程(面试详细解答)

目录 1、解析URL 2、缓存判断 ​3、DNS解析 ​4、获取MAC地址 5、TCP三次握手 6、HTTP请求 7、服务器处理请求,返回HTTP响应 8、页面渲染 9、TCP四次挥手 10、浏览器解析HTML 11、浏览器布局渲染 1、解析URL 首先会对 URL 进行解析,分析所需…

SpringMVC基础篇(二)

文章目录 1.Postman1.基本介绍Postman是什么? 2.Postman快速入门1.Postman下载点击安装自动安装在系统盘 2.基本操作1.修改字体大小2.ctrl “” 放大页面3.进入创建请求界面 2.需求分析3.具体操作4.保存请求到文件夹中1.点击保存2.创建新的文件夹3.保存成功 3.使用…

【注释和反射】获取class类实例的方法

目录 一、获取一个类的Class对象的几种方法 代码 二、哪些类型可以有Class对象? 代码 一、获取一个类的Class对象的几种方法 Class对象是访问类元数据的入口,通过它可以获取类的名称、方法、字段、构造器、注解等信息,还可以创建类的实例…