zookeeper简介及基操

cpp;gutter:true; zk的安装: 1. 下载zk.tar.gz安装包,并解压至/usr/local/devInstall 2. 在zk的目录下新建文件夹data 3. 复制zk/config目录下的zoo_sample.cfg,重命名为zoo.cfg,vim zoo.cfg,将其中的dataDir=步骤2中data的目录;dataDir指定的路径用于存储zk中数据的内存快照,及事务文件。 启动zk: 1. 进入zk的bin目录 2. 启动zk:./zkServer.sh start 3. 查看状态:./zkServer.sh status 4. 停止zk: ./zkServer.sh stop 启动zk客户端: 1. 进入zk的bin目录 2. 启动:./zkCli.sh 3. 停止:quit zk常用的shell命令: -新增节点: create [-s] [-e] path data #其中-s为有序节点,-e为临时节点;默认创建的节点都是持久化节点。 eg:创建持久化节点并写入数据: [zk: localhost:2181(CONNECTED) 9] create /hadoop "123456" Created /hadoop 创建持久化有序节点,此时创建的节点名为指定节点名+自增序号: [zk: localhost:2181(CONNECTED) 10] create -s /a "aaa" Created /a0000000007 创建临时节点,临时节点会在会话过期后被删除: [zk: localhost:2181(CONNECTED) 11] create -e /tmp "tempo" Created /tmp 创建临时有序节点,也会在会话过期后被删除: [zk: localhost:2181(CONNECTED) 12] create -s -e /aa "aaa" Created /aa0000000009 -更新节点:每次更新后dataVersion都会自增1 -更新节点的命令是set,可以直接进行修改,如下: [zk: localhost:2181(CONNECTED) 14] set /hadoop "12345" cZxid = 0x23 ctime = Wed Jul 15 13:28:02 CST 2020 mZxid = 0x27 mtime = Wed Jul 15 13:35:06 CST 2020 pZxid = 0x23 cversion = 0 dataVersion = 1 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 5 numChildren = 0 -也可以基于版本号进行修改,此时类似于乐观锁机制,当你传入的数据版本号(dataVersion)和当前节点数据版本号不符合时,zk会拒绝本次修改: [zk: localhost:2181(CONNECTED) 16] set /hadoop "12343" 1 version No is not valid : /hadoop -删除节点: 删除节点的语法如下: delete path [version] 和更新节点数据一样,也可以传入版本号。当传入的版本号和此节点的数据版本号不一致时,zk也不会执行删除操作。 要向删除某个节点及其所有后代节点,可以使用递归删除,命令为rmr path; -查看节点: 查看节点的语法如下: get path -查看节点状态: 可以使用stat命令查看节点状态,它的返回值和get命令类似,但不会返回节点数据: stat path -查看节点列表: 查看节点列表有ls path 和 ls2 path两个命令,后者是前者的增强,不仅可以查看指定路径下所有节点,还可以查看当前节点的信息。 -监听器get path [watch] 使用get path [watch] 注册的监听器能够在节点内容发生改变的时候,向客户端发出通知。需要注意的是,zk的触发器是一次性的(one-time-trigger),即触发一次后就会立即失效。 eg: get /hadoop watch set /hadoop watch 45678 [zk: localhost:2181(CONNECTED) 1] set /hadoop "45678" WATCHER:: WatchedEvent state:SyncConnected type:NodeDataChanged path:/hadoop -监听器stat path [watch] 使用stat path [watch] 注册的监听器能够在节点状态发生改变的时候,向客户端发出通知。 [zk: localhost:2181(CONNECTED) 2] stat /hadoop watch [zk: localhost:2181(CONNECTED) 3] set /hadoop 12344 WATCHER:: WatchedEvent state:SyncConnected type:NodeDataChanged path:/hadoop -监听器ls\ls2 path [watch] 使用ls path [watch] 或 ls2 path [watch] 注册的监听器能够监听该节点下所有子节点的增加和删除操作。注意:只能捕获增加和删除,节点数据的修改不能捕获。</p> <p>zk事件监听机制 watcher架构: watcher实现由三个部分组成: -zk服务端 -zk客户端 -客户端ZKWatchManager对象 客户端首先将watcher注册到服务端,同时将watcher对象保存到客户端的watcher管理器中。当zk服务器端监听的数据状态发生变化时,服务端会主动通知客户端,接着客户端的water管理器会触发相关watcher来回调相应处理逻辑,从而完成整体的数据发布/订阅流程。 watcher特性: -一次性:watcher是一次性的,一旦被触发就会被移除,再次使用需要重新注册 -客户端顺序回调:watcher回调是顺序串行化执行的,只有回调后客户端才能看到最新的数据状态.一个watcher回调逻辑不应该太多,以免影响别的watcher执行。 -轻量级:watchEvent是最小的通信单元,结构上只包含通知状态,事件类型和节点路径,并不会告诉数据节点变化前后的具体内容。 -时效性:watcher只有在当前session彻底失效时才会无效,若在session有效期内快速重连成功,则watcher依然存在,仍可接收通知。</p> <p>watcher接口设计: watcher是一个接口,任何实现了watcher接口的类就是一个新的Watcher。Watcher内部包含了两个枚举类:KeeperState、EventType Watcher通知状态(KeeperState) keeperState是客户端与服务端连接状态发生变化时对应的通知类型。其枚举属性: -SynConnected:客户端与服务器正常连接 -Disconnected:客户端与服务器断开连接 -Expired:会话Session失效时 -AuthFailed:身份认证失败时 Watcher事件类型(EventType) EventType是数据节点(znode)发生变化时对应的通知类型。EventType变化时KeeperState永远处于SynConnected通知状态下;当KeeperState发生变化时,EventType永远为None.其枚举属性如下: -None:无 -NodeCreated:Watcher监听的数据节点被创建时 -NodeDeleted:watcher监听的数据节点被删除时 -NodeDataChanged:watcher监听的数据节点内容发生变更时(无论内容数据是否变化) -NodeChildrenChanged:watcher监听的数据节点的子节点列表发生变更时 注意:客户端收到的相关事件通知中只包含状态及类型等信息,不包含节点变化前后的具体内容,变化前的数据需要业务自身存储,变化后的数据需要调用get方法重新获取。 捕获相应的事件: zk中采用zk.getChildren(path,watch),zk.exists(path,watch),zk.getData(path,watcher,stat)这样的方式为某个znode注册监听。 zk.exists("/node",watch):可监控有Created,Changed,Deleted zk.getData("/node",watch):可监控有Changed,Deleted zk.getChildren("/node",watch):可监控的有ChildrenChanged(子节点增加,删除;但子节点数据变动不会被监听),Deleted</p> <pre><code>zk实现分布式锁(排他锁): 设计思路: 1. 每个客户端往/Locks/Lock_,创建成功后/Locks下面会有每个客户端对应的节点,如/Locks/Lock_0000001; 2. 客户端取得/Locks下的子节点,并进行排序,判断排在最前面的是否为自己,如果自己的锁节点在第一位,代表获取锁成功; 3. 如果自己的锁节点不在第一位,则监听自己前一位的锁节点.例如:自己锁节点Lock_000002,那么则监听Lock_000001; 4. 当前一位锁节点(Lock_000001)对应的client执行完成,释放了锁,将会触发监听客户端(Lock_000002)的逻辑; 5. 监听客户端重新执行第2步逻辑,判断自己是否获得了锁。 </code></pre> <p>

