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

zookeeper--一致性协议 ZAB

一、简介

ZAB 协议全称:Zookeeper Atomic Broadcast(Zookeeper 原子广播协议)。 是一个为分布式应用提供高效且可靠的分布式协调服务。在解决分布式一致性方面,Zookeeper 并没有使用 Paxos ,而是采用了 ZAB 协议。

ZAB 协议定义:ZAB 协议是为分布式协调服务 Zookeeper 专门设计的一种支持 崩溃恢复 和 原子广播 协议。基于该协议,Zookeeper 实现了一种 主备模式 的系统架构来保持集群中各个副本之间 数据一致性。具体如下图所示:

二、ZAB协议内容

1.消息广播

ZAB 协议的消息广播过程使用的是一个原子广播协议,类似一个 2PC提交过程。

(1)对于客户端发送的写请求,全部由 Leader 接收

(2)Leader 将请求封装成一个事务 Proposal,将其发送给所有 Follwer

(3)然后,根据所有 Follwer 的反馈,如果超过半数成功响应,则执行 commit 操作(先提交自己,再发送 commit 给所有 Follwer)

其他问题:

(1)顺序性的保证:leader 在收到客户端请求之后,会将这个请求封装成一个事务,并给这个事务分配一个全局递增的唯一 ID,称为事务ID(ZXID),ZAB协议需要保证事务的顺序,因此必须将每一个事务按照 ZXID 进行先后排序然后处理。

(2)在 Leader 和 Follwer 之间还有一个消息队列,用来解耦他们之间的耦合,解除同步阻塞。Leader 服务器会为每一个 Follower 服务器都各自分配一个单独的队列,然后将需要广播的事务 Proposal 依次放入这些队列中去,并且根据 FIFO策略进行消息发送。每一个 Follower 服务器在接收到这个事务 Proposal之后,都会首先将其以事务日志的形式写入到本地磁盘中去,并且在成功写入后反馈给 Leader 服务器一个 Ack 响应。当 Leader 服务器接收到超过半数 Follower 的 Ack 响应后,就会广播一个 Commit 消息给所有的 Follower 服务器以通知其进行事务提交,同时 Leader 自身也会完成对事务的提交,而每一个 Follower 服务器在接收到 Commit 消息后,也会完成对事务的提交。

(3)zookeeper集群中为保证任何所有进程能够有序的顺序执行,只能是 Leader 服务器接受写请求,即使是 Follower 服务器接受到客户端的请求,也会转发到 Leader 服务器进行处理。

2.崩溃恢复

消息广播过程中,如果Leader 崩溃怎么办?还能保证数据一致吗?如果 Leader 先本地提交了,然后 commit 请求没有发送出去,怎么办?所以zookeeper引入了崩溃恢复模式,一旦 Leader 服务器出现崩溃,或者说由于网络原因导致 Leader 服务器失去了与过半 Follower 的联系,那么就会进入崩溃恢复模式

ZAB 定义了 2 个原则:

 

1、ZAB 协议确保那些已经在 Leader 提交的事务最终会被所有服务器提交。

2、ZAB 协议确保丢弃那些只在 Leader 提出/复制,但没有提交的事务。

3.选举方式

当leader进入了崩溃恢复模式时,需要选出一个新的leader

所以,ZAB 设计了下面这样一个选举算法:能够确保提交已经被 Leader 提交的事务,同时丢弃已经被跳过的事务。

针对这个要求,如果让 Leader 选举算法能够保证新选举出来的 Leader 服务器拥有集群总所有机器编号(即 ZXID 最大)的事务,那么就能够保证这个新选举出来的 Leader 一定具有所有已经提交的提案。因为在收到客户端请求之后会生成一个自增的ZXID 

4.数据同步

完成 Leader 选举之后,在正式开始工作(即接收客户端的事务请求,然后提出新的提案)之前,Leader 服务器会首先确认事务日志中的所有 Proposal 是否都已经被集群中过半的机器提交了,即是否完成数据同步。下面我们就来看看 ZAB 协议的数据同步过程。

所有正常运行的服务器,要么成为 Leader,要么成为 Follower 并和 Leader 保持同步。 Leader服务器需要确保所有的 Follower 服务器能够接收到每一条事务提案,并且能够正确地将所有已经提交了的事务提案应用到内存数据库中去。具体的,Leader 服务器会为每一个 Follower 服务器都准备一个队列,并将那些没有被各 Follower 服务器同步的事务以提案消息的形式逐个发送给 Follower 服务器,并在每一个 Proposal 消息后面紧接着再发送一个 Commit 消息,以表示该事务已经被提交。等到 Follower 服务器将所有其尚未同步的事务提案都从 Leader 服务器上同步过来并成功应用到本地数据库中后,Leader 服务器就会将该 Follower 服务器加入到真正的可用 Follower 列表中,并开始之后的其他流程

