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

3-zookeeper之ZAB协议

Zookeeper

ZAB协议

概述

  1. ZAB(Zookeeper Automic Broadcast)是一套专门为Zookeeper设计的用于进行原子广播崩溃恢复的协议
  2. ZAB协议主要包含了两个功能
    1. 原子广播:保证数据一致性
    2. 崩溃恢复:保证集群的高可用
  3. ZAB协议本身是基于2PC算法来进行的设计,加入了PAXOS算法和过半性进行了改进
  4. 正因为ZAB协议的特点,所以Zookeeper是一个CP框架

2PC算法

  1. 2PC(Two Phase Commit),二阶段提交,顾名思义,将请求的完成过程拆分成了2个阶段

  2. 在2PC算法中,包含了两类角色:协调者(negotiator)和参与者(participants)

  3. 过程

    1. 请求阶段:协调者收到请求之后,不会立即决定这个请求是否执行,而是会将这个请求发送给所有的参与者,要求所有的参与者在规定时间内进行反馈

      2PC-请求阶段
    2. 提交阶段:当协调者在规定时间内收到所有参与者返回的yes,那么就表示这个请求可以执行,此时协调者命令所有的参与者执行这个请求

      2PC-提交阶段
    3. 中止阶段:当协调者没有在规定时间内收到所有参与者的yes,那么此时协调者就会放弃这个请求并且命令所有的参与者也放弃这个请求

  4. 2PC只会执行两个阶段:请求-提交,请求-中止

  5. 2PC的核心思想是"一票否决"

  6. 2PC的优势和劣势都非常明显

    1. 优势:理解和实现过程都会非常简单
    2. 劣势:会非常受外部环境影响。当集群规模较大的时候,2PC基本不可能成功
  7. 2PC提供了一种思路:在分布式环境中,如何就一个请求达成所有节点的一致性