Original: https://www.cnblogs.com/kongieg/p/13367292.html
Author: kongieg
Title: zookeeper简介及基操

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/586792/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 绘制几何图形

    《零基础学Java》 绘制几何图形Java可以 分别使用 Graphics 和 Graphics2D 绘制图形, Graphics类 使用不同的方法绘制不同的图形(drawLine…

    Java 2023年6月9日
    064
  • Spring Cloud Alibaba系列之分布式服务组件Dubbo

    本博客的例子代码可以在github找到下载链接:代码下载 SpringBoot、SpringCloud Alibaba系列博客专栏:链接 1、分布式理论 1.1、分布式基本定义 《…

    Java 2023年5月30日
    079
  • 安装和升级pip与pip3

    pip 官网:https://pypi.org/project/pip/ 你可以通过以下命令来判断是否已安装: pip –version # Python2.x 版本命令 pip…

    Java 2023年6月5日
    074
  • 白话电子签章原理及风险

    因为业务需要近来在对接一个线上的电子签章平台, 签完的效果就是在PDF上盖一个红色的章。内部过程沟通中发现,对这个红色章背后的证明逻辑,技术原理,能够了解的比较清楚的人还是很少的。…

    Java 2023年6月15日
    088
  • PyCharm正版(专业版)购买的话多少钱一年?

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Java 2023年5月29日
    081
  • Git (简单基本操作)

    1、设置配置信息 查看配置信息:git config -l 设置用户名:git config –global user.name xxx 设置邮箱:git config…

    Java 2023年6月15日
    058
  • 2.69分钟完成BERT训练!新发CANN 5.0加持

    摘要:快,着实有点快。 现在,经典模型BERT只需2.69分钟、ResNet只需16秒。 啪的一下,就能完成训练! 快,着实有点快。 现在,经典模型BERT只需 2.69分钟、Re…

    Java 2023年6月15日
    059
  • Spring Ioc源码分析系列–自动注入循环依赖的处理

    Spring Ioc源码分析系列–自动注入循环依赖的处理 前言 前面的文章Spring Ioc源码分析系列–Bean实例化过程(二)在讲解到Spring创建…

    Java 2023年6月8日
    068
  • [学习笔记] Java读取用户输入

    在程序的实际运行过程中,我们很可能会要求用户输入数据以继续运行程序; java.util包提供的Scanner类就可用于读取用户输入; 创建Scanner对象 使用next()方法…

    Java 2023年6月5日
    044
  • asp.net 客户邮件群发功能 SendMail 发送静态化html

    背景:现在几乎每个企业都要用到邮箱,而在大客户量情况下,为我们的不同等级的客户送上节日关怀,以及把我们的喜讯、新品通知到他们是我们急需解决的问题。效果如图 思路: 1、静态化网页模…

    Java 2023年6月9日
    069
  • 关于uniapp的事件监听,使用uni.$once和uni.$on导致的重复监听

    最近写项目的时候遇到个问题,就是在使用uniapp的事件监听器时出现重复监听问题。一开始我是用的uni.$on去监听事件,然后出现了重复的触发监听。百度了下,官方提示单次触发的建议…

    Java 2023年6月6日
    050
  • MySQL系统变量和字符集

    书名《MySQL是怎样运行的:从根儿上理解MySQL》可自行百度 以下是知识点总结 重新认识Mysql MySQL是一个C/S架构的软件。 在Windows安装后首先注册成服务,然…

    Java 2023年6月16日
    061
  • Java语言编码规范(Java Code Conventions) 转载

    Java语言编码规范(Java Code Conventions) 晨光(Morning) 本文档讲述了Java语言的编码规范,较之陈世忠先生《c++编码规范》的浩繁详尽,此文当属…

    Java 2023年5月29日
    066
  • 这款免费的多屏亮度调节软件,真的爱了

    眼睛散光貌似严重了,红绿灯的倒计时数字看着非常模糊,应该是晚上码字显示器蓝光伤害导致的,笔记本本身调节亮度是非常方便的,可是外接显示器调节起来低效又麻烦,有时宁可忍一会也不想打断当…

    Java 2023年6月7日
    064
  • Maven学习笔记,动力节点maven教程随堂笔记

    *这篇笔记的学习视频来自b站动力节点 第一部分 1.分析项目要做什么,知道项目有哪些组成部分。2.设计项目,通过哪些步骤,使用哪些技术。需要多少人, 多长的时间。3.组建团队,招人…

    Java 2023年6月9日
    078
  • Spring 拦截器

    拦截器(Interceptor)是一种动态拦截方法调用的机制,在SpringMVC中动态拦截控制器方法的执行 作用: 在指定的方法调用前后执行预先设定的代码 阻止原始方法的执行 总…

    Java 2023年6月7日
    066
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球