写点什么

zookeeper 开山篇 - 编译安装与 zk 基础命令使用,实战篇

用户头像
Android架构
关注
发布于: 23 小时前


配置完毕后,我们来启动 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 源码的版本与之对应,点击下载:



下载完成后,我们将其解压,开始配置环境变量,例如:


ANT_HOME=E:\apache-ant-1.10.5


并且我们需要在全局的 path 路径下添加一个**%ANT_HOME%\bin** ,配置完毕后,我们进入 cmd 窗口,执行如下命令:


C:\Users\Administrator>ant -versionApache Ant(TM) version 1.10.7 compiled on September 1 2019


可以看到成功返回了 ant 的版本信息,代表此时配置已经成功


2.进入 github 进行下载,我们找到当前所有的branchs:



找到我们需要版本的分支,进行 git 下载:


$ git clone -b branch-3.5.6 https://github.com/apache/zookeeper.gitCloning into 'zookeeper'...remote: Enumerating objects: 1, done.remote: Counting objects: 100% (1/1), done.remote: Total 59332 (delta 0), reused 0 (delta 0), pack-reused 59331Receiving objects: 100% (59332/59332), 113.97 MiB | 41.00 KiB/s, done.Resolving deltas: 100% (38347/38347), done.


3.进入刚才下载的 zk 源码目录,启动 cmd 窗口,输入编译命令


G:\开发软件>cd zk-3.5.6G:\开发软件\zk-3.5.6>cd apache-zookeeper-3.5.6G:\开发软件\zk-3.5.6\apache-zookeeper-3.5.6>ant eclipse


然后等待最终编译成功输出,如果为 build successful 字样则为成功


![build success](img/build success.png)


接下来,我们将代码导入开发工具(官方使用的是 eclipse,这里我们使用 ieda),



一路 next,最后将 maven 编译完成,即可完成源码的编译,我们可以看到源码的目录如下:



而加载完毕后,我们可以看到,zk3.5 版本起,官方将模块分离出来了,多出了很多的子模块,比如文档说明相关在zookeeper-docs工程下,而 zk 的一些基础数据结构类定义相关则在zookeeper-jute工程下,而 zk 的客户端和服务端相关的代码则是分别在zookeeper-clientzookeeper-server工程下,而在 server 工程下我们可以找到两个启动类: ZooKeeperServerMain以及QuorumPeerMain,分别位于 org.apache.zookeeper.server org.apache.zookeeper.server.quorum 包下,其中单机版的 zk 使用ZooKeeperServerMain作为启动类,集群版的 zk 使用QuorumPeerMain启动类。现在我们尝试启动单机版的 zk,运行ZooKeeperServerMain类,结果如下:


错误: 找不到或无法加载主类 org.apache.zookeeper.server.ZooKeeperServerMain


这是怎么回事呢?难道是 jdk 版本不对?但是我们查阅了官网,zk3.5.x 版本对应的 jdk 的确是 1.8,那么只有一种可能就是编译出来的 class 不是当前 jdk 编译的,我们这里选择将zookeeper-server的工程重新编译一下:



却看到 compile 的时候控制台报错了,如下:


