Zookeeper学习2:原理、常用脚本、选举机制、监听器

文章目录

    • 原理
      • 选举机制(重点)
        • 情况1:正常启动集群
        • 情况2:集群启动完,中途有机器挂了
      • 监听器
      • 客户端向服务端写入数据
        • 客户端向服务端Leader节点写入
        • 客户端向服务端Follower节点写入
      • Paxos算法(每个节点都可以提议者)
      • ZAB协议算法 - Paxos算法的改良 - 集群仅能一位提议者(即Leader)
        • 认识
        • 崩溃恢复
          • Leader挂,重新选举
          • 数据恢复
      • CAP理伦
    • 脚本
      • 集群统一启动、关闭、状态查看脚本
    • 源码分析(粗略)
      • 辅助源码
        • 持久化
        • 序列化
      • 服务端启动流程
      • 服务端选举Leader流程
      • Leader、Follower数据同步流程
      • 服务端Leader启动Zk过程
      • 服务端Follower启动Zk过程
      • 客户端连接Zk服务端过程

原理

选举机制(重点)

情况1:正常启动集群

集群正常总固定票数: conf/zoo.cfg里面的server.的配置行数

特点:

  1. 一旦选举出领导leader,除非作为leader的zookeeper挂了,否则不会在重新选举,其他新进的zookeeper集群都作为追随者Following
  2. 存活的zookeeper机器必须【集群正常总固定票数】的一半以上才会进行选举leader角色,否则一直是Looking
  3. zookeeper可以给自己投票,一旦每个人的票数都一样,交换myid查看后,谁大就把投自己的票改投成myid最大的那个

在这里插入图片描述

集群中5台zookeeper机器依次启动后选举领导的整个过程
在这里插入图片描述

情况2:集群启动完,中途有机器挂了
触发选举条件【满足其一】
1. 有新zookeeper服务器启动加入
2. 中途在集群中的有zookeeper机器断联
选举过程情景
1. 集群中的Leader没挂,维持现状,依然是Leader机器为Leader
2. 集群中的Leader挂了,Leader选举规则:谁任期Epoch大选谁、任期一致,谁事务ID修改次数大就选谁、事务ID也一致,谁身份证号大就选谁

监听器

流程: zookeeper客户端告知服务端需要监听某某节点的数据变化,服务端一旦节点发生变化,就将变化通知内容推送给客户端


在这里插入图片描述

1. 首先要有一个main线程
2. 在main线程中创建Zookeeper客户端,这时就会创建两个线 程,一个负责网络连接通信(connet)),一个负责监听(listener)
3. 通过connectz线程将注册的监听事件发送给Zookeeper服务端
4. 在Zookeeper的注册监听器列表中将注册的监听事件添加到列表中
5. Zookeeper服务端监听到有数据或路径变化,就会将这个消息发送给Zookeeper客户端的listener线程
6. listener线程内部调用了process0方法,处理后续业务逻辑
常见的监听事件
1. 监听数据的变化 == get 节点 -w
2. 监听子节点增删的变化 == ls 节点 -w

监听数据的变化
在这里插入图片描述

监听子节点增删的变化
在这里插入图片描述

客户端向服务端写入数据

客户端向服务端Leader节点写入

流程: Leader会传递给Follower去写入,如果 超半数的zookeeper都写入成功,则Leader服务端机器会告诉客户端数据写入成功 ,剩下Follower还未写入的Leader会慢慢通知他们写入,反正最终zookeeper服务端集群内所有机器都写入成功

在这里插入图片描述

客户端向服务端Follower节点写入

流程: Follower会先将 客户端的写入请求转给Leader,Leader自己将写入请求先执行,在将这个写入请求分发给集群内所有Follower机器 ,所有集群中超过半数的zookeeper都写入成功,则Leader会告知当初最开始那台Follower机器说明此次写入成功,然后由该台Follower告知客户端集群此次写入成功

在这里插入图片描述

Paxos算法(每个节点都可以提议者)

Paxos算法: 基于消息传递且具有高度容错特性的一致性算法。快速正确的在一个分布式系统保持数据值一致,保证无论发生任何异常都不会破坏系统的一致性

Propose(提议): 任务编号

Proposal(提案): 任务编号+任务内容

Paxos角色==Zookeeper系统中所有节点==节点可以拥有多角色
提议者(proposer)
接受者(acceptor)
学习者(learner)
Paxos主要阶段
准备阶段:提议者向接受者发送一个提议编号,接受者如果收到的提议编号比自己已经接受的提议编号大,接受该提议,并返回自己已经接受的提议编号和值
提议阶段:提议者收到了大多数接受者的接受,提议者向所有接受者发送一个提议,包括提议编号和值。
学习阶段:一旦某值被大多数接受者接受,学习者就可以学习到这个值并应用到系统中
接受者收到提案者空白提案请求时的原则
不在接受提案ID小于等于当前收到的
不在接受提案落档中提案ID小于当前的
不违背以前做出的承诺