基于这样的策略:当 Follower 链接上 Leader 之后,Follower 服务器会根据自己服务器上最后被提交的 ZXID 和 Leader 上的 ZXID 进行比对,比对结果要么回滚,要么和 Leader 同步。

 

三、总结

ZAB 让整个 Zookeeper 集群在两个模式之间转换,消息广播和崩溃恢复,消息广播可以说是一个简化版本的 2PC,通过崩溃恢复解决了 2PC 的单点问题,通过队列解决了 2PC 的同步阻塞问题。并采取过半即成功的机制保证服务可用

而支持崩溃恢复后数据准确性的就是数据同步了,数据同步基于事务的 ZXID 的唯一性来保证。通过 + 1 操作可以辨别事务的先后顺序。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.exyb.cn/news/show-2969.html

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

Android面试回忆录:帮助程序员提高核心竞争力的30条建议,真香!

**新技术层出不穷,去年kotlin到如今Flutter,技术迭代,你是否会变得固步自封?**那么看本篇文章帮你解决问题,让你知道怎么样学习,学习那些技术点才能不被时代的迭代快速淘汰! 首先,先…...

2021-05-30解决centos+宝塔面板,FTP传输421 Too many connections问题错误

解决centos宝塔面板,FTP传输421 Too many connections”问题错误 1、首先连入服务器 在/www/server/pure-ftpd/etc下,找到pure-ftpd.conf 2、vim pure-ftpd.conf 没有vim的,用其他编辑软件也可以 3、找到 #Maximum number of sim clients wit…...

RK3399 DDR频率修改

RK3399 DDR频率修改 一、DDR当前频率获取与可调节范围 1、获取当前DDR频率、可调值、容量 cat /sys/class/devfreq/dmc/cur_freq2、查看DDR频率可调节的值 cat /sys/class/devfreq/dmc/available_frequencies3、获取DDR容量 cat /proc/meminfo二、DDR测试定频 1、因为RK3…...

javascript正则表达式常用合集

javascript正则表达式常用的合集 参考网址 {n}: n 是一个正整数,匹配了前面一个字符刚好出现了 n 次 {n,}: n是一个正整数,匹配前一个字符至少出现了n次 {n,m}: n 和 m 都是整数。匹配前面的字符至少n次,最多m次。如果 n 或者 m 的值是0&…...

qApp加载qss技巧

使用Qt加载qss样式,一般操作是读取文件,通过setStyleSheet设置 但是qApp只需如下: qApp->setStyleSheet("file:///:/test.qss");//只适用于qApp...

发现一款好用到爆的数据库工具 - DataGrip(就是耗内存)

作者:Atzuge cnblogs.com/zuge/p/7397255.html 最近看到一款数据库客户端工具,DataGrip,是大名鼎鼎的JetBrains公司出品的,就是那个出品Intellij IDEA的公司。 - 就是耗内存 DataGrip是一款数据库管理客户端工具,方便…...

Java 类加载器(ClassLoader)的实际使用场景有哪些?

什么是classloader classloader顾名思义,即是类加载。虚拟机把描述类的数据从class字节码文件加载到内存,并对数据进行检验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制。了解java的类加…...

Bad owner or permissions on C:\\Users\\USER/.ssh/config on Windows

Bad owner or permissions on C:\Users\USER/.ssh/config 问题描述 由于使用vscode远程连接服务器突然新增了C:\Users\USER/.ssh/config ,再powershell/cmd下面使用openssh(windows自带)连接服务器会出现Bad owner or permissions on C:\\U…...

React方向的前端面试题

1、React的生命周期? React中只有类组件有生命周期可言。 其中包含三个状态: Mounting:此时已经插入了真实的DOM; Updating:正在被重新渲染; Unmounting:已经移出真实的DOM。 生命周期的方…...

理解“same-site“ 和 “same-origin“

Understanding "same-site" and "same-origin" 作者:Eiji Kitamura 译者:weixsun 原文:Understanding "same-site" and "same-origin" "same-site" and "same-origin" are …...

ERC20智能合约安全评估

