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@目标机器IPfor currentHostName in 192.168.19.107 192.168.19.108 192.168.19.109
doecho "=================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"}esacdone

在这里插入图片描述

源码分析(粗略)

辅助源码

持久化

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

接口: 快照【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.mzph.cn/news/716997.shtml

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

相关文章

AMDGPU KFD Test 编译使用

ROCT-Thunk-Interface是一个用于在ROCm软件堆栈中提供设备无关性的层。它是ROCm的一部分,允许不同的硬件平台(如AMD GPU和Intel CPU)使用相同的API进行计算。 要安装ROCT-Thunk-Interface,首先需要创建一个新的目录,并进入该目录: mkdir rocm-build cd rocm-build然后,…

ng : 无法将ng项识别为 cmdlet、函数、脚本文件或可运行程序的名称

ng : 无法将“ng”项识别为 cmdlet、函数、脚本文件或可运行程序的名称”,出现这种错误,那说明你angular-cli没有下载所以环境变量里没有相应的东西 1、需要在cmd里输入npm install -g angular/cli 2、之后运行angular命令时还可能出现这种错误 “ng : …

ruoyi 图片等文件资源读取

老是忘,记录一下 ResourcesConfig 文件下 /** 本地文件上传路径 */ registry.addResourceHandler(Constants.RESOURCE_PREFIX "/**").addResourceLocations("file:" RuoYiConfig.getProfile() "/"); /*** 资源映射路径 前缀*/ …

kafka消费者重平衡是什么?怎么避免?

消费者重平衡是指主题下的分区怎么分配给消费者的过程。下面这个图可以看出该过程:原来有2个消费者,3个分区,其中一个消费者肯定就的处理2个分区了。那么当新加入消费者时,则每个消费者就只处理一个分区了。处理这个分区过程的叫协…

详解Nacos注册中心的使用

文章目录 1、安装2、服务注册2.1、引入依赖2.2、配置nacos地址2.3、重启 3、服务分级存储模型3.1、给user-service配置集群3.2、同集群优先的负载均衡 4、权重配置5、环境隔离5.1、创建namespace5.2、配置namespace 6、Nacos与Eureka的区别7、代码免费分享 ​🍃作者…

首例以“冠状病毒”为主题的勒索病毒,篡改系统MBR

前言概述 2020年勒索病毒攻击仍然是网络安全的最大威胁,在短短三个月的时间里,已经出现了多款新型的勒索病毒,关于2020年勒索病毒攻击新趋势,可以阅读笔者写的上一篇文章,里面有详细的分析,从目前观察到的…

Linux 学习笔记(9)

九、 运行级别 1 、 Linux 系统的运行级别 (runlevel) Linux 系统有 7 个运行级别, Linux 系统任何时候都运行在一个指定的运行级别上,不同的运行级 别所运行的程序和服务不尽相同,所要完成的工作和要达到的目的也不相同 运行级别…

RH850P1X芯片学习笔记-Generic Timer Module -ATOM

文章目录 ARU-connected Timer Output Module (ATOM)OverviewGLOBAL CHANNEL CONTROL BLOCK ATOM Channel architectureATOM Channel modesSOMP-Signal Output Mode PWMSOMP - ARUSOMC-Signal Output Mode CompareSOMC - ARUSOMC – COMPARE COMMANDSOMC – OUTPUT ACTIONATOM …

Python缩进规则

Python的缩进规则是Python语法中非常重要的一部分,也是Python语言独特的特点之一。在Python中,缩进被用来表示代码块的层次结构,而不是像其他语言一样使用大括号或关键词。这种缩进规则使得Python代码更加简洁、易读、易于理解,同…

python模块百科_操作系统接口_os【一】

python模块百科_操作系统接口_os【一】 os --- 多种操作系统接口一、相关模块1.1 os.path 文件路径1.2 fileinput 文件读取1.3 tempfile 临时文件和目录1.4 shutil 高级文件和目录1.5 platform 操作系统底层模块 二、关于函数适用性的说明2.1 与操作系统相同的接口2.2 支持字节…

Git版本管理常用指令

Git常用命令 一、基本指令二、本地仓库管理三、远程仓库管理四、分支管理五、储藏区六、标签管理一、基本指令 查看Git安装版本:git --version 查看log指令的帮助信息:git log --help 配置Git用户名:git config --global user.name “xxxxx” 配置Git邮箱: git config --…

2024年腾讯云新用户优惠券领取入口及使用教程

随着云计算技术的不断发展和普及,越来越多的个人和企业选择使用云服务。腾讯云作为国内领先的云服务提供商,为了吸引新用户,经常推出各种优惠活动,其中就包括新用户专属优惠券,本文将为大家分享腾讯云新用户优惠券的领…

5个好玩神奇还免费的工具网站收藏不后悔-搜嗖工具箱

生命倒计时 http://www.thismuchlonger.com 这是一个相哇塞的网站,可以让我们静下心来好好想想我们来这个世界究竟为了什么,因为当我们作为命运的主宰者。敲打键盘设定好自己一生长度的时候,我们的剩余寿命已经成绝对值,一旦生命…

创建型模式之原型模式

一、概述 1、工作原理:将一个原型对象传给要发动创建的对象(即客户端对象),这个要发动创建的对象通过请求原型对象复制自己来实现创建过程 2、通过克隆方法所创建的对象是全新的对象,它们在内存中拥有新的地址,每一个克隆对象都是独立的 3…

MySQL 中的 varchar 和 char 有什么区别?MySQL中 in 和 exists 区别?

MySQL 中的 varchar 和 char 有什么区别? char 是一个定长字段,假如申请了char(10)的空间,那么无论实际存储多少内容.该字段都占用 10 个字符,而 varchar 是变长的,也就是说申请的只是最大长度,占用的空间为实际字符长度1,最后一个字符存储使用了多长的空间. 在检索…

李沐动手学习深度学习——3.6练习

本节直接实现了基于数学定义softmax运算的softmax函数。这可能会导致什么问题?提示:尝试计算exp(50)的大小。 可能存在超过计算机最大64位的存储,导致精度溢出,影响最终计算结果。 本节中的函数cross_entropy是根据交叉熵损失函数…

JavaScript之数据类型

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 数据类型   Java…

20.图

图的基本概念 1.图的定义 由顶点和边组成的集合,G(V,E) 2.基本概念 邻接点: 对于无向图u v来说,uv互为邻接点 对于有向图u->v来说,v是u的邻接点,但u不是v的临界点 路径: 一个顶点到另一个顶点所经过的…

从Poincare猜想看中国数学的国际地位

2006年丘成桐学派利用北京晨兴数学中心,宣布一名俄国学者Poincare猜想研究中存在错误,已经由华裔学者朱熹平和曹怀东纠正过来,但数年以后我发现作为千禧七问题之一的Poincazre猜想,英国克莱数学所还是把1百万美元奖金送给俄国人。…

蓝桥杯:卡片

题目 小蓝有很多数字卡片,每张卡片上都是数字0 到9。 小蓝准备用这些卡片来拼一些数,他想从1 开始拼出正整数,每拼一个,就保存起来,卡片就不能用来拼其它数了。 小蓝想知道自己能从1 拼到多少。 例如,当小…