[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 -> [Help 1]


看报错的原因,似乎是有部分代码使用了 resources\git.properties 文件的配置,但是我们找了一下,在 github 上的代码中不会存在 git.properties,那么是哪里出问题了呢?我们来到 pom 中找到了properties-maven-plugin插件,看到了如下的配置:


<plugin><groupId>org.codehaus.mojo</groupId><artifactId>properties-maven-plugin</artifactId><executions><execution><phase>initialize</phase><goals><goal>read-project-properties</goal></goals><configuration><files><file>${basedir}/src/main/resources/git.properties</file></files></configuration></execution></executions></plugin>


原来是这里初始化的时候会加载该配置文件的内容,除此之外我们还注意到一个插件exec-maven-plugin,里面使用了部分参数在项目中并不存在,应该是引用了 git.properties 的配置参数导致了 pom 报错,并且初始化编译失败,如下:


<plugin><groupId>org.codehaus.mojo</groupId><artifactId>exec-maven-plugin</artifactId><executions><execution><id>generate-version-info</id><phase>generate-sources</phase><goals><goal>exec</goal


《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
浏览器打开:qq.cn.hn/FTe 免费领取
复制代码



</goals><configuration><workingDirectory>{project.version}</argument><argument>{build.time}</argument></arguments></configuration></execution></executions></plugin><plugin>


并且我们也可以看到,这里需要这些参数的原因是为了配置 VerGen 的版本、时间等参数,查阅官方 github 才知道,VerGen 仅仅是为了开发迭代的时候区分每个人的版本不重复冲突使用的,我们个人运行和查阅源码可以选择固定一个值,所以接下来我们来将properties-maven-plugin插件注释掉,并且将 ${git.commit.id}与


${build.time}两个参数改为自己的值,然后我们再次执行 mvn compile 命令,此次编译成功!再次运行 main 方法,发现控制台出现了新的问题,输入如下:


log4j:WARN No appenders could be found for logger (org.apache.zookeeper.jmx.ManagedUtil).log4j:WARN Please initialize the log4j system properly.log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.Usage: ZooKeeperServerMain configfile | port datadir [ticktime] [maxcnxns]


但是我们当前的启动类没有配置 log4j,导致无法输出对应的日志信息,我们找到当前 test 包下的 resources 里面的 log4j.properties 文件,在当前启动类配置上对应的文件目录(vm options):


-Dlog4j.configuration=file:G:\开发软件\zookeeper-release-3.5.6\zookeeper-server\src\test\resources\log4j.properties


再次运行,发现启动报错了:


2020-01-07 01:28:48,727 [myid:] - ERROR [main:ZooKeeperServerMain@66] - Invalid arguments, exiting abnormallyjava.lang.IllegalArgumentException: Invalid number of arguments:[]at org.apache.zookeeper.server.ServerConfig.parse(ServerConfig.java:60)at org.apache.zookeeper.server.ZooKeeperServerMain.initializeAndRun(ZooKeeperServerMain.java:103)at org.apache.zookeeper.server.ZooKeeperServerMain.main(ZooKeeperServerMain.java:64)2020-01-07 01:28:48,729 [myid:] - INFO [main:ZooKeeperServerMain@67] - Usage: ZooKeeperServerMain configfile | port datadir [ticktime] [maxcnxns]


从报错信息可以得出,我们需要一个运行时传递的参数,但是没有配置,而这个参数就是我们启动服务的时候需要修改的 zoo.cfg 文件,再次配置修改完毕(上面启动用的 zoo.cfg)的文件,如下:



这时我们再次运行,即可成功启动 zk 的单机服务!

cli 常用命令

zk 服务端启动以后,我们来开始学习 zk 客户端命令,首先双击zkCli.cmd,会默认进行本地的 zk 连接操作,如下:



help


我们先来看看 zk 有哪些命令操作,在 cmd 窗口中输入help命令回车,即可查看到 zk 当前支持的所有的命令,如下:


[zk: localhost:2181(CONNECTED) 0] helpZooKeeper -server host:port cmd argsstat path [watch]set path data [version]ls path [watch]delquota [-n|-b] pathls2 path [watch]setAcl path aclsetquota -n|-b val pathhistoryredo cmdnoprintwatches on|offdelete path [version]sync pathlistquota pathrmr pathget path [watch]create [-s] [-e] path data acladdauth scheme authquitgetAcl pathcloseconnect host:port


接下来我们来学习常见的一些命令操作


ls 查看


如果我们想要查看当前的 zk 路径下存在哪些文件,这个时候就需要使用到ls系列的命令了,语法为ls path [watch],我们输入 ls 以及对应的路径即可查看,如下:

用户头像

Android架构

关注

还未添加个人签名 2021.10.31 加入

还未添加个人简介

评论

发布
暂无评论
zookeeper开山篇-编译安装与zk基础命令使用,实战篇