ERC20智能合约评估 常见漏洞: https://github.com/slowmist/Knowledge-Base/blob/master/solidity-security-comprehensive-list-of-known-attack-vectors-and-common-anti-patterns-chinese.md ERC20标准接口 //代币名字 function name() constant returns (string name) /…...

自己动手开发了一个 SpringMVC 框架,用起来太香了

一、介绍 在日常的 web 开发中,熟悉 java 的同学一定知道,Spring MVC 可以说是目前最流行的框架,之所以如此的流行,原因很简单:编程简洁、上手简单! 我记得刚开始入行的时候,最先接触到的是Stru…...

一个由java.util.ConcurrentModificationException引起的血案

线上跑的一个flink任务突然报了异常,话不多,先把异常发出来 最近在做一个flink项目时遇到了一个线上报错,话不多说,先上代码,其中用到的第三方封装的flink sdk隐去了包前缀,不会影响分析。 Caused by: ja…...

程序员,请你不要在坑程序员了

大家好,hellohello-tom又来分享实战经验了。🤣 在一个风和日丽的下午,tom哥正在工位上打着瞌睡,突然QQ群运维同学全部开发人员说线上绿线环境大面积开始瘫痪,zuul网关大量接口返回service unavailable,并且…...

jvm 脑图笔记

...

Machine Learning —— Semi-supervised Learning

