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

CAP 理论

如何使用BASE理论

以InfluxDB系统中DATA节点的集群实现为例。DATA节点的核心功能是读和写,所以基本可用是指读和写的基本可用。我们可以通过分片和多副本实现读和写的基本可用。也就是说,将同一业务的数据先分片,再以多份副本的形式分布在不同的节点上。如图所示。除非这个3节点2副本的DATA集群超过一半的节点都发生故障,否则是能保障所有数据的读写的。
在这里插入图片描述

那么,如何实现最终一致性呢?就像上文提到的,我们可以通过写时修复和异步修复实现最终一致性。另外可以同时实现自定义写一致性级别,如支持All、Quorum、One、Any4种写一致性级别,用户在写数据的时候,可以根据业务数据特点,设置不同的写一致性级别。

注意

对于任何集群而言,不可预知的故障的最终后果都是系统过载,所以,如何设计过载保护,实现系统在过载时的基本可用,时开发和运营互联网后天的分布式系统的重中之重。建议在开发实现分布式系统前就要充分考虑如何实现基本可用

Paxos算法

概述

提到分布式算法,就不得不提Paxos算法,在过去几十年里,它基本上时分布式共识的代名词,当前最常用的一批共识算法都是基于它改进的。比如, Fast Paxos算法、Cheap Paxos算法、Raft算法等。但是,很多人都会在准确和系统理解Paxos算法上踩坑,比如,只知道它可以用来达成共识,却不知道它是如何达成共识的。
这其实从侧面说明了Paxos算法有一定的难度,可分布式算法本身就很复杂,Paxos算法自然也不会例外。当然,除了这一点,还与Paxos算法的提出者莱斯利兰伯特有关。
兰伯特提出的Paxos算法包含两个部分:

  • 1.一个是Basic Paxos算法,描述的是多节点之间如何就某个值(提案Value)达成共识
  • 2.另一个是Multi_Paxos思想,描述的是执行多个Basic Paxos示例,就一系列值达成共识。
    但是,因为兰伯特提到的Multi-Paxos思想缺少代码实现的必要细节(比如怎么选举领导者),所以我们理解起来比较困难

Basic Paxos:如何在多个节点间确定某变量的值。

在我看来,Basic Paxos是Multi-Paxos思想的核心,说白了,Multi-Paxos就是多执行几次Basic Paxos。所以掌握了Basic Paxos,我们便能更好地理解后面基于Multi-Paxos思想的共识算法(比如Raft算法),还能掌握分布式共识算法的最核心内容,当现有算法不能满足业务需求时,可以权衡折中,设计自己的算法。

假设我们要实现一个分布式集群,这个集群由节点A、B、C组成,提供只读KV存储服务。你应该知道,创建只读变量的时候必须要对它进行赋值,而且后续不能对该值进行修改。也就是说,一个节点创建只读变量后,就不能再修改它了,所以,所有节点必须要先对只读变量的值达成共识,然后再由所有节点一起创建这个只读变量。那么,当有多个客户端(比如客户端1、2)访问这个系统,试图创建同一个只读变量(比如X)时,例如客户端1试图创建值为3的X,客户端2试图创建值为7的X,该如何达成共识,实现各节点上X值的一致呢?如图所示
在这里插入图片描述

在一些经典的算法种,你会看到一些既形象又独有的概念(比如二阶段提交协议种的协调者),Basic Paxos算法也不例外。为了帮助人们
更好地理解Basic Paxos算法,兰伯特在讲解时也使用了一些独有而且比较重要的概念,如提案(Propose)、准备(Prepare)请求、接受(Accept)请求
、角色等,其中最重要的就是"角色"。因为角色时对Basic Paxos中最核心的3个功能的抽象,比如,由接受者(Acceptor)对提议的值进行投票,
并存储接受的值

你需要了解的3种角色

