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

news2024/9/30 1:33:28

文章目录

    • 原理
      • 选举机制(重点)
        • 情况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

在这里插入图片描述


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

在这里插入图片描述

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

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

相关文章

【力扣白嫖日记】608.树节点

前言 练习sql语句,所有题目来自于力扣(https://leetcode.cn/problemset/database/)的免费数据库练习题。 今日题目: 175.组合两个表 表:Person 列名类型idintp_idvarchar 树中的每个节点可以是以下三种类型之一&a…

Unity铰链四杆机构设计和运动仿真

一、效果图 设定好各边长度和转速后,点击【设置并启动】,自动生成一个机构模型,并按照原理进行运转 二、铰链四杆机构介绍 机架:A和D是固定位置,叫做机架。 曲柄:B点绕A点旋转,构成曲柄。 连…

poi 设置允许西文在单词中间换行

说明本文是CSDN-问答模块,题主提问。问题描述:poi 设置允许西文在单词中间换行 一、问题描述 poi 设置允许西文在单词中间换行? // 创建一个新的文档XWPFDocument document = new XWPFDocument();// 创建段落XWPFParagraph firstParagraph = document.createParagraph();fir…

自定义类型(结构体、枚举、联合体)内存大小的计算方法

内存对齐 为什么会存在内存对齐? 大部分参考资料是这么说的: 平台原因(移植原因): 不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。性能原…

Python绘制不同形状词云图

目录 1.基本词云图1.1 导入所需库1.2 准备词汇1.3 配置参数并生成词云图1.4 在Python窗口中显示图片1.5 效果展示1.6 完整代码 2. 不同形状词云图2.1 找到自己所需形状图片2.2 利用PS将图片设置为黑白色2.3 在代码中设置背景2.4 效果展示 1.基本词云图 1.1 导入所需库 import…

设计模式七:责任链模式

文章目录 1、责任链模式2、spring中的责任链模式Spring InterceptorServlet FilterNetty 1、责任链模式 责任链模式为请求创建了一个接收者对象的链,在这种模式下,通常每个节点都包含对另一个节点者的引用。每个节点针对请求,处理自己感兴趣…

备战蓝桥杯---动态规划的一些思想1

话不多说,直接看题: 目录 1.双线程DP 2.正难则反多组DP 3.换个方向思考: 1.双线程DP 可能有人会说直接贪心:先选第1条的最优路径,再选第2条最优路径。 其实我们再选第1条时,我们怎么选会对第2条的路径…

宝塔面板安装各种组件以及部署应用服务

在linux服务器安装宝塔面板 一、从宝塔官网下载exe安装包,安装命令从宝塔官网(https://www.bt.cn/)获取 yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh二、安…

【JGit 】一个完整的使用案例

需求 生成一系列结构相同的项目代码,将这些项目的代码推送至一个指定的 Git 仓库,每个项目独占一个分支。 推送时若仓库不存在,则自动创建仓库。 分析 生成代码使用 Java 程序模拟,每个项目中模拟三个文件。Project.cpp 、Pro…

总结 HashTable, HashMap, ConcurrentHashMap 之间的区别

1.多线程环境使用哈希表 HashMap 不行,线程不安全 更靠谱的,Hashtable,在关键方法上加了synchronized 后来标准库又引入了一个更好的解决方案;ConcurrentHashMap 2.HashMap 首先HashMap本身线程不安全其次HashMap的key值可以为空(当key为空时,哈希会…

FNM和SFNM的区别

看图说话。 级联模式下,FNM模式,从片的中断都是同一个级别,因此从片如果有多个中断发生,中断之间不会抢占,只能按顺序处理。 级连模式下,SFNM模式,从片中断有优先级的区别,高优先级…

Qt外部调用进程类QProcess的使用

有的时候我们需要在自己程序运行过程中调用其他进程,那么就需要用到QProcess。 首先可以了解一些关于进程的相关知识:线程与进程,你真得理解了吗_进程和线程的区别-CSDN博客 进程是计算机中的程序关于某数据集合上的一次运行活动&#xff0…

7.1.1 selenium介绍及安装chromedriver

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

NIO核心三:Selector

一、基本概念 选择器提供一种选择执行已经就绪的任务的能力。selector选择器可以让单线程处理多个通道。如果程序打开了多个连接通道,每个连接的流量都比较低,可以使用Selector对通道进行管理。 二、如何创建选择器 1.创建Selector Selector select…

ArduinoTFTLCD应用

ArduinoTFTLCD应用 ArduinoTFTLCD应用硬件连接软件导入库显示数字、字符显示汉字方案1方案2 显示图片 总结 ArduinoTFTLCD应用 对于手工喜欢DIY的人来说,Arduino驱动的TFTLCD被很多人使用,此处就总结一下,使用的是VScode的PlatformIO插件驱动…

Docusaurus框架——react+antd+echarts自定义mdx生成图表代码解释文档

文章目录 ⭐前言⭐Docusaurus框架渲染mdx内容💖 创建一个mdx文件💖 创建一个react jsx文件💖 mdx引入react的组件并渲染💖 mdx引入react的组件源代码内容 ⭐渲染一个echarts地图的代码解释文档💖 echarts 渲染地图&…

USLE模型-P因子的计算

首先需要下载土地利用类型数据集,查看我的相关文章 对于已有的10种土地类型代码,需要按水土保持措施P值表进行重分类。 10是耕地,且庆阳市坡度10-15度左右,所以赋给了3(最好再下个DEM计算一下,这里就统一用…

WebServer -- 注册登录

目录 🍉整体内容 🌼流程图 🎂载入数据库表 提取用户名和密码 🚩同步线程登录注册 补充解释 代码 😘页面跳转 补充解释 代码 🍉整体内容 概述 TinyWebServer 中,使用数据库连接池实现…

C++指针(三)

个人主页:PingdiGuo_guo 收录专栏:C干货专栏 文章目录 前言 1.字符指针 1.1字符指针的概念 1.2字符指针的用处 1.3字符指针的操作 1.3.1定义 1.3.2初始化 1.4字符指针使用注意事项 2.数组参数,指针参数 2.1数组参数 2.1.1数组参数的概念 2.1…

NCT 全国青少年编程图形化编程(Scratch)等级考试(一级)模拟测试H

202312 青少年软件编程等级考试Scratch一级真题 第 1 题 【 单选题 】 以下说法合理的是( ) A :随意点开不明来源的邮件 B :把密码设置成 abc123 C :在虚拟社区上可以辱骂他人 D :在改编他人的作品前, 先征得他人同意 正确答案: D 试题解析&…