Machine Learning —— Semi-supervised Learning Introduction Supervised Learning:(xr,y^r)r1R(x^r,\hat{y}^r)^R_{r1}(xr,y^​r)r1R​ training data中,每一组data都有input 和对应的output Semi-supervised Learning:(xr,y^r)r1R(xu…...

2021中级Android开发面试解答,附赠课程+题库

Gradle是什么? Gradle是一种构建语言,目前是Android的默认构建工具,我们编写的编译脚本,其实就是玩Gradle的API,所以从它更底层的意义上看,是一个编程框架。 因为涉及的内容很多没法一两篇文章就介绍详细…...

Layui的tree使用

前言:文档中有详细参数说明 :https://www.layui.com/doc/modules/tree.html 导入js和css文件,假如文件路径为404,查看文件是否路径上的错误,或者是否加上项目的根路径,例如:“${pageContext.re…...

《白帽子讲web安全》第6章 HTML 5安全

HTML5&#xff1a;是W3C制定的新一代HTML语言的标准&#xff0c;定义了很多新标签、新事件。 一、HTML 5新标签 ①<video>、<audio>等标签&#xff0c;需要加入XSS filter的黑名单中。 ②iframe的新属性sandbox&#xff1a;<iframe>加载的内容会被视为一个…...

安装docker-compose

docker安装 Docker 支持 64 位版本 CentOS 7/8&#xff0c;并且要求内核版本不低于 3.10。 CentOS 7 满足最低内核的要求 sudo yum install -y yum-utils sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo sudo sed -i s…...

JDK8新特性里提供了3个时间类:LocalDate、LocalTime、LocalDateTime

参考资料&#xff1a;好好学Java https://mp.weixin.qq.com/s/Dd_7yUh3lq3TqE2cjsYXvw JDK8新特性里提供了3个时间类&#xff1a;LocalDate、LocalTime、LocalDateTime 在项目开发中&#xff0c;已经需要对Date类型进行格式&#xff0c;否则可读性很差&#xff0c;格式化Date…...

this、call、apply、bind

this的指向 作为普通函数&#xff08;也指对象的方法&#xff09;进行使用&#xff0c;谁去调用该函数&#xff0c;那么this便会指向谁。作为构造函数使用&#xff0c;指向该构造函数的实例。在箭头函数内部的使用&#xff0c;指向上一级函数的this&#xff1b;若上一级不是函…...

5.Random

用于生产一个随机数 步骤&#xff1a; 1.导包 import java.util.Random; 2.创建对象 Random random new Random();3.获取随机数 int number random.nextInt(10); //随机数的取值范围是[0,10),即大于等于&#xff0c;小于10 上面不能获取到10&#xff0c;若要获取到10&…...

hexo添加自动更新的站点统计页面

本站原来的站点统计图页面的统计数据需要博主我每个月手动统计上传非常的麻烦容易把人累死直到我看到了fox的统计页面又是我眼前一亮于是又去借鉴学习了一波&#xff0c;注本文大部分代码都出自fox大佬之手。另外如果你也想要利用GitHubactions定时自动更新请参考前文完成集成化…...

Java枚举类与注解——一篇文章读懂枚举类与注解

文章目录一、枚举类① 自定义枚举类② enum关键字定义枚举类③ enum 枚举类的方法④ enum 枚举类实现接口二、注解① 生成文档相关注解②注解在编译时进行格式检查③注解跟踪代码的依赖性&#xff0c;实现替代配置文件功能④ 自定义注解⑤ jdk提供的4种元注解⑥ JKD8 新特性&am…...

Linux部署PHP扩展kafuka

1、安装librdkafka cd /usr/local/src/ git clone https://github.com/edenhill/librdkafka.git cd librdkafka ./configure make make install ln -s /usr/local/lib/librdkafka.so.1 /usr/lib/2、安装php-rdkafka cd /usr/local/src/ git clone https://github.com/arnaud-…...

自然语言处理NLP之文本摘要、机器翻译、OCR、信息检索、信息抽取、校对纠错

自然语言处理NLP之文本摘要、机器翻译、OCR、信息检索、信息抽取、校对纠错 目录...

Kafka监控与调优-文末思维导图

监控 主流监控方式 JMXTrans InfluxDB Grafana 主机监控 机器负载&#xff1a;当前CPU工作量的度量&#xff0c;被定义为特定时间间隔内运行队列中的平均线程数&#xff0c;理论上接近0.7*cpu核数比较 CPU使用率 (1 - 空闲态运行时间/总运行时间) * 100%&#xff0c;建议…...

孤独一箭语录摘选

前言&#xff1a; 其实最近2个月一直在使用“乔帮主”的低吸大法&#xff0c;效果非常好&#xff0c;从他的 鱼和鸟类的比喻中&#xff0c;我意识到其中的奥秘&#xff0c;自己在什么时候是鱼类&#xff1b; 然后去第N次拜读了他的启蒙老师&#xff0c;“孤独一箭”的一些东西…...

认识python

认识python 一、什么是python Python是一种面向对象的解释型计算机程序设计语言,由 吉多范罗苏姆 开发&#xff0c;第一个公开发行版版发布于 1991 年。它常被昵称为胶水语言&#xff0c;能够把其他语言制作的各种模块&#xff08;尤其是C/C&#xff09;很轻松地联结在一起。…...

[附源码]Python计算机毕业设计Django的黄河文化科普网站

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…...

删除本地IP地址

本地IP地址删除&#xff1a; win r 打开运行&#xff0c;输入&#xff1a;regedit 打开注册表&#xff1b; 找到目录&#xff1a;HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces &#xff0c;此文件下就是电脑的IP地址&#xff0c;删除…...

c# 获取本地主机的ip地址

c# 获取本地主机的ip地址 public string GetLocalIp(){///获取本地的IP地址string AddressIP string.Empty;foreach (IPAddress _IPAddress in Dns.GetHostEntry(Dns.GetHostName()).AddressList){if (_IPAddress.AddressFamily.ToString() "InterNetwork"){Addres…...

charles 本地IP地址

本文参考&#xff1a;charles 本地IP地址 手机进行抓包时候&#xff0c;再wifi里面需要这是这个&#xff1b; 比如我的IP是&#xff1a;192.168.0.103,那么手机如果抓包&#xff0c;就要再代理设置成这个IP&#xff1b; 端口查看参见&#xff1a;charles 代理设置 默认是:88…...

centos7 shell 获取ip_Linux Shell脚本中获取本机ip地址方法

方法一&#xff1a;ifconfig -aifconfig -a|grep inet|grep -v 127.0.0.1|grep -v inet6|awk {print $2}|tr -d "addr:"命令解析ifconfig -a      和window下执行此命令一样道理&#xff0c;返回本机所有ip信息grep inet   截取包含ip的行grep…...

物联网企业争抢「两轮车换电」赛道

两轮电动车正在攻占中国的大街小巷。 甚至无需过多的数据佐证&#xff0c;大家都可以清晰的感受到&#xff0c;“小电驴”正在加速“驰骋”。售价在千余元至万元不等的两轮电动车不仅是居民解决中距离通勤的“好帮手”&#xff0c;更是外卖员、快递员风里来雨里去的“好战友”。…...

来电归属地 黑名单‘s

陏着类似&#xff02;来电归属地&#xff02;这样的App越来越多,由于是采用企业开发账号&#xff0c;那么当账号过期之后它们的程序将不能再启动了&#xff0c;它们只有一年的使用时间. 对于这样的壳应用在app store上&#xff0c;对用户的利益是无法保障的&#xff0c;应该被禁…...

IOS 完成来电归属地

首先是一个库&#xff1a;&#xff08;有时间在上传&#xff09; 然后设置一个工具类 .h 1 interface HMFoundLocation : NSObject2 3 AS_SINGLETON(HMFoundLocation)4 5 property(nonatomic,strong)NSString *address;6 7 property(nonatomic,strong)NSString *operater;8 9 /…...

Springboot 服务 禁止设置启动server端口使用

场景&#xff1a; 不管什么原因&#xff0c;A项目服务就是引用了jar spring-boot-starter-web&#xff1a; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId> </dependency&g…...

来电归属地java_来电归属地数据查询Java实现

项目需要实现来电归属地查询&#xff0c;所以就找到了下面这个文章原理主要在(一)和(二)中&#xff0c;作者的数据压缩思路很给力&#xff0c;将6M的原始文本数据压缩到400kb左右&#xff0c;原作者已经将分析讲的很清楚了&#xff0c;这里提炼一下要点&#xff0c;并将c实现转…...

Android设置来电号码归属地

FAQ Content [DESCRIPTION]如何关闭MTK内置来电号码归属地&#xff1f;[SOLUTION]MTK平台号码归属地分为两种&#xff1a;1.手机号码归属地&#xff1b;2.固话号码归属地&#xff1b;手机号码归属地&#xff1a;是MTK自己做的&#xff0c;关闭只需要关闭MTK_PHONE_NUMBER_GEODE…...

手机安全卫士------显示来电归属地的操作

思路&#xff1a; 1.由于我们不确定什么时候会有来电&#xff0c;所以&#xff0c;我们应该使用服务监听来电。 2.服务关闭的时候要取消监听 3.通过服务的开启和关闭控制设置页面上CheckBox状态。 通过服务来监听来电信息 创建一个类&#xff0c;继承自Service在onCreate方…...

在线点餐微信小程序插件 小程序一键接入肯德基麦当劳星巴克在线点餐

聚推客联盟-在线点餐插件 一、插件介绍 该插件已支持肯德基、麦当劳、星巴克、必胜客、奈雪在线点餐、用户享受最低5折起点餐&#xff0c;接入方享受 10% 点餐返现&#xff0c;返现由聚推客联盟结算。 二、添加插件 首先点击该页面上方添加插件 三、引入代码 接入插件前&…...

MFC获取主机IP地址

CString GetHostAddress(void) { CString local_addr; WSADATA wsadata; if (0 ! WSAStartup(MAKEWORD(2, 2), &wsadata)) { //AfxMessageBox(“初始化网络环境失败!”); return NULL; } char szHostName[MAX_PATH 1]; gethostname(szHostName, MAX_PATH); hostent* p ge…...

简单的火车订票系统

c语言的期末作业 主要考查对指针链表数据结构的使用 模块化程序设计 上代码 #include<stdio.h> #include<stdlib.h> #include<string.h>typedef struct train {char num[10];//列车号 char city[10];//目的城市 char takeoffTime[10];//发车时间char re…...

计算机论文订票系统,计算机系毕业论文火车订票系统的设计与实现.doc

计算机系毕业论文火车订票系统的设计与实现火车订票系统的设计与实现摘 要随着科学技术的不断提高&#xff0c;计算机科学日渐成熟&#xff0c;其强大的功能已为人们深刻认识&#xff0c;它已进入人类社会的各个领域并发挥着越来越重要的作用。作为计算机应用的一部分使用计算机…...

C#WPF 项目开发(二)(火车订票系统)

C#WPF 项目开发&#xff08;二&#xff09;&#xff08;火车订票系统&#xff09; 一、Service&#xff08;服务层&#xff09;布局 1.服务端连接数据库 &#xff08;1&#xff09;、数据库连接字符串&#xff0c;Sqlserver数据库连接方式有多种&#xff0c;这里只介绍最常用的…...

springboot火车订票系统

毕设设计项目网站&#xff1a;http://www.houxinhong.top/ springboot火车订票系统 这是在软件测试课程里面跟同学一起开发的一个用来学习软件测试的小系统&#xff0c;麻雀虽小&#xff0c;但五脏俱全&#xff0c;提供给大家学习使用&#xff08;agiltest文件夹为项目源代码&a…...

java计算机毕业设计火车订票系统(附源码、数据库)

java计算机毕业设计火车订票系统&#xff08;附源码、数据库&#xff09; 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技…...

java实现火车订票系统(简单GUI界面)

package exercise; import java.awt.BorderLayout; import java.awt.Button; import java.awt.Color; import java.awt.Container; import java.awt.Font; import java.awt.GridLayout; import java.awt.Label; import java.awt.event.ActionEvent; import java.awt.event.Ac...