在Basic Paxos中有提议者(Proposer)、接收者(Acceptor)、学习者(Learner)3种角色,它们之间的关系如图所示。
在这里插入图片描述

  • 提议者: 提议一个值,用于投票表决。为了方便理解,你可以把上图中的客户端1和客户端2看作提议者。但在绝大多数场景中,集群中收到客户端请求的节点菜是提议者,这样做的好处是,对业务代码没有入侵性,也就是说,我们不需要在业务代码中实现算法逻辑,就可以像使用数据库一样访问后端的数据
  • 接受者:对每个提议的值进行投票,并存储接受的值,比如A、B、C3个节点,一般来说,集群中的所有节点,都在扮演接受者的角色,参与共识协商,并接受和存储数据
  • 学习者:被告知投票的结果,接受达成共识的值并存储该值,不参与投票的过程,一般来说,学习者是数据备份节点,比如
    Master-Slave模型中的Slave,被动地接受数据,容灾备份。

你可能会疑惑:前面不是说接收客户端请求的节点是提议者吗?这里怎么又说该节点是接受者呢?这是因为一个节点(或进程)可以身兼多个角色。想象一下,一个3节点的集群,1个节点收到了请求,那么该节点将作为提议者发起二阶段提交,然后这个节点还会和另外两个节点一起作为接受者进行共识协商,如图所示。
在这里插入图片描述

其实,这3种角色在本质上代表的是3种功能:

  • 1.提议者代表接入和协调功能,收到客户端请求后,发起二阶段提交,进行共识协商;
  • 2.接受者代表投票协商和存储数据功能,对提议的值进行投票,接受达成共识的值并存储该值
  • 3.学习者代表存储数功能,不参与共识协商,只接受达成共识的值并存储该值

因为一个完整的算法过程是由这3种角色对应的功能组成的,所以理解这3种角色是理解Basic Paxos如何就提议的值达成共识的基础

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/314361.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Rust中的函数指针

什么是函数指针 通过函数指针允许我们使用函数作为另一个函数的参数。函数的类型是 fn (使用小写的 ”f” )以免与 Fn 闭包 trait 相混淆。fn 被称为 函数指针(function pointer)。指定参数为函数指针的语法类似于闭包。 函数指…

如何在TestNG中忽略测试用例

在这篇文章中,我们将讨论如何在TestNG中忽略测试用例。TestNG帮助我们忽略使用Test注释的情况,我们可以在不同的级别上忽略这些情况。 首先,只忽略一个测试方法或测试用例。第二,忽略一个类及其子类中的所有情况。第三个是&#…

【深度学习】YOLOv5,烟雾和火焰,目标检测,防火检测,森林火焰检测

文章目录 数据收集和数据标注查看标注好的数据的脚本下载yolov5创建 dataset.yaml训练参数开始训练yolov5n训练训练后的权重下载gradio部署 数据收集和数据标注 搜集数据集2w张。 pip install labelme labelme 然后标注矩形框和类别。 下载数据请看这里: https:…

图像处理之Retinex算法(C++)

图像处理之Retinex算法(C) 文章目录 图像处理之Retinex算法(C)前言一、单尺度Retinex(SSR)1.原理2.代码实现3.结果展示 二、多尺度Retinex(MSR)1.原理2.代码实现3.结果展示 三、带色…

【01-机器学习入门:理解Scikit-learn与Python的关系】

文章目录 前言Python与机器学习Scikit-learn简介Scikit-learn与Python的关系使用Scikit-learn进行机器学习结语 前言 在当今的数据科学和人工智能领域,机器学习已经成为了一个不可或缺的组成部分。而对于那些刚刚踏入这一领域的新手来说,理解机器学习的基…

线性代数 --- 矩阵的对角化以及矩阵的n次幂

矩阵的对角化以及矩阵的n次幂 (特征向量与特征值的应用) 前言: 在上一篇文章中,我记录了学习矩阵的特征向量和特征值的学习笔记,所关注的是那些矩阵A作用于向量x后,方向不发生改变的x(仅有尺度的缩放)。线…

Xilinx 7系列中clock IP核通过AXI4-Lite接口实现动态重新配置

当选择了动态重配置(Dynamic Reconfiguration)选项时,AXI4-Lite接口将默认被选中用于重新配置时钟组件。动态重新配置可以通过AXI4-Lite接口实现了Clocking Wizard IP核的时钟组件MMCM/PLL的动态重新配置。 如果需要直接访问MMCM/PLL的DRP寄…

C++ 头文件/宏冲突问题解决?如何解决?

🏆本文收录于「Bug调优」专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&…

SpringBoot + kotlin 协程小记

