共识算法介绍
文章目录
- 共识算法
- Paxos 算法
- 三种角色
- 一致性
- 提交算法
- prepare 阶段
- accept 阶段
- commit 阶段
- CAP 定理
- BASE 理论
- Zookeeper 算法实现
- 三类角色
- 三个数据
- 三种模式
- 四种状态
- 消息广播算法
- Leader选举算法
共识算法
Paxos 算法
Paxos 算法是莱斯利·兰伯特(Leslie Lamport)1990 年提出的一种基于消息传递的、具有高 容错性的一致性算法。Google Chubby 的作者 Mike Burrows 说过,世上只有一种一致性算法, 那就是 Paxos,所有其他一致性算法都是 Paxos 算法的不完整版。Paxos 算法是一种公认的晦 涩难懂的算法,并且工程实现上也具有很大难度。较有名的 Paxos 工程实现有 Google Chubby、 ZAB、微信的 PhxPaxos 等。
三种角色
在 Paxos 算法中有三种角色,分别具有三种不同的行为。但很多时候,一个进程可能同 时充当着多种角色。 Proposal,提案
- Proposer:提案者
- Acceptor:表决者
- Learner:学习者,同步者
一致性
Paxos 算法的一致性主要体现在以下几点:
- 每个提案者在提出提案时都会首先获取到一个递增的、全局唯一的提案编号 N,然后将该编号赋予其要提出的提案。 关于 N 的生成,有两种方式:全局性生成器、提案者自身维护 N。
- 每个表决者在 accept 某个提案后,会将该提案的编号 N 记录在本地,这样每个表决者中保存的已经被 accept 的提案中会存在一个编号最大的提案,其编号假设为 maxN。每个表决者仅会 accept 编号大于自己本地 maxN 的提案。
- 在众多提案中最终只能有一个提案被选定。
- 一旦一个提案被选定,则其它学习者会主动同步(Learn)该提案到本地。
- 没有提案被提出则不会有提案被选定
提交算法
Paxos 对于提案的提交算法有两种方案,2PC 与 3PC。
- 2PC:Two Phase Commit,即 prepare -> accept
- 3PC:Three Phase Commit,即 prepare -> accept -> commit
prepare 阶段
- 提案者(Proposer)准备提交一个编号为 N 的提议,于是其首先向所有表决者(Acceptor)发 送 prepare(N)请求,用于试探集群是否支持该编号的提议。
- 每个表决者(Acceptor)中都保存着自己曾经 accept 过的提议中的最大编号 maxN。当一个 表决者接收到其它主机发送来的 prepare(N)请求时,其会比较 N 与 maxN 的值。有以下 几种情况:
- 若 N 小于 maxN,则说明该提议已过时,当前表决者采取不回应或回应 Error 的方 式来拒绝该 prepare 请求;
- 若 N 大于 maxN,则说明该提议是可以接受的,当前表决者会首先将该 N 记录下来, 并将其曾经已经 accept 的编号最大的提案 Proposal(myid,maxN,value)反馈给提案者, 以向提案者展示自己支持的提案意愿。其中第一个参数 myid 表示该提案的提案者 标识 id,第二个参数表示其曾接受的提案的最大编号 maxN,第三个参数表示该提 案的真正内容 value。当然,若当前表决者还未曾 accept 过任何提议,则会将 Proposal(null,null,null)反馈给提案者。
- 在 prepare 阶段 N 不可能等于 maxN。这是由 N 的生成机制决定的。要获得 N 的值, 其必定会在原来数值的基础上采用同步锁方式增一。
accept 阶段
- 当提案者(Proposer)发出 prepare(N)后,若收到了超过半数的表决者(Accepter)的反馈, 那么该提案者就会将其真正的提案 Proposal(myid,N,value)发送给所有的表决者。
- 当表决者(Acceptor)接收到提案者发送的 Proposal(myid,N,value)提案后,会再次拿出自己曾经 accept 过的提议中的最大编号 maxN,或曾经记录下的 prepare 的最大编号,让 N 与它们进行比较,若 N 大于等于这两个编号,则当前表决者 accept 该提案,并反馈给 提案者。若 N 小于这两个编号,则表决者采取不回应或回应 Error 的方式来拒绝该提议。
- 若提案者没有接收到超过半数的表决者的 accept 反馈,则有两种可能的结果产生。一 是放弃该提案,不再提出;二是重新进入 prepare 阶段,递增提案号,重新提出 prepare 请求。
commit 阶段
若提案者接收到的反馈数量超过了半数,则其会向外广播两类信息:
- 向曾 accept 其提案的表决者发送“可执行数据同步信号”,即让它们执行其曾接收 到的提案;
- 向未曾向其发送 accept 反馈的表决者发送“提案 + 可执行数据同步信号”,即让 它们接受到该提案后马上执行
CAP 定理
CAP 定理又称 CAP 原则,指的是在一个分布式系统中,Consistency(一致性)、Availability (可用性)、Partition tolerance(分区容错性),三者不可兼得
- 一致性(C):分布式系统中多个主机之间是否能够保持数据一致的特性。即当系统数据发生更新操作后,各个主机中的数据仍然处于一致的状态
- 可用性(A):系统提供的服务是否一直处于可用的状态,即对于用户的每一个请求,系 统是否总是可以在有限的时间内对用户做出响应
- 分区容错性(P):分布式系统在遇到任何网络分区故障时,仍能够保证对外提供满足一 致性和可用性的服务。 分区是网络分区
对于分布式系统,网络环境相对是不可控的,出现网络分区是不可避免的,因此系统必 须具备分区容错性。但其并不能同时保证一致性与可用性。CAP 原则对于一个分布式系统来 说,只可能满足两项,即要么 CP,要么 AP
BASE 理论
BASE 是 Basically Available(基本可用)、Soft state(软状态)和 Eventually consistent(最 终一致性)三个短语的简写。
BASE 理论的核心思想是:即使无法做到实时一致性,但每个系统都可以根据自身的业 务特点,采用适当的方式来使系统达到最终一致性
- 基本可用(BA) 基本可用是指分布式系统在出现不可预知故障的时候,允许损失部分可用性
- 软状态(S) 软状态,是指允许系统数据存在的中间状态,并认为该中间状态的存在不会影响系统的 整体可用性,即允许系统主机间进行数据同步的过程存在一定延时。软状态,其实就是一种 灰度状态,过渡状态
- 最终一致性(E) 最终一致性强调的是系统中所有的数据副本,在经过一段时间的同步后,最终能够达到 一个一致的状态。因此,最终一致性的本质是需要系统保证最终数据能够达到一致,而不需 要实时保证系统数据的一致性
从达到一致性的时间角度来划分,可以分为:
- 实时一致性:单机情况下可以实现实时一致性
- 最终一致性:经过一段时间后可以达到一致性
单从客户端访问到的内容角度来划分,可以分为:
- 强一致性(严格一致性):要求客户端访问到的数据都是一致
- 弱一致性:允许客户端访问不到部分或全部更新过的数据
Zookeeper 算法实现
ZAB 协议是 Paxos 算法的一种工业实现算法。但两者的设计目标不太一样。ZAB 协议主 要用于构建一个高可用的分布式数据主从系统,即 Follower 是 Leader 的从机,Leader 挂了, 马上就可以选举出一个新的 Leader,但平时它们都对外提供服务。而 Fast Paxos 算法则是用 于构建一个分布式一致性状态机系统,确保系统中各个节点的状态都是一致的。
三类角色
为了避免 Zookeeper 的单点问题,zk 也是以集群的形式出现的。zk 集群中的角色主要有 以下三类:
- Leader:zk 集群中事务请求的唯一处理者;其也可以处理读请求。
- Follower:处理读请求;将事务请求转发给 Leader;对 Leader 发起的提案进行表决;同 步 Leader 的事务处理结果;在 Leader 的选举过程中具有选举权与被选举权
- Observer:不具有表决权,且在 Leader 选举过程中没有选举权与被选举权的 Follower。 Learner:学习者,同步者。Learner = Follower + Observer QuorumPeer = Participant = Leader + Followe
三个数据
在 ZAB 中有三个很重要的数据:
- zxid:64 位长度的 Long 类型,其高 32 位为 epoch,低 32 位为 xid。
- epoch:每一个新的 Leader 都会有一个新的 epoch
- xid:其为一个流水号
三种模式
ZAB 协议中对 zkServer 的状态描述有三种模式。这三种模式并没有十分明显的界线,它 们相互交织在一起。
- 恢复模式:其包含两个重要阶段:Leader 的选举,与初始化同步
- 广播模式:其可以分为两类:初始化广播,与更新广播
- 同步模式:其可以分为两类:初始化同步,与更新同步
四种状态
zk 集群中的每一台主机,在不同的阶段会处于不同的状态。每一台主机具有四种状态。
- LOOKING:选举状态
- FOLLOWING:Follower 的正常工作状态
- OBSERVING:Observer 的正常工作状态
- LEADING:Leader 的正常工作状态
消息广播算法
当集群中的 Learner 完成了初始化状态同步,那么整个 zk 集群就进入到了正常工作模式 了。 如果集群中的 Learner 节点收到客户端的事务请求,那么这些 Learner 会将请求转发给 Leader 服务器。然后再执行如下的具体过程:
- Leader 接收到事务请求后,为事务赋予一个全局唯一的 64 位自增 id,即 zxid,通过 zxid 的大小比较即可实现事务的有序性管理,然后将事务封装为一个 Proposal。
- Leader 根据 Follower 列表获取到所有 Follower,然后再将 Proposal 通过这些 Follower 的 队列将提案发送给各个 Follower。
- 当 Follower 接收到提案后,会先将提案的 zxid 与本地记录的事务日志中的最大的 zxid 进行比较。若当前提案的 zxid 大于最大 zxid,则将当前提案记录到本地事务日志中,并 向 Leader 返回一个 ACK。(提问学员)
- 当 Leader 接收到过半的 ACKs 后,Leader 就会向所有 Follower 的队列发送 COMMIT 消息,向所有 Observer 的队列发送 Proposal。
- 当 Follower 收到 COMMIT 消息后,就会将事务正式更新到本地。当 Observer 收到 Proposal 后,会直接将事务更新到本地。
- 无论是 Follower 还是 Observer,在同步完成后都需要向 Leader 发送成功 ACK
Leader选举算法
在集群启动过程中的 Leader 选举过程(算法)与 Leader 断连后的 Leader 选举过程稍微 有一些区别,基本相同 若进行 Leader 选举,则至少需要两台主机,这里以三台主机组成的集群为例
在集群初始化阶段,当第一台服务器 Server1 启动时,其会给自己投票,然后发布自己 的投票结果。投票包含所推举的服务器的 myid 和 ZXID,使用(myid, ZXID)来表示,此时 Server1 的投票为(1, 0)。由于其它机器还没有启动所以它收不到反馈信息,Server1 的状态一直属于 Looking,即属于非服务状态。
当第二台服务器 Server2 启动时,此时两台机器可以相互通信,每台机器都试图找到 Leader,选举过程如下:
- 每个 Server 发出一个投票。此时 Server1 的投票为(1, 0),Server2 的投票为(2, 0),然后各自将这个投票发给集群中其他机器。
- 接受来自各个服务器的投票。集群的每个服务器收到投票后,首先判断该投票的有效性,如检查是否是本轮投票、是否来自 LOOKING 状态的服务器。
- 处理投票。针对每一个投票,服务器都需要将别人的投票和自己的投票进行 PK,PK 规则如下:
- 优先检查 ZXID。ZXID 比较大的服务器优先作为 Leader。
- 如果 ZXID 相同,那么就比较 myid。myid 较大的服务器作为 Leader 服务器。
- 对于 Server1 而言,它的投票是(1, 0),接收 Server2 的投票为(2, 0)。其首先会比较两者 的 ZXID,均为 0,再比较 myid,此时 Server2 的 myid 最大,于是 Server1 更新自己的投票为 (2, 0),然后重新投票。对于 Server2 而言,其无须更新自己的投票,只是再次向集群中所有 主机发出上一次投票信息即可。
- 统计投票。每次投票后服务器都会统计投票信息,判断是否已经有过半机器接受到相同的投票信息。对于 Server1、Server2 而言,都统计出集群中已经有两台主机接受了(2, 0) 的投票信息,此时便认为已经选出了新的 Leader,即 Server2。
- 改变服务器状态。一旦确定了 Leader,每个服务器就会更新自己的状态,如果是 Follower,那么就变更为 FOLLOWING,如果是 Leader,就变更为 LEADING。
- 添加主机。在新的 Leader 选举出来后 Server3 启动,其想发出新一轮的选举。但由于 当前集群中各个主机的状态并不是 LOOKING,而是各司其职的正常服务,所以其只能是以 Follower 的身份加入到集群中。
相关文章:
共识算法介绍
文章目录 共识算法Paxos 算法三种角色一致性提交算法prepare 阶段accept 阶段commit 阶段 CAP 定理BASE 理论Zookeeper 算法实现三类角色三个数据三种模式四种状态消息广播算法Leader选举算法 共识算法 Paxos 算法 Paxos 算法是莱斯利兰伯特(Leslie Lamport)1990 年提出的一种…...
Gen-AI 的知识图和分析(无需图数据库)
如今,图表比以往任何时候都更加相关和有用。由于目前正在发生的人工智能革命,工程师们正在考虑围绕 Gen-AI 的机会,利用具有动态提示、数据基础和屏蔽功能的开放 Gen-AI 解决方案,这进一步促使他们思考知识图谱等有效的解决方案。…...
flutter 安卓使用高德插件黑屏
地址 https://lbs.amap.com/api/android-sdk/guide/create-project/android-studio-create-project 下面介绍的方式是Native配置 sdk,也就是需要手动下载到本地在引入的方式 1、添加 jar 文件: 将下载的地图 SDK 的 jar包复制到工程(此处截…...
Java:表单生成excel文档 poi 通用
在用java 写数据库应用的时候, 通常会生成各种报表,而这些报表可能会被导出为各种格式的文件,比如Excel文档,pdf 文档等等. 今天先做了一个生成Excel 文档的例子,主要解决以下问题: 1. 生成 Excel 文档. 2. 自动对生成…...
使用Apache Commons SCXML实现状态机管理
第1章:引言 大家好,我是小黑,咱们程序员在开发过程中,经常会遇到需要管理不同状态和状态之间转换的场景。比如,一个在线购物的订单,它可能有“新建订单”、“已支付”、“配送中”、“已完成”等状态。在这…...
大数据技术原理与应用期末考试题
大数据技术原理与应用期末考试题 一、单选题 1.下面哪个选项属于大数据技术的“数据存储和管理”技术层面的功能? A、利用分布式文件系统、数据仓库、关系数据库等实现对结构化、半结构化和非结构化海量数据的存储和管理 B、利用分布式并行编程模型和计算框架,结合机器学习…...
解决jenkins的Exec command命令不生效,或者执行停不下来的问题
Jenkins构建完后将war包通过 Publish Over SSH 的插件发布到服务器上,在服务器上执行脚本时,脚本中的 nohup 命令无法执行,并不生效,我配置的Exec command命令是后台启动一个war包,并输出日志文件。 nohup java -jar /…...
【PHP】json_decode的第二个参数是什么意思
json_decode() 函数的第二个参数 $associative 是一个布尔值,用于控制 JSON 对象在 PHP 中的解码方式。当将其设置为 true 时,JSON 对象将被解码为关联数组;当设置为 false 时,JSON 对象将被解码为 stdClass 对象。默认值为 false…...
学生公寓安全用电管理系统应用案例
摘要:安全用电是学校公寓用电管理的首要任务,这就需要对一些恶性负载进行识别和控制,同时为了减少电工和后期管理人员的成本,引进了安全用电管理系统。本文在在描述了安全用电管理系统的工作原理和利用智能电表可实现的功能后,阐明…...
python实现简易的flask后端接口
先安装插件pip install flask 新建py脚本文件编码: # -*- coding: utf-8 -*- from flask import Flask from flask_cors import CORS # 跨域依赖,通过pip install flask-cors安装app Flask(__name__) cors CORS(app) # 跨域设置,这样设置…...
CSDN质量分批量查询
单个文章质量分查询地址(点击右边地址): CSDN质量分查询 创作者身份认证审核标准 优质创作者申请条件: 粉丝数在5000以上近30日(申请日算起)原创文章数不少于4篇原创博文总数不少于100篇垂直领域原创数量…...
【MPC学习笔记】01:MPC简介(Lecture 1_1 Unconstrained MPC)
本笔记来自北航诸兵老师的课程 课程地址:模型预测控制(2022春)lecture 1-1 Unconstrained MPC 文章目录 0 MPC 简介0.1 案例引入0.2 系统模型0.3 MPC的优点0.4 MPC的缺点0.5 MPC的未来 1 详细介绍 0 MPC 简介 0.1 案例引入 MPC(…...
c语言结构体学习上篇
文章目录 前言一、结构体的声明1,什么叫结构体?2,结构体的类型3,结构体变量的创建和初始化4,结构体的类型5,结构体的初始化 二、结构体的访问1,结构体成员的点操作符访问2,结构体体成员的指针访问 前言 昨…...
Linux: eBPF: bcc-tools:tcpdrop使用需要注意的问题
最近使用bcc-tools的时候注意到,bcc-tools(eBPF相关软件)的使用版本和内核的版本紧密程度非常高。因为要使用内核的函数或者结构体,所以就必须版本一致是必须的,不然会出现下面的警告或者错误: WARNING: tcp_drop() kernel function not found or traceable. The kernel …...
AI:113-基于卷积神经网络的图像风格迁移
🚀点击这里跳转到本专栏,可查阅专栏顶置最新的指南宝典~ 🎉🎊🎉 你的技术旅程将在这里启航! 从基础到实践,深入学习。无论你是初学者还是经验丰富的老手,对于本专栏案例和项目实践都有参考学习意义。 ✨✨✨ 每一个案例都附带有在本地跑过的关键代码,详细讲解供…...
15、Kubernetes核心技术 - 探针
目录 一、概述 二、探针类型 2.1、就绪探针(Readiness Probe) 2.2、存活探针(Liveness Probe) 三、探针探测方法 3.1、exec 3.2、httpGet 3.3、tcpSocket 四、探针配置项 五、探针使用 5.1、就绪探针(Readin…...
GTK4 环境配置
1 安装gtk4包裹: # sudo yum install gtk4 gtk4-devel gtk4-devel-docs devhelp glib2 glib2-devel glib2-doc 2 安装 glade 4 git clone https://github.com/ag-python/cambalache.git 记住 把软件目录 复制到 一个你不会移动删除的地方(千万别删除这个软件文件夹 因为运行…...
Yolov8部署——segmentation部署以及批量推理
Yolov8部署——segmentation部署以及批量推理 参考:在windows上部署Yolov8主要参考下面两个仓库,https://github.com/xunzixunzi/tensorrt-cpp-api和https://github.com/xunzixunzi/YOLOv8-TensorRT-CPP,代码说是适合批量处理,但是代码中是以…...
再见2023,你好2024!
大家好,我是老三,本来今天晚上打算出去转一转,陆家嘴打车实在太艰难了,一公里多的路,司机走了四十分钟,还没到,再加上身体不适,咳嗽地比较厉害,所以还是宅在酒店里&#…...
【计算机毕业设计】SSM二手交易网站
项目介绍 该项目分为前后台,前台普通用户角色,后台管理员角色。 管理员主要功能如下: 登陆,商品分类管理,商品管理,商品订单管理,用户管理等功能。 用户角色主要功能如下: 包含以下功能:查看所有商品,用户登陆注册…...
纠删码ReedSolomon
随着大数据技术的发展,HDFS作为Hadoop的核心模块之一得到了广泛的应用。为了数据的可靠性,HDFS通过多副本机制来保证。在HDFS中的每一份数据都有两个副本,1TB的原始数据需要占用3TB的磁盘空间,存储利用率只有1/3。而且系统中大部分…...
C++音视频开发技巧汇总(持续更新)
1.录制PCM数据 有时候我们需要录制PCM数据到文件以测试录制数据是否正确,一般可以使用以下代码实现: FILE *pf; fopen_s(&pf, "rec.pcm", "wb"); fwrite(myPcmArr, 1, outBufferLen, pf); 录制pcm文件后可以使用Audacity来导…...
4462 4.曙曙献爱心
#include<bits/stdc.h> using namespace std; int n,m,k; int a[1001]; int s[1001]; int f[1001][1001];//f[i][j],i个警察,j个点,能管理的最大人数 int main(){cin>>n>>m>>k;for(int i1;i<n;i){cin>>a[i…...
浅谈命令模式
命令模式是一种行为设计模式,用于将一个请求封装成一个对象,从而使得请求的发送者和接收者解耦,并支持对请求进行参数化、队列化、撤销和重做等操作。 在命令模式中,有一下介个关键角色: Command(命令&am…...
软件测试/测试开发丨Python 模块与包
python 模块与包 python 模块 项目目录结构 组成 package包module模块function方法 模块定义 定义 包含python定义和语句的文件.py文件作为脚本运行 导入模块 import 模块名from <模块名> import <方法 | 变量 | 类>from <模块名> import * 注意&a…...
java企业网站系统Myeclipse开发mysql数据库web结构java编程计算机网页项目
一、源码特点 java Web企业网站系统是一套完善的java web信息管理系统,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发,数据库为Mysql5.0&…...
MAC电脑安装java开发工具
一、安装brew 1.1、官网地址 链接 1.2、更新地址 二、安装 java brew install openjdk11 三、安装gradle Gradle安装与配置教程 - 知乎 四、GIT 4.1、GIT安装 brew install git 4.2、rsa ssh-keygen -t rsa -C "jhestarbucks.com" 五、自动搭建一个springBoot…...
高压继电器,未来几年市场将保持稳定增长
高压继电器是一种用于控制大功率电气设备的开关装置,广泛应用于电力系统、轨道交通、工业自动化等领域。随着各行业对电气控制需求的不断增加,高压继电器市场也在不断扩大。全球高压继电器市场分析: 在全球市场中,目前主要的高压继…...
在Go语言中实现HTTP请求的缓存
大家好,我是你们可爱的编程小助手,今天我们要一起探讨如何使用Go语言实现HTTP请求的缓存。听起来是不是很酷?让我们开始吧! 首先,我们要明白什么是缓存。简单来说,缓存就是将数据存储在内存中,…...
技术扫盲:如何优雅的使用 java -jar
java -jar xxx.jar java -jar 是一个用于在命令行界面中执行 Java 可执行 JAR 文件的命令。它的语法如下: java -jar <JAR 文件路径> [参数]其中: java 是 Java 运行时环境的可执行文件。-jar 是一个选项,表示要执行的文件是一个 JA…...
旅游网站只做/seo数据分析
介绍 Python代码审计方法多种多样,但是总而言之是根据前人思路的迁移融合扩展而形成。目前Python代码审计思路,呈现分散和多样的趋势。Python微薄研发经验以及结合实际遇到的思路和技巧进行总结,以便于朋友们的学习和参考。 SQL注入和ORM注入…...
软件定制和开发/安卓神级系统优化工具
转自:mysql有关权限的表都有哪几个一、关于MySQL权限的几点常识:1、MySQL的权限系统主要用来验证用户的操作权限。2、在MySQL内部,权限信息存放在MySQL数据库的granttable里。当mysql启动后,granttabhttps://www.pinlue.com/artic…...
wordpress获取当前页地址/b2b电子商务平台排名
原题地址 题目描述 有 nnn 个小朋友坐成一圈,每人有 aia_iai 个糖果。每人只能给左右两人传递糖果。每人每次传递一个糖果代价为 111 。 输入格式 小朋友个数 nnn,下面 nnn 行 aia_iai 。 输出格式 求使所有人获得均等糖果的最小代价。 输入输出…...
淄博网站建设网站推广优化/线在成都网站推广公司
微信小商店是小程序团队提供的一项新能力,可以帮助商家免开发、零成本、一键生成卖货小程序; 微信小商店包含商品信息发布、商品交易、订单和物流管理、营销、资金结算、客服与售后等电商经营基础功能模块,并内嵌直播功能;支持企业…...
选择合肥网站建设/网站注册信息查询
文章目录简介nvue 和 vue 相互通讯方式:nvue注意事项:简介 uni-app是逻辑渲染分离的,渲染层在app端提供了两套排版引擎, 小程序方式的webview渲染和weex方式的原生渲染,两种渲染引入可以自己根据需要选。 vue文件走的…...
百度不做网站外链是什么/营销网站建设都是专业技术人员
window.location.href "这里写页面的路径"; 如:window.location.href "www.baidu.com";转载于:https://www.cnblogs.com/plqaly/p/3464259.html...