当前位置: 首页 > 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;谷歌自身的版本又太新了…...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现

目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...

基于Java+MySQL实现(GUI)客户管理系统

客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息&#xff0c;对客户进行统一管理&#xff0c;可以把所有客户信息录入系统&#xff0c;进行维护和统计功能。可通过文件的方式保存相关录入数据&#xff0c;对…...

[免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的微信小程序问卷调查系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】&#xff0c;分享下哈。 项目视频演示 【免费】微信小程序问卷调查系统(SpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项…...

CSS | transition 和 transform的用处和区别

省流总结&#xff1a; transform用于变换/变形&#xff0c;transition是动画控制器 transform 用来对元素进行变形&#xff0c;常见的操作如下&#xff0c;它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...

认识CMake并使用CMake构建自己的第一个项目

1.CMake的作用和优势 跨平台支持&#xff1a;CMake支持多种操作系统和编译器&#xff0c;使用同一份构建配置可以在不同的环境中使用 简化配置&#xff1a;通过CMakeLists.txt文件&#xff0c;用户可以定义项目结构、依赖项、编译选项等&#xff0c;无需手动编写复杂的构建脚本…...

智能职业发展系统:AI驱动的职业规划平台技术解析

智能职业发展系统&#xff1a;AI驱动的职业规划平台技术解析 引言&#xff1a;数字时代的职业革命 在当今瞬息万变的就业市场中&#xff0c;传统的职业规划方法已无法满足个人和企业的需求。据统计&#xff0c;全球每年有超过2亿人面临职业转型困境&#xff0c;而企业也因此遭…...

【若依】框架项目部署笔记

参考【SpringBoot】【Vue】项目部署_no main manifest attribute, in springboot-0.0.1-sn-CSDN博客 多一个redis安装 准备工作&#xff1a; 压缩包下载&#xff1a;http://download.redis.io/releases 1. 上传压缩包&#xff0c;并进入压缩包所在目录&#xff0c;解压到目标…...

__VUE_PROD_HYDRATION_MISMATCH_DETAILS__ is not explicitly defined.

这个警告表明您在使用Vue的esm-bundler构建版本时&#xff0c;未明确定义编译时特性标志。以下是详细解释和解决方案&#xff1a; ‌问题原因‌&#xff1a; 该标志是Vue 3.4引入的编译时特性标志&#xff0c;用于控制生产环境下SSR水合不匹配错误的详细报告1使用esm-bundler…...

职坐标物联网全栈开发全流程解析

物联网全栈开发涵盖从物理设备到上层应用的完整技术链路&#xff0c;其核心流程可归纳为四大模块&#xff1a;感知层数据采集、网络层协议交互、平台层资源管理及应用层功能实现。每个模块的技术选型与实现方式直接影响系统性能与扩展性&#xff0c;例如传感器选型需平衡精度与…...

【系统架构设计师-2025上半年真题】综合知识-参考答案及部分详解(回忆版)

更多内容请见: 备考系统架构设计师-专栏介绍和目录 文章目录 【第1题】【第2题】【第3题】【第4题】【第5题】【第6题】【第7题】【第8题】【第9题】【第10题】【第11题】【第12题】【第13题】【第14题】【第15题】【第16题】【第17题】【第18题】【第19题】【第20~21题】【第…...