PAXOS算法

  1. PAXOS算法是兰伯特在1998年发表的一篇论文<PAXOS Made Simple>首次提出,后来兰伯特在2001年的时候才发表了这个算法的推论过程,并且兰伯特凭此获得了图灵奖
  2. 故事背景:在一个PAXOS小岛上,生活着一群人,这群人由议会管理,议会中的每一个议员都不是专职的而是兼职的,这也就意味着每一位议员都会随时参与议会提案的决策,也随时都会撤离。那么此时,如何就一项提案达成一个一致性的意见?
  3. PAXOS算法解决的问题:如何在不稳定网络中达成集群的一致性
  4. PAXOS算法中包含了3类角色
    1. Proposer:提议者,负责提出提案(Proposal)
    2. Acceptor:接受者,接收并且回应提案
    3. Learner:学习者,不参与决策,而是学习最后的效果
  5. 一个节点既可以是Proposer,也可以是Acceptor(这与zookeeper不同,zookeeper只能有一个leader)
  6. PAXOS算法过程
    1. Prepare(准备)阶段
      1. Proposer会先给自己的提案生成一个全局唯一且递增的编号Proposal ID,并且给Acceptor发送Propose请求。注意,此时这个请求中没有携带具体的请求内容,只是携带Proposal ID
      2. Acceptor接收到Proposer的请求之后,会进行Promise(承诺):
        1. 不再接收Proposal ID小于等于当前编号的Propose请求
        2. 不再接收Proposal ID小于当前提案的Accept请求
        3. 在不违背承诺的前提下,Acceptor回复给Proposer当前接收到的最大的Proposal ID,如果没有则返回null
    2. Accept(接受/表决阶段
      1. Proposer在接收到半数及以上的Acceptor返回的Promise之后,会要求所有的Acceptor执行刚才的提案
      2. Acceptor在不违背承诺的前提下,会处理这个Proposal
    3. Learn(学习)阶段:Proposal执行完成之后,Learner会执行这个请求
  7. PAXOS算法可能会导致产生活锁

原子广播

  1. 原子广播,依赖于ZAB协议来实现了数据一致性。基于ZAB协议,Zookeeper实现了一种类似于主从结构的特点

  2. 不同于PAXOS算法的地方在于,在ZAB协议中,只允许一个角色(leader)进行提案,并且在集群中只能有一个leader(全局唯一),从而避免产生活锁问题

  3. 过程

    1. leader接收到请求之后,会先将这个请求记录到本地的日志文件中
    2. 如果记录成功,那么leader会为这个请求生成一个唯一的编号(事务id,Zxid),然后将Zxid放到队列中,发送给每一个follower
    3. follower收到队列之后,会从队列中依次取出请求,记录到本地的日志文件中。如果记录成功,那么会给leader返回一个ACK(Acknowledge Character,确认字符)表示确认;如果记录失败,那么会给leader返回一个失败信息
    4. 如果leader收到半数及以上的follower返回的ACK,那么就表示这个请求可以执行,那么此时leader就会命令所有的follower以及observer执行这个请求;反之,就会命令所有的follower以及observer放弃这个请求
  4. 日志文件的位置由dataLogDir属性决定,但是dataLogDir的值默认和dataDir一致

  5. 查看log文件

    # 从Zookeeper3.5.5开始,提供了zkTxnLogToolkit.sh;在3.5.5之前,通过LogFormatter类来查看
    zkTxnLogToolkit.sh log.200000001
    
  6. 查看快照文件

    zkSnapShotToolkit.sh snapshot.100000000
    
  7. 如果follower记录失败,那么还需要执行这个请求,此时follower会给leader发送请求,请求获取刚才任务的事务id,重新记录,记录成功,则执行这个任务;如果记录失败,那么会重新请求重新记录

  8. 如果一个节点加入了Zookeeper,这个节点会先找到自己最大的事务id,然后自己的最大事务id发送给leader,leader收到之后,会将欠缺的事务放入队列中发送给这个follower,follower收到之后,回依次从队列中取出请求依次记录执行。这个节点在补齐期间,不对外接收写操作

  9. 注意:Zookeeper所有的节点都能接收请求,如果是读请求,那么直接处理回复;如果follower接收到了写请求,会将这个请求转给leader,进行原子广播

扩展

CAP理论

概述

  1. 对于分布式框架而言,基本上都会遵循CAP三大理论
  2. CAP(CAP理论是从客户端角度出发的!!!)
    1. C(Consistency):一致性。在一段时间内,访问这个集群获取到的数据是相同的 。注意,此时,在一个时间段内,不要求每一台服务器的数据都一样,只要保证客户端获取到的数据一样就行
    2. A(Availability):可用性。当客户端对集群中的节点发起请求的时候,节点能够在合理的时间内(一般理解为立刻)进行响应 - 时效性。注意,此处的可用性和服务器的高可用不是一回事儿!!!
    3. P(Partition Tolerance):分区容忍性。当集群中的某一个或者一部分节点产生故障的时候,不会影响集群其他功能的使用和运行。注意,服务器的高可用指的是分区容忍性
  3. CAP经过严格的理论证明,无法同时满足。对于集群而言,首先要考虑满足P,所以一个集群要么是CP结构要么是AP结构

一致性方式

  1. 强一致性:当一个节点上的数据发生变化的时候,其他节点能够立即感知这个变化并作出对应相应
  2. 弱一致性:当一个节点上的数据发生变化的时候,其他节点能够部分感知这个变化或者对变化没有感知
  3. 最终一致性:忽略中间过程,最终结果相同

一致性实现方案

  1. 主从(Master-Slave,简称为M/S)结构:通过一个主节点来管理其他的从节点,客户端只能通过访问主节点来获取数据
  2. PAXOS算法及其变种,例如ZAB协议就是PAXOS的变种算法
  3. WNR策略。W表示写入节点数量,R表示读取节点数量,N表示总节点数量,只要保证W+R>N,就能保证数据一致性——

相关文章:

3-zookeeper之ZAB协议

Zookeeper ZAB协议 概述 ZAB(Zookeeper Automic Broadcast)是一套专门为Zookeeper设计的用于进行原子广播和崩溃恢复的协议ZAB协议主要包含了两个功能 原子广播&#xff1a;保证数据一致性崩溃恢复&#xff1a;保证集群的高可用 ZAB协议本身是基于2PC算法来进行的设计&#…...

如何为企业策划一场XR虚拟直播?

活动年年办&#xff0c;都是老一套&#xff0c;想玩点新花样&#xff1f; 预算有限&#xff0c;但还是想把活动办的逼格高一点&#xff1f; 想通过活动&#xff0c;让更多的人知道自己企业的品牌&#xff1f; 随着AIGC技术的不断演变&#xff0c;企业活动的形式和内容也在不…...

6.3物联网RK3399项目开发实录-驱动开发之I2C 使用(wulianjishu666)

物联网开发源码案例集&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1kfPDpYZpm_G0GBLAup3KTQ?pwdvgvv I2C 使用 简介 AIO-3399J 开发板上有 9 个片上 I2C 控制器&#xff0c;各个 I2C 的使用情况如下表&#xff1a; 本文主要描述如何在该开发板上配置 I2C。 配置…...

HarmonyOS实战开发-如何构建多种样式弹窗

介绍 本篇Codelab将介绍如何使用弹窗功能&#xff0c;实现四种类型弹窗。分别是&#xff1a;警告弹窗、自定义弹窗、日期滑动选择器弹窗、文本滑动选择器弹窗。需要完成以下功能&#xff1a; 点击左上角返回按钮展示警告弹窗。点击出生日期展示日期滑动选择器弹窗。点击性别展…...

《Effective C++》《构造/析构/赋值运算——7、为多态基类声明virtual析构函数》

文章目录 1、term7:Declare destructors virtual in polymorphic base classes2、总结3、相关面试题3.1 析构函数在什么情况下声明为虚函数 4、参考 1、term7:Declare destructors virtual in polymorphic base classes 带有多态性质的基类应该声明一个virtual析构函数&#x…...

Type-C一分二快充线智能分配方案

随着移动设备的普及和快充技术的迅猛发展&#xff0c;Type-C接口已成为众多手机、平板和笔记本电脑的标配。然而&#xff0c;在日常使用中&#xff0c;我们经常会遇到需要同时为多个设备充电的情况。这时&#xff0c;Type-C一分二快充线就显得尤为重要。为了更好地满足用户的充…...

利用python脚本,根据词条爬取百度图片(爬虫)

把广角&#xff0c;换成你的关键词就行 # -*- coding: utf-8 -*- """ Created on Wed Mar 29 10:17:50 2023 author: MatpyMaster """ import requests import os import redef get_images_from_baidu(keyword, page_num, save_dir):header {Us…...

java复原IP 地址(力扣Leetcode93)

复原IP 地址 力扣原题链接 问题描述 有效 IP 地址正好由四个整数&#xff08;每个整数位于 0 到 255 之间组成&#xff0c;且不能含有前导 0&#xff09;&#xff0c;整数之间用 ‘.’ 分隔。 例如&#xff1a;“0.1.2.201” 和 “192.168.1.1” 是有效 IP 地址&#xff0c…...

k8s的创建资源的流程图

背景 在k8s中创建资源需要经过几个流程的协作&#xff0c;包括认证模块&#xff0c;授权模块和资源管理模块的共同处理的结果 k8s的创建资源的流程图 第一步认证模块&#xff1a; k8s需要确保操作的客户端是合法的用户&#xff0c;并且不是仿冒的&#xff0c;也就是判断这个u…...

Android RecyclerView 滑动后选中的条目居中显示

话不多说先看效果: 实录效果视频如下 滚动居中 RecyclerView 在原有的RecyclerView 基础上操作&#xff0c;其他步骤不变&#xff0c;只是替换一下 manager 步骤 导入依赖 maven { url https://www.jitpack.io }//无限滚动implementation com.github.ZhaoChanghu:GalleryLayou…...

RPA-财务对账邮件应用自动化(客户对账机器人)

《财务对账邮件应用自动化》&#xff0c;将会使用邮箱的SMTP服务&#xff0c;小北把资源包绑定在这篇博客了 Uibot (RPA设计软件)———机器人的小项目友友们可以参考小北的课前材料五博客~ (本博客中会有部分课程ppt截屏,如有侵权请及请及时与小北我取得联系~&#xff09; …...

Delphi模式编程

文章目录 Delphi模式编程涉及以下几个关键方面&#xff1a;**设计模式的应用****Delphi特性的利用****实际开发中的实践** Delphi模式编程的实例 Delphi模式编程是指在使用Delphi这一集成开发环境&#xff08;IDE&#xff09;和Object Pascal语言进行软件开发时&#xff0c;采用…...

flutter 自定义弹窗封装弹窗----在弹窗内实现部分窗体生命周期

小部件组件 可以在里面加装其他事件如HTTP接口访问 import package:flutter/material.dart;///执行弹窗动画封装 class ExecutionDialog extends StatefulWidget {// final String? title;// final String? message;// final Function? onExecute;//// const ExecutionDial…...

go语言 私用仓库包下载

设置私有仓库&#xff0c;这样访问的时候&#xff0c;url前缀就不加proxy和sumdb go env -w GOPRIVATE"code.xxx.cn" go env -w GONOPROXY"code.xxx.cn" go env -w GONOSUMDB"code.xxx.cn" 设置取消安全认证 go env -w GOINSECURE"code…...

Math类

java.lang.Math 提供了一系列静态方法用于科学计算&#xff0c;常用方法如下&#xff1a; abs 绝对值 acos&#xff0c;asin&#xff0c;atan&#xff0c;cos&#xff0c;sin&#xff0c;tan 三角函数 sqrt 平方根 pow(double a,double b) a的b次幂 max(double a,double b) 取大…...

Git 入门教程

Git 入门教程 一、Git 是什么&#xff1f; Git 是一个开源的分布式版本控制系统&#xff0c;用于追踪代码的改动。它可以帮助开发者协同工作&#xff0c;管理项目中的代码版本。 二、安装 Git 在开始使用 Git 之前&#xff0c;你需要在你的计算机上安装 Git。你可以从 Git …...

Linux网络配置(超详细)

Linux网络配置大全 Linux网络配置一.网络地址配置网络地址查看–ifconfig使用网络配置命令设置网络接口参数-ifconfig禁用(临时)或者重新激活网卡设置虚拟网络接口 修改网络配置文件网络接口配置文件 IP命令详解OPTIONS选项OBJECT对象 ip link 二、获取和修改主机名hostname查看…...

[自研开源] 数据集成之分批传输 v0.7

开源地址&#xff1a;gitee | github 详细介绍&#xff1a;MyData 基于 Web API 的数据集成平台 部署文档&#xff1a;用 Docker 部署 MyData 使用手册&#xff1a;MyData 使用手册 试用体验&#xff1a;https://demo.mydata.work 交流Q群&#xff1a;430089673 介绍 本篇基于…...

用 AI 编程-释放ChatGPT的力量

最近读了本书&#xff0c;是 Sean A Williams 写的&#xff0c;感觉上还是相当不错的。一本薄薄的英文书&#xff0c;还真是写的相当好。如果你想看&#xff0c;还找不到&#xff0c;可以考虑私信我吧。 ChatGPT for Coders Unlock the Power of AI with ChatGPT: A Comprehens…...

【快速解决】解决谷歌自动更新的问题,禁止谷歌自动更新,如何防止chrome自动升级 chrome浏览器禁止自动升级设置方法

目录 问题描述 解决方法 1、搜索栏搜索控制面板 2、搜索&#xff1a;服务 ​编辑 3、点击Windows工具 4、点击服务 ​5、禁止谷歌更新 问题描述 由于我现在需要装一个谷歌的驱动系统&#xff0c;但是目前的谷歌驱动系统的版本都太旧了&#xff0c;谷歌自身的版本又太新了…...

Vim 调用外部命令学习笔记

Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...

国防科技大学计算机基础课程笔记02信息编码

1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制&#xff0c;因此这个了16进制的数据既可以翻译成为这个机器码&#xff0c;也可以翻译成为这个国标码&#xff0c;所以这个时候很容易会出现这个歧义的情况&#xff1b; 因此&#xff0c;我们的这个国…...

突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合

强化学习&#xff08;Reinforcement Learning, RL&#xff09;是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程&#xff0c;然后使用强化学习的Actor-Critic机制&#xff08;中文译作“知行互动”机制&#xff09;&#xff0c;逐步迭代求解…...

系统设计 --- MongoDB亿级数据查询优化策略

系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log&#xff0c;共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题&#xff0c;不能使用ELK只能使用…...

MVC 数据库

MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...

C++ 基础特性深度解析

目录 引言 一、命名空间&#xff08;namespace&#xff09; C 中的命名空间​ 与 C 语言的对比​ 二、缺省参数​ C 中的缺省参数​ 与 C 语言的对比​ 三、引用&#xff08;reference&#xff09;​ C 中的引用​ 与 C 语言的对比​ 四、inline&#xff08;内联函数…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用

1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...

什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南

文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/55aefaea8a9f477e86d065227851fe3d.pn…...

DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”

目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...

今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存

文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...