一、问题
1.1、环境
电脑环境:Windows 7;
开发工具:Eclipse 4.6.3;
数据库环境:Oracle 11g;
JDK环境: Jdk1.8;
Maven环境:Maven3.5.0;
GIT版本:Version 2.48.02;
Docker版本:Server Version: 19.03.3
zookeeper版本:3.5.6
1.2、问题
使用zookeeper已经有一段时间了,那么如何安装和调试呢?
二、解答
2.1、操作步骤;
1.zookeeper官网地址:官网
2.zookeeper镜像压缩包下载地址:镜像下载地址
这里有一个坑,就是一定要下载带bin字样的安装包:
不然项目下载下来会有如下报错,因为这里有两个下载包,从目前的最新版本3.5.5开始,带有bin名称的包才是我们想要的下载可以直接使用的里面有编译后的二进制的包,而之前的普通的tar.gz的包里面是只是源码的包无法直接使用。原因详见:
3、在安装的zookeeper目录下的bin目录同级目录下新增data和log目录(文件夹);从来存放数据和日志;
4、复制zoo_sample.cfg文件,然后改名为zoo.cfg,然后修改zoo.cfg配置文件;加入你刚才新增的data目录和log目录地址;注意【正斜杠】和【反斜杠】;
5、为避免不必要的麻烦,我们使用管理员运行cmd;
然后再cd到你安装路径下面的bin目录下,运行zkServer.cmd;
运行没有报错,很好,然后我又开了一个cmd(管理员身份运行)运行监听脚本zkCli.cmd:
二、集群伪分布模式
例如我们要部署3台服务器:我们在data目录下分别新增d_1,d_2,d_3三个子目录,用来存放数据;
1、复制zoo.cfg3份,分别命名为zoo1.cfg,zoo2.cfg,zoo3.cfg;
①、zoo1.cfg配置文件:
②、zoo2.cfg配置文件:
③、zoo3.cfg配置文件:
2、修改zkServer.cmd三份,分别命名为zkServer1.cmd,zkServer2.cmd,zkServer31.cmd;
然后修改内容如下:
①、zkServer1.cmd内容
②、zkServer2.cmd内容
③、zkServer3.cmd内容
3、启动,用【管理员身份】运行cmd,然后cd到zookeeper目录下,分别运行zkServer1.cmd,zkServer2.cmd,zkServer3.cmd;但是这里报错了:
仔细看这里的报错日志:
2019-12-19 13:43:30,837 [myid:] - WARN [main:VerifyingFileFactory@59] - …\conf\zoo1.cfg is relative. Prepend .\ to indicate that you’re sure!
2019-12-19 13:43:30,842 [myid:] - INFO [main:QuorumPeerConfig@385] - clientPortAddress is 0.0.0.0/0.0.0.0:2181
2019-12-19 13:43:30,843 [myid:] - INFO [main:QuorumPeerConfig@389] - secureClientPort is not set
2019-12-19 13:43:30,864 [myid:] - ERROR [main:QuorumPeerMain@89] - Invalid config, exiting abnormally
org.apache.zookeeper.server.quorum.QuorumPeerConfig$ConfigException: Error processing …/conf/zoo1.cfg
他的意思是:
1)、安全客户端端口号没有设置;
2)、不存在的配置,退出异常,使用…/conf/zoo1.cfg配置异常;
这里的思路有两个,一是如何配置安全端口号(secureClientPort);二是,排查zoo1.cfg配置文件;
我们通过查阅别的资料,发现secureClientPort is not set没有问题,其他人正常启动也会有这句日志,那我们先忽略第1点;然后看第2点;排查zoo1.cfg配置文件;我们使用的是zkServer1.cmd,看日志,zkServer1.cmd也找到了zoo1.cfg这个配置文件,然后很大可能就是zoo1.cfg的配置问题了;
①、我们先将clientPort的端口号改成2199,但是也报错了:
然后我们就排除端口号占用的问题;而且,如果是端口号冲突,应该是Address is alreadly in use;这样的报错才对;
②、我注释掉了server.2和server.3;然后再次启动,发现可以启动:
所以,这里是因为【伪分布式】配置IP地址导致的错误;然后这个报文下面又报了另外一个错误:
我们先保留这个问题,标记为【Question1】;稍后解决;回到刚才的问题,【伪分布式】端口号一样,为什么就启动不了呢?
③、我们把localhost改成了127.0.0.1,还是一样的错误:
日志报文:
这说明localhost和127.0.0.1是无差别读取的;排除这个原因;
④、后来去网上查了一下原因,说在zookeeper下,新增的data文件夹里,要自己手动新增一个myid文件(没有任何后缀),myid里的值唯一标识了一天zookeeper;因为我们配置了3台【伪分布式】zookeeper地址,并且在zookeeper目录下的data文件夹里新增了d_1,d_2,d_3三个文件夹,所以我们需要在这3个文件夹里都放myid文件,里面的值分别填写为1,2,3,用来区分不同的zookeeper;
但是执行的时候还是报错:
java.io.IOException: No snapshot found, but there are log entries. Something is broken!
然后查找原因发现,我们做【伪分布式】集群的时候,data文件里建立了三个目录d_1,d_2,d_3;但是log用的还是老的,这个就是导致上面IOException的原因,专款专用,不同的zookeeper,需要用不同的data目录,用不同的log目录,不然3台zookeeper的日志会串掉的;所以将zoo1.cfg,zoo2.cfg,zoo3.cfg里的日志输出地址改成新的目录即可:
然后启动第1台服务器的时候包连接拒绝,这个也不要怕,因为是集群,必须3台服务器都起来才能通信,所以,我们用【管理员身份】启动3个cmd窗口,然后就不报错了;
全篇结束;
三、总结
欢迎关注我的
CSDN博客: https://blog.csdn.net/River_Continent
微信公众号:幕桥社区
* 知乎:张牧野, https://www.zhihu.com/people/zhang-mu-ye-37-76/activities
* 简书: https://www.jianshu.com/u/02c0096cbfd3
参考博客:
冰冷的梦境
win 系统下 zookeeper 启动不了
平常心