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

news2024/10/4 16:36:16

这里我准备了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 args
	addWatch [-m mode] path # optional mode is one of [PERSISTENT, PERSISTENT_RECURSIVE] - default is PERSISTENT_RECURSIVE
	addauth scheme auth
	close 
	config [-c] [-w] [-s]
	connect host:port
	create [-s] [-e] [-c] [-t ttl] path [data] [acl]
	delete [-v version] path
	deleteall path [-b batch size]
	delquota [-n|-b|-N|-B] path
	get [-s] [-w] path
	getAcl [-s] path
	getAllChildrenNumber path
	getEphemerals path
	history 
	listquota path
	ls [-s] [-w] [-R] path
	printwatches on|off
	quit 
	reconfig [-s] [-v version] [[-file path] | [-members serverID=host:port1:port2;port3[,...]*]] | [-add serverId=host:port1:port2;port3[,...]]* [-remove serverId[,...]*]
	redo cmdno
	removewatches path [-c|-d|-a] [-l]
	set [-s] [-v version] path data
	setAcl [-s] [-v version] [-R] path acl
	setquota -n|-b|-N|-B val path
	stat [-w] path
	sync path
	version 
	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

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

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

相关文章

微软在Windows 11推出Copilot,将DALL-E 3集成在Bing!

美东时间9月21日,微软在美国纽约曼哈顿举办产品发布会,生成式AI成为重要主题之一。 微软表示,Copilot将于9月26日在Windows 11中推出;Microsoft 365 Copilot 将于11 月1日向企业客户全面推出;将OpenAI最新的文本生成图…

中兴R5300 G4服务器iSAC管理员zteroot密码遗失的重置方法及IPV6地址启用设置

本文讲解中兴R5300 G4服务器BMC带外iSAC管理员zteroot密码遗失,无法登录时如何对其进行密码重置,以及iSAC启用IPV6地址的方法。 一、重置中兴R5300 G4服务器iSAC管理员zteroot密码 1、通过SSH登录到iSAC,默认用户名:sysadmin&am…

【STM32】IAP升级 预备知识

IAP(In Application Programming)简介 Flash够大的情况下,上电后的程序通过修改 MSP 的方式,可以在一块Flash上存在多个功能差异的程序。 IAP是为了在执行正常功能前,为了升级功能,提前运行的一段程序。这…

如何判断用户的密码是否为强密码?

点击下方关注我,然后右上角点击...“设为星标”,就能第一时间收到更新推送啦~~~ 用户设置的密码弱,会导致信息安全问题,一般的系统都要求设置强密码。今天的文章给大家介绍如何通过一个正则表达式来判断用户的密码是否为强密码。 …

OpenHarmony应用核心技术理念与需求机遇简析

一、核心技术理念 图片来源:OpenHarmony官方网站 二、需求机遇简析 新的万物互联智能世界代表着新规则、新赛道、新切入点、新财富机会;各WEB网站、客户端( 苹果APP、安卓APK)、微信小程序等上的组织、企业、商户等;OpenHarmony既是一次机遇、同时又是一次大的挑战&…

【20230919】win11无法删除Chrome注册表项

win11无法删除Chrome注册表项 删除以下注册表项发生错误: 计算机\HKEY_LOCAL_MACHINE\SOFTWAR\Google计算机\HKEY_CURRENT_USER\Software\Google 尝试了很多删除注册表方法(例如:编辑remove.reg文件),都不行。 无法…

近三年各领域数字孪生相关政策汇编(可下载)

自2021年国家“十四五”规划纲要提出“探索建设数字孪生城市”以来,国家发展和改革委员会、工业和信息化部、住房和城乡建设部、水利部、农业农村部等部门纷纷出台政策,大力推动数字孪生在千行百业的落地发展。这些政策不仅为数字孪生的应用提供了广阔的…

OpenCV之怀旧图片

原始图片 图片模糊 Mat _blur;cv::GaussianBlur(src,_blur,Size(3,3),0); 图片锐化 Mat _sharp;Mat kernal Mat::zeros(3,3,CV_32FC1);kernal.at<float>(0,1) -1;kernal.at<float>(1,0) -1;kernal.at<float>(1,1) 5;kernal.at<float>(1,2) -1;ker…

国内首家!阿里云 Elasticsearch 8.9 版本释放 AI 搜索新动能

简介&#xff1a; 阿里云作为国内首家上线 Elasticsearch 8.9版本的厂商&#xff0c;在提供 Elasticsearch Relevance Engine™ (ESRE™) 引擎的基础上&#xff0c;提供增强 AI 的最佳实践与 ES 本身的混合搜索能力&#xff0c;为用户带来了更多创新和探索的可能性。 近年来&a…