在这里插入图片描述


Paxos算法完美情况
在这里插入图片描述


Paxos算法弊端
在这里插入图片描述

ZAB协议算法 - Paxos算法的改良 - 集群仅能一位提议者(即Leader)

认识

概念: 只有一台客户端(Leader)负责处理外部的写事务请求,然后Leader客户端将数据同步到其他Follower节点。即Zookeeper只有一个Leader可以发起提案

ZAB模式
消息广播
崩溃恢复
ZAB针对事务处理过程(两阶段)
广播事务阶段
广播事务提交操作
1. 客户端发起一个写操作请求
2. Leader服务器将客户端的请求转化为事务Proposal提案,同时为每个Proposal分配一个全局的ID,即zxid
3. Leader服务器为每个Follower服务器分配一个单独的队列,然后将需要广播的Proposal依次放到队列中去,并且根据FIFO策略进行消息发送
4. Follower接收到Proposal后,会首先将其以事务日志的方式写入本地磁盘中,写入成功后向Leader反馈一个Ack响应消息
5. Leader接收到超过半数以上Follower的Ack响应消息后,即认为消息发送成功,可以发送commit消息
6. Leaderl向所有Follower广播commit消息,同时自身也会完成事务提交。Follower接收到commit消息后,会将上一条事务提交

此图对应的是上图的流程图
在这里插入图片描述

崩溃恢复
Zab协议崩溃恢复同时满足的要求
1. 已经产生提交(Proposal)的提案(过半数都Ack),Follower必须执行
2. 未提交的提案直接丢弃 - 未proposal给follower的提案
Leader挂,重新选举
新Leader满足要求
1. 新Leader必须都是己经提交了Proposall的Follower服务器节点
2. 新选举的Leader节点中含有最大的zxid)这样做的好处是可以避免Leader服务器检查Proposal的提交和丢弃工作
数据恢复
数据恢复
新Leader选举
开始接收客户端请求前,首先确认事务日志的所有过半同意的提案已经commit
某个Follower同步完成Leader的提案后,才会将其加入到真正可用的Follower列表中

CAP理伦

分布式系统最多同时满足CAP其中的两项,不可能三项同时满足

Zookeeper:满足的是CP的两项要求

CAP
一致性(Consistency):集群之间的数据保持一致
可用性(Available):系统服务一直可用,且保证用户每个操作能在有限时间返回结果
分区容错性(Partition Tolerance):遇到网络分区故障,仍然能对外提供可用服务
为什么Zookeeper不满足A
极端情况下,服务端会丢弃一些客户端请求
进行Leader选举时,集群不可用

脚本

集群统一启动、关闭、状态查看脚本

zk.sh

#!/bin/bash
# 运行此脚本前必须把当前机器人的公私密钥给到目标运行机器 == 要不然每次运行此脚本时都会叫你输入每台目标机器的密码
# 命令1(本机生成RSA公私密钥):ssh-keygen -t rsa
# 命令2(将密钥传给目标三台机器即192.168.19.107、192.168.19.108、192.168.19.109 ):ssh-copy-id root@目标机器IP




for currentHostName in 192.168.19.107 192.168.19.108 192.168.19.109
do
	echo "=================zookeeper【${currentHostName}】【$1】==============================="
	case $1 in
	"start") {
	  ssh $currentHostName "cd /opt/module/zookeeper-3.9.1 && sh bin/zkServer.sh start"
	}
	;;


	"stop") {
	  ssh $currentHostName "cd /opt/module/zookeeper-3.9.1 && sh bin/zkServer.sh stop"
	}
	;;

	"status") {
	  ssh $currentHostName "cd /opt/module/zookeeper-3.9.1 && sh bin/zkServer.sh status"
	}
	;;

	*) {
	  echo "未知命令,仅支持start|stop|status"
	}

	esac


done

在这里插入图片描述

源码分析(粗略)

辅助源码

持久化

数据存储: 集群中的数据会在内存(树)、磁盘中各存一份

接口: 快照【org.apache.zookeeper.server.persistence.SnapShot】、事务记录【org.apache.zookeeper.server.persistence.TxnLog】

事务日志(txnlog): ZooKeeper会将所有的写操作以事务的形式记录在事务日志中,这些写操作包括创建节点、更新节点数据、删除节点等。事务日志是一个追加写的日志文件,用于记录每个写操作的详细信息。通过事务日志,ZooKeeper可以保证数据的一致性和持久性

