zookeeper开山篇-编译安装与zk基础命令使用
lipiwang 2024-11-15 22:02 36 浏览 0 评论
随着软件开发的规模逐渐增大,传统的单体服务已经解决不了逐渐增大的并发流量问题,项目改造为分布式已经成了一种趋势,伴随而来的是分布式协调相关的一系列问题,而apache的开源组件--zookeeper则是一款成熟’、热门的分布式协调组件,从本篇开始,zk的学习之旅正式开始
zk是什么
在学习zk之前,我们先了解zk到底是什么?按照官方的说法,ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供了包括:配置维护、域名服务、分布式同步、组服务等相关功能。
zk的下载与安装
接下来我们开始下载zookeeper,这里有两个下载方式,第一个方式则是在zookeeper官网下载,最新版的下载地址如下:
https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-3.5.6/
而第二种方式则是在gitHub中搜索Zookeeper,如下:
点击进入后,选择releases进入正式发布的版本中,选择你需要下载的版本,即可
下载完毕后,我们将下载好的zookeeper-xxx.tar.gz解压到常用安装目录下面即可,然后将conf目录下的zoo_sample.cfg文件,复制一份,重命名为zoo.cfg,如下:
接着,我们打开zoo.cfg文件,将dataDir=/tmp/zookeeper修改成zookeeper安装目录所在的data文件夹(安装完以后需要手动创建zk的data文件夹和log存放的目录),并且添加dataLogDir(日志存放目录),如下:
配置完毕后,我们来启动zk服务,双击运行bin目录下的zkServer.cmd文件即可。
编译zk源码
除了前面的直接下载zk的正式版以外,我们也可以选择下载zk源码,进行编译,然后配置启动zk服务端,此种方式的好处是zk的所有代码和启动类代码等都可以进行自定义编写和修改,但是较为繁琐,我们先来了解一下:
1.zk源码需要使用Ant进行编译,所以我们需要进入Ant官网下载对应的版本,进行配置
下载地址如下:http://ant.apache.org/bindownload.cgi,这里需要注意的是我们下载的ant版本分为jdk1.5兼容版本和jdk1.8版本,我们需要按照当前开发环境的jdk版本以及需要编译的zk源码的版本与之对应,点击下载:
=
下载完成后,我们将其解压,开始配置环境变量,例如:
1. `ANT_HOME=E:\apache-ant-1.10.5`
</pre>
并且我们需要在全局的path路径下添加一个%ANT_HOME%\bin ,配置完毕后,我们进入cmd窗口,执行如下命令:
1. `C:\Users\Administrator>ant -version`
2. `ApacheAnt(TM) version 1.10.7 compiled on September12019`
</pre>
可以看到成功返回了ant的版本信息,代表此时配置已经成功。
2.进入github进行下载,我们找到当前所有的 ****branchs:
找到我们需要版本的分支,进行git下载:
1. `$ git clone -b branch-3.5.6 https://github.com/apache/zookeeper.git`
2. `Cloning into 'zookeeper'...`
3. `remote: Enumerating objects: 1, done.`
4. `remote: Counting objects: 100% (1/1), done.`
5. `remote: Total59332(delta 0), reused 0(delta 0), pack-reused 59331`
6. `Receiving objects: 100% (59332/59332), 113.97MiB| 41.00KiB/s, done.`
7. `Resolving deltas: 100% (38347/38347), done.`
</pre>
3.进入刚才下载的zk源码目录,启动cmd窗口,输入编译命令
1. `G:\开发软件>cd zk-3.5.6`
2. `G:\开发软件\zk-3.5.6>cd apache-zookeeper-3.5.6`
3. `G:\开发软件\zk-3.5.6\apache-zookeeper-3.5.6>ant eclipse`
</pre>
然后等待最终编译成功输出,如果为 build successful字样则为成功:
接下来,我们将代码导入开发工具(官方使用的是eclipse,这里我们使用ieda),
一路next,最后将maven编译完成,即可完成源码的编译,我们可以看到源码的目录如下:
而加载完毕后,我们可以看到,zk3.5版本起,官方将模块分离出来了,多出了很多的子模块,比如文档说明相关在 zookeeper-docs工程下,而zk的一些基础数据结构类定义相关则在 zookeeper-jute工程下,而zk的客户端和服务端相关的代码则是分别在zookeeper-client与 zookeeper-server工程下,而在server工程下我们可以找到两个启动类: ZooKeeperServerMain以及 QuorumPeerMain,分别位于org.apache.zookeeper.server和org.apache.zookeeper.server.quorum包下,其中单机版的zk使用 ZooKeeperServerMain作为启动类,集群版的zk使用 QuorumPeerMain启动类。现在我们尝试启动单机版的zk,运行 ZooKeeperServerMain类,结果如下:
1. `错误: 找不到或无法加载主类 org.apache.zookeeper.server.ZooKeeperServerMain`
</pre>
这是怎么回事呢?难道是jdk版本不对?但是我们查阅了官网,zk3.5.x版本对应的jdk的确是1.8,那么只有一种可能就是编译出来的class不是当前jdk编译的,我们这里选择将zookeeper-server的工程重新编译一下:
却看到compile的时候控制台报错了,如下:
1. `[ERROR] Failed to execute goal org.codehaus.mojo:properties-maven-plugin:1.0.0:read-project-properties (default) on project zookeeper: Properties could not be loaded from File: D:\360安全浏览器下载\zk-3.5.6- 副本\zookeeper-server\src\main\resources\git.properties -> [Help1]`
</pre>
看报错的原因,似乎是有部分代码使用了resources\git.properties文件的配置,但是我们找了一下,在github上的代码中不会存在git.properties,那么是哪里出问题了呢?我们来到pom中找到了 properties-maven-plugin插件,看到了如下的配置:
1. `<plugin>`
2. `<groupId>org.codehaus.mojo</groupId>`
3. `<artifactId>properties-maven-plugin</artifactId>`
4. `<executions>`
5. `<execution>`
6. `<phase>initialize</phase>`
7. `<goals>`
8. `<goal>read-project-properties</goal>`
9. `</goals>`
10. `<configuration>`
11. `<files>`
12. `<file>${basedir}/src/main/resources/git.properties</file>`
13. `</files>`
14. `</configuration>`
15. `</execution>`
16. `</executions>`
17. `</plugin>`
</pre>
原来是这里初始化的时候会加载该配置文件的内容,除此之外我们还注意到一个插件exec-maven-plugin,里面使用了部分参数在项目中并不存在,应该是引用了git.properties的配置参数导致了pom报错,并且初始化编译失败,如下:
1. `<plugin>`
2. `<groupId>org.codehaus.mojo</groupId>`
3. `<artifactId>exec-maven-plugin</artifactId>`
4. `<executions>`
5. `<execution>`
6. `<id>generate-version-info</id>`
7. `<phase>generate-sources</phase>`
8. `<goals>`
9. `<goal>exec</goal>`
10. `</goals>`
11. `<configuration>`
12. `<workingDirectory>${project.basedir}/src/main/java/</workingDirectory>`
13. `<executable>java</executable>`
14. `<arguments>`
15. `<argument>-classpath</argument>`
16. `<classpath />`
17. `<argument>org.apache.zookeeper.version.util.VerGen</argument>`
18. `<argument>${project.version}</argument>`
19. `<argument>${git.commit.id}</argument>`
20. `<argument>${build.time}</argument>`
21. `</arguments>`
22. `</configuration>`
23. `</execution>`
24. `</executions>`
25. `</plugin>`
26. `<plugin>`
</pre>
并且我们也可以看到,这里需要这些参数的原因是为了配置VerGen的版本、时间等参数,查阅官方github才知道,VerGen仅仅是为了开发迭代的时候区分每个人的版本不重复冲突使用的,我们个人运行和查阅源码可以选择固定一个值,所以接下来我们来将properties-maven-plugin插件注释掉,并且将
{build.time}两个参数改为自己的值,然后我们再次执行 mvn compile命令,此次编译成功!再次运行main方法,发现控制台出现了新的问题,输入如下:
1. `log4j:WARN No appenders could be found for logger (org.apache.zookeeper.jmx.ManagedUtil).`
2. `log4j:WARN Please initialize the log4j system properly.`
3. `log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.`
4. `Usage: ZooKeeperServerMain configfile | port datadir [ticktime] [maxcnxns]`
</pre>
但是我们当前的启动类没有配置log4j,导致无法输出对应的日志信息,我们找到当前test包下的resources里面的log4j.properties文件,在当前启动类配置上对应的文件目录(vm options):
1. `-Dlog4j.configuration=file:G:\开发软件\zookeeper-release-3.5.6\zookeeper-server\src\test\resources\log4j.properties`
</pre>
再次运行,发现启动报错了:
1. `2020-01-0701:28:48,727[myid:] - ERROR [main:ZooKeeperServerMain@66] - Invalid arguments, exiting abnormally`
2. `java.lang.IllegalArgumentException: Invalid number of arguments:[]`
3. `at org.apache.zookeeper.server.ServerConfig.parse(ServerConfig.java:60)`
4. `at org.apache.zookeeper.server.ZooKeeperServerMain.initializeAndRun(ZooKeeperServerMain.java:103)`
5. `at org.apache.zookeeper.server.ZooKeeperServerMain.main(ZooKeeperServerMain.java:64)`
6. `2020-01-0701:28:48,729[myid:] - INFO [main:ZooKeeperServerMain@67] - Usage: ZooKeeperServerMain configfile | port datadir [ticktime] [maxcnxns]`
</pre>
从报错信息可以得出,我们需要一个运行时传递的参数,但是没有配置,而这个参数就是我们启动服务的时候需要修改的zoo.cfg文件,再次配置修改完毕(上面启动用的zoo.cfg)的文件,如下:
这时我们再次运行,即可成功启动zk的单机服务!
cli常用命令
zk服务端启动以后,我们来开始学习zk客户端命令,首先双击 zkCli.cmd,会默认进行本地的zk连接操作,如下:
help
我们先来看看zk有哪些命令操作,在cmd窗口中输入 help命令回车,即可查看到zk当前支持的所有的命令,如下:
1. `[zk: localhost:2181(CONNECTED) 0] help`
2. `ZooKeeper-server host:port cmd args`
3. `stat path [watch]`
4. `set path data [version]`
5. `ls path [watch]`
6. `delquota [-n|-b] path`
7. `ls2 path [watch]`
8. `setAcl path acl`
9. `setquota -n|-b val path`
10. `history`
11. `redo cmdno`
12. `printwatches on|off`
13. `delete path [version]`
14. `sync path`
15. `listquota path`
16. `rmr path`
17. `get path [watch]`
18. `create [-s] [-e] path data acl`
19. `addauth scheme auth`
20. `quit`
21. `getAcl path`
22. `close`
23. `connect host:port`
</pre>
接下来我们来学习常见的一些命令操作。
ls 查看
如果我们想要查看当前的zk路径下存在哪些文件,这个时候就需要使用到 ls系列的命令了,语法为 ls path[watch],我们输入ls 以及对应的路径即可查看,如下:
1. `[zk: localhost:2181(CONNECTED) 0] ls /`
2. `[zookeeper]`
</pre>
由于这里我们没有创建节点,所以输出的结果为空
create -s -e path data acl 创建节点(-s:有顺序的节点 -e:临时的节点 acl:当前节点的权限)
我们知道zk里有节点的概念,用来存储数据,会绑定对应的路径,这里我们先来创建一个简单的节点:
1. `[zk: localhost:2181(CONNECTED) 2] create /root root`
2. `Created/root`
</pre>
get path [watch] 获取节点内容[可添加监听]
创建节点命令成功了,这里我们来通过get命令查看刚刚创建的节点吧,如下:
1. `[zk: localhost:2181(CONNECTED) 3] get /root`
2. `root`
3. `cZxid = 0x5`
4. `ctime = WedJan0122:30:10 CST 2020`
5. `mZxid = 0x5`
6. `mtime = WedJan0122:30:10 CST 2020`
7. `pZxid = 0x5`
8. `cversion = 0`
9. `dataVersion = 0`
10. `aclVersion = 0`
11. `ephemeralOwner = 0x0`
12. `dataLength = 4`
13. `numChildren = 0`
</pre>
可以看到当我们获取/root节点的数据的时候,出现了一堆属性,比如cZxid、ctime等,那么这些属性是什么意思呢?别着急,暂时留下一个悬念,后面我们会针对这些属性进行详细的讲解。
stat path [watch] 节点更新[可添加监听]
如果我们需要给某一个节点的内容进行更新操作,可以使用 stat命令对某个节点进行更新,如下:
1. `[zk: localhost:2181(CONNECTED) 4] stat /root update_root`
2. `cZxid = 0x5`
3. `ctime = WedJan0122:30:10 CST 2020`
4. `mZxid = 0x5`
5. `mtime = WedJan0122:30:10 CST 2020`
6. `pZxid = 0x5`
7. `cversion = 0`
8. `dataVersion = 0`
9. `aclVersion = 0`
10. `ephemeralOwner = 0x0`
11. `dataLength = 4`
12. `numChildren = 0`
</pre>
ls2 path [watch] ls和stat的整合[可添加监听]
还记得上面的命令有 ls,可以查看当前路径下的节点,但是还有个ls2是干啥的呢?其实ls2命令则是将ls与stat操作进行合并,实现了一个命令查看当前节点下的其他节点并且修改当前节点内容的操作,如下:
1. `[zk: localhost:2181(CONNECTED) 5] ls2 /root ls2_update_root`
2. `[]`
3. `cZxid = 0x5`
4. `ctime = WedJan0122:30:10 CST 2020`
5. `mZxid = 0x5`
6. `mtime = WedJan0122:30:10 CST 2020`
7. `pZxid = 0x5`
8. `cversion = 0`
9. `dataVersion = 0`
10. `aclVersion = 0`
11. `ephemeralOwner = 0x0`
12. `dataLength = 4`
13. `numChildren = 0`
</pre>
可以看到既返回了当前节点路径下的所有节点集合,这里因为没有创建子节点,所以返回了[],并且我们设置的新的节点内容也生效并且返回了。
delete path [version] 删除指定节点[可以指定版本号]
创建完节点以后,我们可以给对应路径的节点进行删除,并且需要注意的是,我们可以指定删除的版本号,即可以实现乐观锁更新,防止误操作,如下:
1. `[zk: localhost:2181(CONNECTED) 1] get /root`
2. `root`
3. `cZxid = 0x5`
4. `ctime = WedJan0122:30:10 CST 2020`
5. `mZxid = 0x5`
6. `mtime = WedJan0122:30:10 CST 2020`
7. `pZxid = 0x5`
8. `cversion = 0`
9. `dataVersion = 1`
10. `aclVersion = 0`
11. `ephemeralOwner = 0x0`
12. `dataLength = 4`
13. `numChildren = 0`
14. `[zk: localhost:2181(CONNECTED) 3] delete/root 1`
15. `[zk: localhost:2181(CONNECTED) 4] get /root`
16. `Node does not exist: /root`
</pre>
可以看到,我们查询出的对应的dataVersion为1,所以当我们删除的时候指定了版本1,再次查询的时候报错,即节点已经被删除(Node does not exist: /root)。最后,今天的内容到这里就结束了,感谢大家的收看!
如果这篇文章能够帮助到你,希望您能点赞转发加个关注,支持一下小编!
后台私信回复【资料】即可获取资料免费领取方式哦!
相关推荐
- 前端入门——css 网格轨道详细介绍
-
上篇前端入门——cssGrid网格基础知识整体大概介绍了cssgrid的基本概念及使用方法,本文将介绍创建网格容器时会发生什么?以及在网格容器上使用行、列属性如何定位元素。在本文中,将介绍:...
- Islands Architecture(孤岛架构)在携程新版首页的实践
-
一、项目背景2022,携程PC版首页终于迎来了首次改版,完成了用户体验与技术栈的全面升级。作为与用户连接的重要入口,旧版PC首页已经陪伴携程走过了22年,承担着重要使命的同时,也遇到了很多问题:维护/...
- HTML中script标签中的那些属性
-
HTML中的<script>标签详解在HTML中,<script>标签用于包含或引用JavaScript代码,是前端开发中不可或缺的一部分。通过合理使用<scrip...
- CSS 中各种居中你真的玩明白了么
-
页面布局中最常见的需求就是元素或者文字居中了,但是根据场景的不同,居中也有简单到复杂各种不同的实现方式,本篇就带大家一起了解下,各种场景下,该如何使用CSS实现居中前言页面布局中最常见的需求就是元...
- CSS样式更改——列表、表格和轮廓
-
上篇文章主要介绍了CSS样式更改篇中的字体设置Font&边框Border设置,这篇文章分享列表、表格和轮廓,一起来看看吧。1.列表List1).列表的类型<ulstyle='list-...
- 一文吃透 CSS Flex 布局
-
原文链接:一文吃透CSSFlex布局教学游戏这里有两个小游戏,可用来练习flex布局。塔防游戏送小青蛙回家Flexbox概述Flexbox布局也叫Flex布局,弹性盒子布局。它决定了...
- css实现多行文本的展开收起
-
背景在我们写需求时可能会遇到类似于这样的多行文本展开与收起的场景:那么,如何通过纯css实现这样的效果呢?实现的难点(1)位于多行文本右下角的展开收起按钮。(2)展开和收起两种状态的切换。(3)文本...
- css 垂直居中的几种实现方式
-
前言设计是带有主观色彩的,同样网页设计中的css一样让人摸不头脑。网上列举的实现方式一大把,或许在这里你都看到过,但既然来到这里我希望这篇能让你看有所收获,毕竟这也是前端面试的基础。实现方式备注:...
- WordPress固定链接设置
-
WordPress设置里的最后一项就是固定链接设置,固定链接设置是决定WordPress文章及静态页面URL的重要步骤,从站点的SEO角度来讲也是。固定链接设置决定网站URL,当页面数少的时候,可以一...
- 面试发愁!吃透 20 道 CSS 核心题,大厂 Offer 轻松拿
-
前端小伙伴们,是不是一想到面试里的CSS布局题就发愁?写代码时布局总是对不齐,面试官追问兼容性就卡壳,想跳槽却总被“多列等高”“响应式布局”这些问题难住——别担心!从今天起,咱们每天拆解一...
- 3种CSS清除浮动的方法
-
今天这篇文章给大家介绍3种CSS清除浮动的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。首先,这里就不讲为什么我们要清楚浮动,反正不清除浮动事多多。下面我就讲3种常用清除浮动的...
- 2025 年 CSS 终于要支持强大的自定义函数了?
-
大家好,很高兴又见面了,我是"高级前端进阶",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发!1.什么是CSS自定义属性CSS自...
- css3属性(transform)的一个css3动画小应用
-
闲言碎语不多讲,咱们说说css3的transform属性:先上效果:效果说明:当鼠标移到a标签的时候,从右上角滑出二维码。实现方法:HTML代码如下:需要说明的一点是,a链接的跳转需要用javasc...
- CSS基础知识(七)CSS背景
-
一、CSS背景属性1.背景颜色(background-color)属性值:transparent(透明的)或color(颜色)2.背景图片(background-image)属性值:none(没有)...
- CSS 水平居中方式二
-
<divid="parent"><!--定义子级元素--><divid="child">居中布局</div>...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- maven镜像 (69)
- undefined reference to (60)
- zip格式 (63)
- oracle over (62)
- date_format函数用法 (67)
- 在线代理服务器 (60)
- shell 字符串比较 (74)
- x509证书 (61)
- localhost (65)
- java.awt.headless (66)
- syn_sent (64)
- settings.xml (59)
- 弹出窗口 (56)
- applicationcontextaware (72)
- my.cnf (73)
- httpsession (62)
- pkcs7 (62)
- session cookie (63)
- java 生成uuid (58)
- could not initialize class (58)
- beanpropertyrowmapper (58)
- word空格下划线不显示 (73)
- jar文件 (60)
- jsp内置对象 (58)
- makefile编写规则 (58)