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

【zookeeper】zk选举、使用与三种节点简介,以及基于redis分布式锁的缺点的讨论

这里我准备了4台虚拟机,从node1到node4,其myid也从1到4.

一,zk server的启动和选举

zk需要至少启动3台Server,按照配置的myid,选举出参与选举的myid最大的server为Leader。(与redis的master、slave不同,zk的叫leader、follower)。
如果已经选举成功,那么即使新加入的zk server的myid比现有leader的myid更大,也不会成为新的leader,除非现有的Leader挂掉,那么新加入的myid最大的zk server会成为leader。

我们通过zkServer.sh start-foreground命令来前台阻塞的启动zk server,这样方便看到日志输出。注意,start 和-foreground之间是没有空格的。

启动后,看到如下日志,是已经启动成功。后面的日志是一些同步快照的日志。(前面有异常是因为其他zk server还没有起来)
在这里插入图片描述

二、zk cli的启动和基础命令

我们通过zkCLi.sh,默认的连接Localhost,本机(node1,一个folloer)上的server,连上了follower,就连上了zk集群。你在follower上做的增改,会发送到leader那里,由leader广播给所有zk的follower。

进入客户端后,使用help查看zk cli的命令。如下所示

[zk: localhost:2181(CONNECTED) 0] help
ZooKeeper -server host:port -client-configuration properties-file cmd argsaddWatch [-m mode] path # optional mode is one of [PERSISTENT, PERSISTENT_RECURSIVE] - default is PERSISTENT_RECURSIVEaddauth scheme authclose config [-c] [-w] [-s]connect host:portcreate [-s] [-e] [-c] [-t ttl] path [data] [acl]delete [-v version] pathdeleteall path [-b batch size]delquota [-n|-b|-N|-B] pathget [-s] [-w] pathgetAcl [-s] pathgetAllChildrenNumber pathgetEphemerals pathhistory listquota pathls [-s] [-w] [-R] pathprintwatches on|offquit reconfig [-s] [-v version] [[-file path] | [-members serverID=host:port1:port2;port3[,...]*]] | [-add serverId=host:port1:port2;port3[,...]]* [-remove serverId[,...]*]redo cmdnoremovewatches path [-c|-d|-a] [-l]set [-s] [-v version] path datasetAcl [-s] [-v version] [-R] path aclsetquota -n|-b|-N|-B val pathstat [-w] pathsync pathversion whoami 

刚进入zk,zk的根节点/下会有一个默认的节点zookeeper

[zk: localhost:2181(CONNECTED) 1] ls /
[zookeeper]

create:当然你可以自己去在根节点下创建一个新的节点Node1。
在创建节点时,可以在节点名字后面跟上你想要赋予节点的信息,这里我跟了一个空字符串,在我这个版本3.7也可以将空串直接不写,存储的信息就是空。

[zk: localhost:2181(CONNECTED) 2] create /node1 ""
Created /node1
[zk: localhost:2181(CONNECTED) 3] ls /
[node1, zookeeper]

在node1下再创建一个节点node2

[zk: localhost:2181(CONNECTED) 4] create /node1/node2 ""
Created /node1/node2

set:可以更改节点中的信息


[zk: localhost:2181(CONNECTED) 8] set /node1/node2 "this is node2"

get:可以获取节点中的信息,带上-s可以在信息的下面带上节点的事务id等信息,效果同stat命令。

[zk: localhost:2181(CONNECTED) 9] get /node1/node2
this is node2

stat:获取节点的事务id、创建和修改时间等信息。

这些信息每个数据节点如/node1,每个数据节点都会有自己的一份。

其中,cZxid为创建节点事务id,开头的0x表示数据为16进制,x后的2表示集群leader为第几代(集群旧的leader挂掉,新的Leader上台,这个数就会+1)。2后面的8位16进制,表示节点创建的事务id,数值范围为从0~16^8。

类似的,mZxid为修改节点事务id,pZxid为该节点的子节点(或该节点)的最近一次创建 / 删除 的事务id。

//todo cZxid mZxid如何递增