47个Docker常见故障的原因和解决方式

本文针对Docker容器部署、维护过程中&#xff0c;产生的问题和故障&#xff0c;做出有针对性的说明和解决方案&#xff0c;希望可以帮助到大家去快速定位和解决类似问题故障。 Docker是一种相对使用较简单的容器&#xff0c;我们可以通过以下几种方式获取信息&#xff1a; 1、…

搭建自己的搜索引擎之二

一、前言 接上篇 搭建自己的搜索引擎之一 &#xff0c;本篇主要讲ElasticSearch单实例安装配置。 二、安装配置ElasticSearch ElasticSearch版本更新比较频繁&#xff0c;当前已经是8.0版本了&#xff0c;我这里安装的是7.1.1版本&#xff0c;其它版本详细说明可以查阅官方文…

Ae 效果:CC Force Motion Blur

时间/CC Force Motion Blur Time/CC Force Motion Blur CC Force Motion Blur &#xff08;CC 强制运动模糊&#xff09;主要用于为动态图像添加强制的运动模糊效果&#xff0c;增加动态画面的流畅感和真实感。 相对于时间轴面板上的“运动模糊”开关&#xff0c;CC Force Moti…

【2023年中国研究生数学建模竞赛华为杯】E题 出血性脑卒中临床智能诊疗建模 问题分析、数学模型及代码实现

【2023年中国研究生数学建模竞赛华为杯】E题 出血性脑卒中临床智能诊疗建模 1 题目 1.1 背景介绍 出血性脑卒中指非外伤性脑实质内血管破裂引起的脑出血&#xff0c;占全部脑卒中发病率的10-15%。其病因复杂&#xff0c;通常因脑动脉瘤破裂、脑动脉异常等因素&#xff0c;导致…

物联网、工业大数据平台 TDengine 与苍穹地理信息平台完成兼容互认证

当前&#xff0c;在政府、军事、城市规划、自然资源管理等领域&#xff0c;企业对地理信息的需求迅速增加&#xff0c;人们需要更有效地管理和分析地理数据&#xff0c;以进行决策和规划。在此背景下&#xff0c;“GIS 基础平台”应运而生&#xff0c;它通常指的是一个地理信息…

iOS——引用计数(一)

自动引用计数 自动引用计数&#xff08;ARC&#xff0c;Automatic Reference Counting&#xff09;是指内存管理中对引用采取自动计数的技术。 满足以下要求后&#xff0c;我们的代码就无需再次键入retain或者是release代码了&#xff1a; 使用Xcode 4.2或以上版本使用LLVM编…

【云原生】DevOps 环境搭建

本文使用 Gitlab&#xff0c;Jenkins&#xff0c;Docker&#xff0c;K8s&#xff0c;Harbor 实现CICD环境搭建 一、Gitlab环境部署 说明&#xff1a;内存尽量给多点&#xff08;2G以上&#xff09;&#xff0c;后面会安装一些软件&#xff0c;会占用内存 1.1、安装依赖软件 y…

MySQL作业1

目录 一.创建一张表&#xff0c;包含以下所有数据类型 建表&#xff1a;​编辑 二.使用以下六种约束 1.非空约束 2.唯一约束 3.主键约束 4.外键约束 5.检查约束 6.默认值约束 一.创建一张表&#xff0c;包含以下所有数据类型 Text 类型&#xff1a; Number 类型&#…

java框架-Springboot3-web开发

文章目录 自动配置默认效果WebMvcAutoConfigurationWebMvcConfigurer接口静态资源访问首页Favicon缓存 自定义静态资源路径1、配置方式2、代码方式 路径匹配规则内容协商默认支持json配置支持xml内容协商原理自定义支持ymal 模板引擎模板引擎Thymeleaf整合基础语法遍历判断属性…

网络爬虫——HTTP和HTTPS的请求与响应原理

目录 一、HTTP的请求与响应 二、浏览器发送HTTP请求的过程 三、HTTP请求方法 四、查看网页请求 五、常用的请求报头 六、服务端HTTP响应 七、常用的响应报头 八、Cookie 和 Session 九、响应状态码 十、网页的两种加载方法 十一、认识网页源码的构成 十二、爬虫协议…

IOTE 2023盛况回顾,美格智能聚连接之力促数字新生长

9月20~22日&#xff0c;IOTE国际物联网展深圳站在深圳国际会展中心正式召开。本届展会以“IoT构建数字经济底座”为主题&#xff0c;聚焦物联网技术助推数字经济发展的核心动力。美格智能携前沿技术成果亮相展会&#xff0c;与参展观众深入交流。 展会上&#xff0c;美格智能带…