快照(snapshot): ZooKeeper定期会生成一个快照文件,用于保存当前内存中所有节点的状态。快照文件包含了所有节点的数据和元数据信息。当ZooKeeper服务器启动时,会首先加载最新的快照文件,然后通过回放事务日志来恢复到最新的状态。

Zookeeper启动数据恢复流程: 先加载最新的快照文件,然后通过回放事务日志来将数据恢复到最新的状态

在这里插入图片描述

序列化

接口: 序列化、反序列化【org.apache.jute.Record】

在这里插入图片描述

服务端启动流程

入口类: org.apache.zookeeper.server.quorum.QuorumPeerMain#main

在这里插入图片描述

服务端选举Leader流程

在这里插入图片描述

Leader、Follower数据同步流程

概括: Follower必须去看Leader保持一致,而不是Leader跟Follower保持一致

【Follower】Learner: org.apache.zookeeper.server.quorum.Learner#registerWithLeader

【Leader】LearnerHandler: org.apache.zookeeper.server.quorum.LearnerHandler#run

差异化同步
回滚同步
提交同步
全量同步
同步方式
Diff:Leader、Follower都一样,无需任何操作
Trunc Follower:Follower的事务ID比Leader大,则Follower回滚成跟Leader一致
Commit:Leader的事务ID比Follower大,则Leader同步提案给Follower执行成一致
Follower没任何数据:则Leader以Snap方式同步执行恢复给Follower

在这里插入图片描述

服务端Leader启动Zk过程

核心: org.apache.zookeeper.server.quorum.Leader#startZkServer

在这里插入图片描述

服务端Follower启动Zk过程

核心: org.apache.zookeeper.server.quorum.Follower#followLeader

在这里插入图片描述

客户端连接Zk服务端过程

核心入口: org.apache.zookeeper.ZooKeeperMain#main

在这里插入图片描述


刚兴趣的同行可以进群沟通交流,内置机器人供大家愉快

在这里插入图片描述

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

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

相关文章

Dynamo幕墙探究系列(四)——Revolve

我们先放一张截图,不再是通过 loft 创建模型,而是通过旋转生成模型,效果如下,今天我们就来聊聊这个模型是怎么生成得。 “旋转”,顾名思义,和 Revit 中创建形状的旋转是一个意思,只是用来旋转的…

【MATLAB】 CEEMDAN信号分解+FFT傅里叶频谱变换组合算法

有意向获取代码,请转文末观看代码获取方式~ 展示出图效果 1 CEEMDAN信号分解算法 CEEMDAN 分解又叫自适应噪声完备集合经验模态分解,英文全称为 Complete Ensemble Empirical Mode Decomposition with Adaptive Noise。 CEEMDAN是对CEEMD的进一步改进…

MySQL 教程 2.4

MySQL UNION 操作符 本教程为大家介绍 MySQL UNION 操作符的语法和实例。 描述 MySQL UNION 操作符用于连接两个以上的 SELECT 语句的结果组合到一个结果集合,并去除重复的行。 UNION 操作符必须由两个或多个 SELECT 语句组成,每个 SELECT 语句的列数…

蓝桥杯倒计时 41天 - KMP 算法

KMP算法 KMP算法是一种字符串匹配算法,用于匹配模式串P在文本串S中出现的所有位置。 例如S“ababac,P“aba”,那么出现的所有位置是13。 在初学KMP时,我们只需要记住和学会使用模板即可,对其原理只需简单理解&#xff…

会员丨这些年开的会员

1、淘宝88VIP-88元/年 要说现在最实惠的会员,肯定是88vip莫属了。88元/年即可拥有: 优酷/芒果年卡; 饿了么年卡(每月4张吃货卡,但现在饿了么改的越来越不实惠了); 网易云音乐年费会员&#xf…

NACOS在Windows和Linux下的安装教程

目录 1、Windows安装 1.1、下载安装包 1.2、解压 1.3、端口配置 1.4、启动 1.5、访问 2、Linux安装 2.1、安装JDK 2.2、上传安装包 2.3、解压 2.4、端口配置 2.5、启动 3、Nacos的依赖 1、Windows安装 开发阶段采用单机安装即可。 1.1、下载安装包 在Nacos的Git…

【Python】进阶学习:pandas--query()用法详解

📚【Python】进阶学习:pandas–query()用法详解 🌈 个人主页:高斯小哥 🔥 高质量专栏:Matplotlib之旅:零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程👈 希…

open-spider开源爬虫工具:抖音数据采集

在当今信息爆炸的时代,网络爬虫作为一种自动化的数据收集工具,其重要性不言而喻。它能够帮助我们从互联网上高效地提取和处理数据,为数据分析、市场研究、内容监控等领域提供支持。抖音作为一个全球性的短视频平台,拥有海量的用户…

行业独角兽—Matic Network来临,成就百万富翁的项目!