[zk: localhost:2181(CONNECTED) 15] stat /node1
cZxid = 0x200000002
ctime = Fri Sep 22 00:12:28 PDT 2023
mZxid = 0x200000002
mtime = Fri Sep 22 00:12:28 PDT 2023
pZxid = 0x200000003
cversion = 1
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 0
numChildren = 1

三,zk的三种节点

zk有三种节点,永久节点临时节点序列节点

永久节点
我们使用create命令,不加参数,创建的是第一种节点,即永久节点,这种节点不会随着客户端断开连接而消失,也没有序列号。

临时节点
使用create -e,创建的节点为临时节点。

这种节点会随着客户端断开连接,如果未在一定时间内重新连接,临时节点数据将会在集群内被清除。

假设客户端cli连接的server挂掉,导致客户端断开连接,如果客户端在一定时间内重新连接上,临时节点仍然不会被清除。这是因为客户端在连接server的时候,会产生一个会话session,客户端提示如下图所示。

session id = 0x1000014a34d0000, negotiated timeout = 30000
session id 0x1000014a34d0000将会被同步到整个集群(这次同步也会增加一次事务id),使得每个server都会持有这个客户端的session id。
negotiated timeout = 30000意为客户端断连后需要在3秒内重新连接,否则视为退出。
在这里插入图片描述

node1上的这台服务端也会有日志,session id会作为全局id提交给集群。
在这里插入图片描述

创建临时节点后,可以通过stat命令结果中的ephemeralOwner查看该临时节点的创建者的session id。

[zk: localhost:2181(CONNECTED) 23] create -e /node4 "this is node4"
Created /node4
[zk: localhost:2181(CONNECTED) 24] stat /node4
cZxid = 0x200000007
ctime = Fri Sep 22 01:03:39 PDT 2023
mZxid = 0x200000007
mtime = Fri Sep 22 01:03:39 PDT 2023
pZxid = 0x200000007
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x1000014a34d0000
dataLength = 13
numChildren = 0

毫无疑问,临时节点天然就可以用来表征其他集群中节点的状态。也很适合做分布式锁,抢占锁,就在某数据节点(如表示某系统的节点)如/DataCenter下创建一个固定名称如Lock临时节点,能创建,即为抢占到锁,且能通过stat查看到锁的主人是哪一台服务器。不能抢占,即为锁被抢占,要进行等待。

zk的分布式锁,相较于redis实现的分布式锁,要更简单。

因为redis想要不死锁,需要指定一个固定的过期时间,指定的过期时间长了,锁性能不高;指定过期时间短了,还没操作完锁就被释放了。

为此,redis分布式锁的实现者们需要考虑诸如引入守护线程或者线程池[1] (因为锁持有者释放锁后守护线程没用了就要被销毁,引入线程池减小线程开销)为锁自动续过期时间,例如Redission的WatchDog看门狗机制[1];而早期的setnx命令+expire命令不具备原子性,为此需要引入Lua脚本等等诸多问题[2](redis 2.7后的版本可以在set 命令上同时指定过期时间参数和nx参数)。

zk就不一样,zk的临时节点销毁由zk自己保证,leader挂掉后可在200毫秒内选举出新的Leader,且性能极高[3],使用者不需要考虑太多。
在这里插入图片描述
在这里插入图片描述

序列节点
使用create -s创建的节点为序列节点。这种节点在创建节点如create -s node时,不会直接创建Node,而是会在node后面跟上一个从0开始的序列号,每创建一个,序列号就+1。即使这些序列节点都删除了,再创建序列节点,仍然会再之前的基础上再+1.

可以在某个节点如node下创建序列节点,可以实现一个类似于队列的特性,按照创建顺序来争抢代表了node的锁。

关于zk的暂时就先写这么多,后面有了再继续写或者补充。

参考文章:
[1],面试官:Redis 分布式锁如何自动续期?
[2],面试被问Redis锁🔒的缺点,被打击的扎心了
[3],ZooKeeper

相关文章:

【zookeeper】zk选举、使用与三种节点简介,以及基于redis分布式锁的缺点的讨论

