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 插件注释掉,并且将
g
i
t
.
c
o
m
m
i
t
.
i
d
与
{git.commit.id}与
git.commit.id与{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`
有创建子节点,所以返回了[],并且我们设置的新的节点内容也生效并且返回了。
> delete path [version] 删除指定节点[可以指定版本号]
创建完节点以后,我们可以给对应路径的节点进行删除,并且需要注意的是,我们可以指定删除的版本号,即可以实现乐观锁更新,防止误操作,如下:
-
[zk: localhost:2181(CONNECTED) 1] get /root -
root -
cZxid = 0x5 -
ctime = WedJan0122:30:10 CST 2020 -
mZxid = 0x5
|