Matic Network由印度Bangalore及日本超级节点打造 ,独创保险仓九仓共振循环模式。 Mtc于2023年初完成了700万美元的种子轮融资, Paradigm领投,a16z、Variant、Solana Ventures和Jump Crypto参投,旨在全方位布局Web3.0的去中心化生…

Java基础数据结构之栈

一.什么是栈 栈是一种特殊的线性表,它只允许在固定的一端进行元素的添加与使用,且遵循先进后出的原则。添加取用元素的一端称为栈顶,另一端称为栈底。出栈和入栈都是操作栈顶元素 二.栈的模拟实现 栈的底层是一个数组 这是里面的成员变量以…

element-ui的 Dialog 对话框背景图片

element-ui的 Dialog 对话框背景图片 效果如图&#xff1a; 代码&#xff1a; &#xff01;&#xff01;&#xff01;注&#xff1a;如果style里有scoped"scoped"会不生效&#xff0c;要单独写个<style></style> <style> .bgc {/* 弹窗样式 */.e…

7.1.1 selenium介绍及安装chromedriver

目录 1. Selenium的用途 2. 安装Selenium库 3. 安装chromedriver 1. 查看谷歌版本号​编辑 2. 找到最新版本及下载 3. 配置环境变量 4. 检测是否配置成功 5. 用python初始化浏览器对象检测&#xff1a; 6. 参考链接 1. Selenium的用途 在前面我们提到&#xff1a;在我…

简单实现Transformer的自注意力

简单实现Transformer的自注意力 关注{晓理紫|小李子}&#xff0c;获取技术推送信息&#xff0c;如感兴趣&#xff0c;请转发给有需要的同学&#xff0c;谢谢支持&#xff01;&#xff01; 如果你感觉对你有所帮助&#xff0c;请关注我。 源码获取&#xff1a;VX关注并回复chatg…

【Vue3】Props的使用详解

&#x1f497;&#x1f497;&#x1f497;欢迎来到我的博客&#xff0c;你将找到有关如何使用技术解决问题的文章&#xff0c;也会找到某个技术的学习路线。无论你是何种职业&#xff0c;我都希望我的博客对你有所帮助。最后不要忘记订阅我的博客以获取最新文章&#xff0c;也欢…

1. MAC 安装 goland 和 go

1. 安装goland 官网下载goland 安装破解goland 参考&#xff1a;安装pycharm下载压缩包->解压 -> 运行 sh jetbra/scripts/uninstall.sh -> 运行 sh jetbra/scripts/install.sh打开goland&#xff0c;help -> register -> 输入新的激活码 (从网盘获取到的) 有一…

YOLOv9独家改进|动态蛇形卷积Dynamic Snake Convolution与空间和通道重建卷积SCConv与RepNCSPELAN4融合

专栏介绍&#xff1a;YOLOv9改进系列 | 包含深度学习最新创新&#xff0c;主力高效涨点&#xff01;&#xff01;&#xff01; 一、改进点介绍 Dynamic Snake Convolution是一种针对细长微弱的局部结构特征与复杂多变的全局形态特征设计的卷积模块。 SCConv是一种即插即用的空间…

前端学习第七天-css常用样式设置

达标要求 掌握元素的显示与隐藏 熟练应用溢出的文字隐藏 熟练掌握版心和布局流程 1. 元素的显示与隐藏 在CSS中有三个显示和隐藏的单词比较常见&#xff0c;我们要区分开&#xff0c;他们分别是 display visibility 和 overflow。 他们的主要目的是让一个元素在页面中消失…

03、MongoDB -- MongoDB 权限的设计

目录 MongoDB 权限的设计演示前准备&#xff1a;启动 mongodb 服务器 和 客户端 &#xff1a;1、启动单机模式的 mongodb 服务器2、启动 mongodb 的客户端 MongoDB 权限的设计1、MongoDB 的每个数据库都可以保存用户&#xff0c;不止admin数据库可以保存用户。2、保存用户的数据…

人工智能指数报告2023

人工智能指数报告2023 主要要点第 1 章 研究与开发第 2 章 技术性能第 3 章 人工智能技术伦理第 4 章 经济第 5 章 教育第 6 章 政策与治理第 7 章 多样性第 8 章 舆论 人工智能指数是斯坦福大学以人为本的人工智能研究所&#xff08;HAI&#xff09;的一项独立倡议&#xff0c…

CNN-LSTM-Attention混合神经网络归时序预测的MATLAB实现(源代码)

CNN-LSTM-Attention介绍&#xff1a; CNN-LSTM-Attention混合神经网络是一种结合了卷积神经网络&#xff08;CNN&#xff09;、长短期记忆神经网络&#xff08;LSTM&#xff09;和注意力机制&#xff08;Attention&#xff09;的模型。这种混合神经网络结合了CNN对空间特征的提…