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

【Leetcode每日一题】模拟 - 替换所有的问号(难度⭐)(42)

1. 题目解析 题目链接&#xff1a;1576. 替换所有的问号 这个问题的理解其实相当简单&#xff0c;只需看一下示例&#xff0c;基本就能明白其含义了。 2.算法原理 遍历字符串&#xff1a;从左到右逐个处理字符。 处理问号字符&#xff1a;对于每个问号字符&#xff0c;我们需…...

再见 mysql_upgrade

在数据库管理的世界里&#xff0c;随着技术的不断进步和业务的不断发展&#xff0c;数据库的版本升级成为了一个不可避免的过程。 MySQL 作为业界领先的开源关系型数据库管理系统&#xff0c;其版本迭代与功能优化同样不容忽视。 而在这个过程中&#xff0c;升级工具就显得尤为…...

.NET Core教程:入门与实践实例

.NET Core教程&#xff1a;入门与实践实例 在信息技术飞速发展的今天&#xff0c;掌握一门高效的编程技术成为了每个开发者不可或缺的技能。在众多编程框架中&#xff0c;.NET Core以其跨平台、高性能和易扩展的特性&#xff0c;受到了广大开发者的青睐。本文将通过实例&#…...

docker环境配置过程中的常见问题

1、pull镜像问题 docker pull jenkins/jenkins:lts Using default tag: latest Trying to pull repository docker.io/library/centos ... Get https://registry-1.docker.io/v2/library/centos/manifests/latest: Get https://auth.docker.io/token?scoperepository%3Alibr…...

精选2024年最佳项目管理系统!实用推荐与详细评测

随着企业规模的扩大&#xff0c;项目量也会呈几何倍的增长&#xff0c;项目管理系统就成了企业管理必不可少的一部分。2024年优秀的项目管理系统推荐。今年为大家带来Microsoft Project、Zoho Projects、Jira以及Wrike项目管理系统评测。 什么是项目管理系统&#xff1f; 项目…...

民航电子数据库:CAEMigrator迁移数据库时总是卡死

目录 一、场景二、异常情况三、排查四、应急方案 一、场景 1、对接民航电子数据库 2、将mysql数据库迁移到cae数据库 3、使用CAEMigrator迁移工具进行数据库迁移时&#xff0c;该工具会卡死&#xff08;不清楚是否是部署cae服务的服务器资源导致&#xff09; 二、异常情况 …...

数据结构 第6章 图(一轮习题总结)

数据结构 第6章 图 6.1 图的基本概念6.2 图的存储及基本操作6.3 图的遍历6.4 图的应用 6.1 图的基本概念&#xff08;2 4 11&#xff09; 6.2 图的存储及基本操作&#xff08;1 12 13 15 16&#xff09; 6.3 图的遍历&#xff08;2 3 5 16&#xff09; 6.4 图的应用 6.1 图的基…...

如何在智能交通系统中使用物联网技术提高道路安全和效率

在智能交通系统中&#xff0c;物联网&#xff08;IoT&#xff09;技术可以通过多种方式提高道路安全和效率。以下是利用物联网技术提高智能交通系统效能的具体方法&#xff1a; 1. 车与路、车与车通信&#xff08;V2X&#xff09;&#xff1a;通过在道路上部署传感器和路侧单元…...

七大 QC 工具图的定义与示例(看这篇就够了)

前言 七大 QC 工具图是通过数值的方式进行数据分析的工具&#xff0c;分别是鱼骨图、直方图、柏拉图、散布图、管制图、检查图和层别图。其实&#xff0c;我们在日常生活与工作中经常看到它们&#xff0c;只是样子和名字对不上而已&#xff0c;今天写这篇文章就是为了帮助自己…...

【JavaScript算法】DOM树层级显示

题目描述&#xff1a; 上述表达式的输出结果为 [DIV] [P, SPAN, P, SPAN] [SPAN, SPAN]直接上代码 let tree document.querySelector(".a"); function traverseElRoot(elRoot) {const result [];function traverse(element, level) {if (!result[level]) {resul…...