分布式与一致性协议之CAP和Paxos算法(一)

news2024/12/28 14:27:05

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.coloradmin.cn/o/1634847.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

STM32驱动SYN6288语音合成模块

STM32驱动SYN6288语音合成模块 简介功能特点通讯方式接线代码结果总结 简介 SYN6288通过异步串口(UART) 通讯方式,接收待合成的文本数据,从而实现文本到语音的转换SYN06188 语音芯片的优秀特点:最小SS0P28L 贴片封装、硬件接口简单、低功耗、音色清亮圆…

C++中auto关键字的用法详解

1.简介 auto作为一个C语言就存在的关键字,在C语言和C之间却有很大区别。 在C语言中auto修饰的变量,是具有自动存储器的局部变量,但因为局部变量默认类别默认是auto修饰导致一直没有人去使用它。 C11中,标准委员会赋予了auto全新…

Linux学习笔记:进程间的通信.共享内存shm

共享内存shm 什么是共享内存shm共享内存的特点关键函数ftokshmgetshmatshmdtshmctl 代码示例 什么是共享内存shm 进程间通信的前提:必须让不同的进程看到同一份资源,并且这个资源是OS提供的 而共享内存(Share memory)就是在内核共享内存区找一块物理内存空间,并允许多个进程共…

西瓜书学习——决策树形状、熵和决策树的本质

文章目录 决策树形状监督学习算法分类与回归 熵信息熵香农熵 (Shannon Entropy) - H(X)联合熵 (Joint Entropy) - H(X, Y)条件熵 (Conditional Entropy) - H(Y|X)互信息 (Mutual Information) - I(X; Y)相对熵 (Relative Entropy) / KL散度 (Kullback-Leibler Divergence) - DK…

学习CSS3,实现红色心形loading特效

试想一下,如果你的网站在加载过程中,loading图由一个老旧的菊花转动图片,变为一个红色的心形loading特效,那该有多炫酷啊。 目录 实现思路 初始化HTML部分 延迟动画是重点 设定动画效果 完整源代码 最后 实现思路 每个…

怎样批量将jpg图片转换成HEIC格式?jpg快速转换成HEIC图片

heic格式和jpg格式图片大家都很熟悉了。那么这两种图片格式的区别是什么?哪种格式图片更好一些? 一,区别:jpg和HEIC的区别 1,jpg格式有良好的压缩性能和良好的重建质量而被广泛应用于图像和视频处理中。 2&#xff…

HarmonyOS实战开发-RPC连接、如何实现前台选择商品和数目,后台计算总价的功能

介绍 本示例使用ohos.rpc 相关接口,实现了一个前台选择商品和数目,后台计算总价的功能,使用rpc进行前台和后台的通信。 效果预览 使用说明: 点击商品种类的空白方框,弹出商品选择列表,选择点击对应的商品…

常用工具网站

代码生成器: SQL转Java代码生成器 | 不求人导航SQL转Java代码生成器https://codegen.bqrdh.com/

面试题-Redis篇

什么是 Redis? Redis 是完全开源免费的,遵守 BSD 协议,是一个高性能的 key-value 数据库。 Redis 与其他 key - value 缓存产品有以下三个特点: Redis 支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时 …

windows10 H2database 安装教程

1. 下载https://www.h2database.com/html/download.htmlhttps://www.h2database.com/html/download.html 具体版本可以根据项目配置的版本 2. 安装 3.手动启动 安装完后默认启动,如退出后需手动启动则在安装目录下启动。 启动完,在桌面右下角会出现小图…

春游江淮 请来池州 | 五一池州文旅活动时间表大集合,都在这里

快到五一,想好去哪里玩吗?来池州,各景区缤纷活动登场, 速速划重点、敲黑板! 五一放大招!到底怎么玩?文旅活动、阅读推广 非遗展示......现在都已经为你整理好啦!这份超齐全的 五一假期文旅活动时间表,助力您玩转各景区,整个假期嗨不停~ 旅游惠民活动 表演类活动…

一、初识Django

简介 Django 是一个用于构建 Web 应用程序的高级 Python Web 框架。 版本对应 不同版本的django框架是基于特定的不同的python版本开发的,所以不同版本的django框架要正常执行功能只能安装特定的python版本 Django安装 安装 Django # 全局安装 pip install dj…

Python | Leetcode Python题解之第50题Pow(x,n)

题目: 题解: class Solution:def myPow(self, x: float, n: int) -> float:def quickMul(N):ans 1.0# 贡献的初始值为 xx_contribute x# 在对 N 进行二进制拆分的同时计算答案while N > 0:if N % 2 1:# 如果 N 二进制表示的最低位为 1&#xf…

Java面试八股之简述Java中assert的作用

简述Java中assert的作用 Java中的assert关键字用于在代码中插入断言(Assertion),断言是一种在开发和测试阶段用于验证程序内部状态或假设的机制。其主要作用包括: 条件检查: assert语句用于在特定代码点上检查一个布…

2024年【氧化工艺】最新解析及氧化工艺复审模拟考试

题库来源:安全生产模拟考试一点通公众号小程序 氧化工艺最新解析是安全生产模拟考试一点通总题库中生成的一套氧化工艺复审模拟考试,安全生产模拟考试一点通上氧化工艺作业手机同步练习。2024年【氧化工艺】最新解析及氧化工艺复审模拟考试 1、【单选题…

小白也能看懂,手机短信恢复方法其实很简单!

手机短信是我们日常生活中不可或缺的一部分,有时候我们可能会不小心删除了一些重要的短信,有没有手机短信恢复方法呢?别担心,本文将为您介绍3个手机短信恢复的方法,让您轻松找回丢失的短信。 方法一:通过短…

80 行 JS 代码实现页面添加水印:文字水印、多行文字水印、图片水印、文字图片水印

80 行 JS 代码实现页面添加水印:文字水印、多行文字水印、图片水印、文字&图片水印 一、水印概括 1. 添加水印的好处 信息标识: 水印可以用于标识文档的所有者、保密级别、状态或其他相关信息,帮助用户更好地理解文档内容的属性版权保…

【基础算法】二分查找

1.二分查找 二分查找 思路&#xff1a; 朴素二分模版 class Solution { public:int search(vector<int>& nums, int target) {int l 0, r nums.size() - 1;while(l < r){int mid (l r) / 2;if(nums[mid] < target) l mid 1;else if(nums[mid] > ta…

Python中的类(Class)详解——新手指南

在Python编程中&#xff0c;类&#xff08;Class&#xff09;是一个非常重要的概念&#xff0c;它允许程序员创建自己的对象类型。这些对象类型可以包含数据&#xff08;称为属性&#xff09;和函数&#xff08;称为方法&#xff09;&#xff0c;它们定义了这些对象的行为。本文…

计算机毕业设计php自行车在线租赁管理系统-vue+mysql

本系统的开发使获取自行车在线租赁管理系统信息能够更加方便快捷&#xff0c;同时也使自行车在线租赁管理系统管理信息变的更加系统化、有序化。系统界面较友好&#xff0c;易于操作。 自行车在线租赁管理系统&#xff0c;主要的模块包括首页、个人中心、用户管理、会员管理、自…