这里我准备了4台虚拟机,从node1到node4,其myid也从1到4. 一,zk server的启动和选举 zk需要至少启动3台Server,按照配置的myid,选举出参与选举的myid最大的server为Leader。(与redis的master、slave不同&a…...

Unity截图生成图片 图片生成器 一键生成图片

使用Unity编辑器扩展技术实现快速截图功能 效果: 里面没有什么太难的技术,直接上源码吧 注意!代码需要放在Editor文件下才能正常运行 using System; using UnityEditor; using UnityEngine;[ExecuteInEditMode] public class Screenshot …...

Matlab图像处理-区域特征

凹凸性 设P是图像子集S中的点,若通过的每条直线只与S相交一次,则称S为发自P的星形,也就是站在P点能看到S的所有点。 满足下列条件之一,称此为凸状的: 1.从S中每点看,S都是星形的; 2.对S中任…...

golang 自动生成文件头

安装koroFileHeader控件 打开首选项,进入设置,配置文件头信息"fileheader.customMade": {"Author": "lmy","Date": "Do not edit", // 文件创建时间(不变)// 文件最后编辑者"LastEditors"…...

Excel中的宏、VBA

一、宏是什么? EXCEL MACRO 是一种记录和播放工具,它仅记录您的 Excel 步骤,并且宏将根据需要播放任意多次。 VBA 宏可自动执行重复任务,从而节省了时间。 这是一段可在 Excel 环境中运行的编程代码,但您无需成为编码…...

2023华为杯数学建模研赛思路分享——最全版本A题深度解析

问题回顾: WLAN网络信道接入机制建模 1. 背景 无线局域网(WLAN, wireless local area network)也即Wi-Fi广泛使用,提供低成本、高吞吐和便利的无线通信服务。基本服务集(BSS, basic service set)是WLAN的…...

【校招VIP】测试方案之测试需求分析

考点介绍: 需求分析就是要弄清楚用户需要的是什么功能,用户会怎样使用系统。这样我们测试的时候才能更加清楚的知道系统该怎么样运行,才能更好的设计测试用例,才能更好的测试。 测试方案之测试需求分析-相关题目及解析内容可点击…...

滚珠螺母的清洁方式

滚珠螺母是一种通过滚珠与螺杆进行螺旋运动转换的机械零件,主要用于控制螺杆的运动轨迹和方向,把原来的滑动摩擦利用滚珠的滚动变成滚动摩擦,因此滚珠螺母的摩擦系数大大降低,从而提高了传动效率,要想滚珠螺母达到预期…...

leetcode做题笔记148. 排序链表

给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。 思路一:归并排序 c语言解法 struct ListNode* merge(struct ListNode* head1, struct ListNode* head2) {struct ListNode* dummyHead malloc(sizeof(struct ListNode));dummyHead…...

多线程学习

并发:交替运行 并行:一起运行 多线程实现方式 继承Thread类 ①自己定义一个类继承Thread public class MyThread extends Thread{public void run(){}} ②重写run方法 public class MyThread extends Thread{public void run(){"重写的内容&…...

软件测试/测试开发丨ChatGPT在测试计划中的应用策略

点此获取更多相关资料 简介 测试计划是指描述了要进行的测试活动的范围、方法、资源和进度的文档。它主要包括测试项、被测特性、测试任务和风险控制等。 所以在使用ChatGPT输出结果之前,我们需要先将文档的内容框架梳理好,以及将内容范围划定好&…...

链表oj3(Leetcode)——相交链表;环形链表

一,相交链表 相交链表(Leetcode) 1.1分析 看到这个我们首先想到的就是一个一个比较他们的值有相等的就是交点,但是如果a1和b2的值就相等呢?所以这个思路不行,第二种就是依次比较链表,但是这…...

nginx反向代理

nginx反向代理8.反向代理8.1 实现http反向代理8.1.1 反向代理配置参数8.1.2 反向代理单台web服务器8.1.2.1 端口号后加"/"8.1.2.2 端口号后不加"/" 8.1.3指定location 实现反向代理,动静分离8.1.4 反向代理实例:缓存功能8.1.4.1 举例 8.1.5 实现…...

基于eBPF的安卓逆向辅助工具——stackplz

前言 stackplz是一款基于eBPF技术实现的追踪工具,目的是辅助安卓native逆向,仅支持64位进程,主要功能如下: hardware breakpoint 基于pref_event实现的硬件断点功能,在断点处可读取寄存器信息,不会被用户…...

十大排序——4.堆排序

前面我们讲了堆,现在我们来看一下队排序。 堆排序的步骤: 首先将一个无序数组建立成一个大顶堆然后,将堆顶的元素和堆低的元素进行交换(即将最大的元素交换的到堆底),缩小并下潜调整堆重复上一步&#xf…...

独辟蹊径”之动态切换进程代理IP

前言 项目中遇到这样一个需求,需要动态切换指定进程Sockets5代理IP,目前了解到可通过编写驱动拦截或者劫持LSP实现,LSP劫持不太稳定,驱动无疑是相对较好的解决方案,奈何水平不足便有了这"蹊径"。 初步尝试…...

redis漏洞修复:(CNVD-2019-21763)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、漏洞内容二、镜像准备1.确认镜像版本2.下载镜像 三、配置文件准备1.获取配置文件2.修改配置文件 四、启动redis容器五、修改iptables文件总结 前言 漏扫发…...

手刻 Deep Learning -第壹章-PyTorch入门教学-基础概念与再探线性回归

一、前言 本章会需要 微分、线性回归与矩阵的基本观念 这次我们要来做 PyTorch 的简单教学,我们先从简单的计算与自动导数( auto grad / 微分 )开始,使用优化器与误差计算,然后使用 PyTorch 做线性回归,还有…...

深入学习 Redis - 如何使用 Redis 作缓存?缓存更新策略?使用需要注意哪些问题(工作/重点)

目录 一、Redis 作为缓存 1.1、缓存的基本概念 1.1.1、理解 1.1.2、缓存存什么样的数据?二八定律 1.2、如何使用 redis 作为缓存 1.3、缓存更新策略(redis 内存淘汰机制 / 重点) 1.3.1、定期生成 1.3.2、实时生成 内存淘汰策略&#…...

好用的软件测试框架有哪些?测试框架的作用是什么?

软件测试框架是现代软件开发过程中至关重要的工具,它可以帮助开发团队更加高效地进行测试和验证工作,从而大大提高软件质量和用户体验。 一、好用的软件测试框架 1. Selenium:作为一种开源的自动化测试框架,Selenium具有功能强大…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)

HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...

相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解

【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下: 一、场景操作步骤 操作步…...

MODBUS TCP转CANopen 技术赋能高效协同作业

在现代工业自动化领域,MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步,这两种通讯协议也正在被逐步融合,形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...

OPENCV形态学基础之二腐蚀

一.腐蚀的原理 (图1) 数学表达式:dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一,腐蚀跟膨胀属于反向操作,膨胀是把图像图像变大,而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...

【Java学习笔记】BigInteger 和 BigDecimal 类

BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点:传参类型必须是类对象 一、BigInteger 1. 作用:适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...

《C++ 模板》

目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板,就像一个模具,里面可以将不同类型的材料做成一个形状,其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式:templa…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

Python 训练营打卡 Day 47

注意力热力图可视化 在day 46代码的基础上,对比不同卷积层热力图可视化的结果 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pypl…...

LCTF液晶可调谐滤波器在多光谱相机捕捉无人机目标检测中的作用

中达瑞和自2005年成立以来,一直在光谱成像领域深度钻研和发展,始终致力于研发高性能、高可靠性的光谱成像相机,为科研院校提供更优的产品和服务。在《低空背景下无人机目标的光谱特征研究及目标检测应用》这篇论文中提到中达瑞和 LCTF 作为多…...

区块链技术概述

区块链技术是一种去中心化、分布式账本技术,通过密码学、共识机制和智能合约等核心组件,实现数据不可篡改、透明可追溯的系统。 一、核心技术 1. 去中心化 特点:数据存储在网络中的多个节点(计算机),而非…...