前言: Kotlin 协程是基于 Coroutine 实现的,其设计目的是简化异步编程。协程提供了一种方式,可以在一个线程上写起来像是在多个线程中执行。 协程的基本概念: 协程是轻量级的,不会创建新的线程。 协程会挂起当前的协…

【软件】ERETCAD-Env:在轨空间环境3D动态仿真软件

文章介绍了Extreme-environment Radiation Effect Technology Computer-Aided Design – Environment (ERETCAD-Env)软件,文章的介绍和展示了ERETCAD-Env软件的功能和特点,这是一款用于动态模拟在轨卫星所处空间环境的计算机辅助设计软件。强调了该软件在…

如何在CentOS本地搭建DataEase数据分析服务并实现远程查看数据分析

文章目录 前言1. 安装DataEase2. 本地访问测试3. 安装 cpolar内网穿透软件4. 配置DataEase公网访问地址5. 公网远程访问Data Ease6. 固定Data Ease公网地址 前言 DataEase 是开源的数据可视化分析工具,帮助用户快速分析数据并洞察业务趋势,从而实现业务…

pycharm远程连接server

1.工具–部署–配置 2.部署完成后,将现有的项目的解释器设置为ssh 解释器。实现在远端开发 解释器可以使用/usr/bin/python3

怎么排查K8S容器当中的Java程序内存泄露问题

今天早上发现生产线其中的一个服务在凌晨的时候突然重启了,内存突然从1G升到1.8G,CPU使用量从0.1升到了0.28,说明在这个时间点,内存突增达到了限额以上,服务重启了。因为这个服务布署了多节点,这次重启对业…

12 c++版本的坦克大战

前言 呵呵 这大概是 大学里面的 c 贪吃蛇了吧 有一些 面向对象的理解, 但是不多 这里 具体的实现 就不赘述, 仅仅是 发一下代码 以及 具体的使用 坦克大战 #include<iostream> #include<windows.h> #include<conio.h> #include<ctime> #include…

jvm(JVM快速入门、stack栈、堆、GC垃圾回收、Arthas)

文章目录 1. JVM快速入门1.1. 结构图1.2. 类加载器ClassLoader1.3. 执行引擎Execution Engine1.4. 本地接口Native Interface1.5. Native Method Stack1.6. PC寄存器(程序计数器)1.7. Method Area方法区 2. stack栈3. 堆3.1. 堆体系概述3.1.1. 新生区3.1.2. 老年代3.1.3. 永久代…

分类预测 | Matlab实现CNN-GRU-SAM-Attention卷积门控循环单元融合空间注意力机制的数据分类预测

分类预测 | Matlab实现CNN-GRU-SAM-Attention卷积门控循环单元融合空间注意力机制的数据分类预测 目录 分类预测 | Matlab实现CNN-GRU-SAM-Attention卷积门控循环单元融合空间注意力机制的数据分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.Matlab实现CNN-GRU…

Visual Studio 对 C++ 头文件和模块的支持

在 C 编程领域&#xff0c;头文件和模块的管理有时候确实比较令人头疼。但是&#xff0c;有许多工具和功能可以简化此过程&#xff0c;提高效率并减少出错的可能性。下面是我们为 C 头文件和模块提供的几种工具的介绍。 构建明细 通过菜单栏 Build > Run Build Insights&a…

基于Rust的多线程 Web 服务器

构建多线程 Web 服务器 在 socket 上监听 TCP 连接解析少量的 HTTP 请求创建一个合适的 HTTP 响应使用线程池改进服务器的吞吐量优雅的停机和清理注意&#xff1a;并不是最佳实践 创建项目 ~/rust ➜ cargo new helloCreated binary (application) hello package~/rust ➜ma…

maven-依赖管理

依赖配置 https://mvnrepository.com/?__cf_chl_rt_tkvRzDsumjmJ_HF95MK4otu9XluVRHGqAY5Wv4UQYETR8-1714103058-0.0.1.1-1557 <dependencies><dependency><groupId></groupId><artifactId></artifactId><version></version>…

Day4 商品管理

Day4 商品管理 这里会总结构建项目过程中遇到的问题&#xff0c;以及一些个人思考&#xff01;&#xff01; 学习方法&#xff1a; 1 github源码 文档 官网 2 内容复现 &#xff0c;实际操作 项目源码同步更新到github 欢迎大家star~ 后期会更新并上传前端项目 编写品牌服务 …