一、问题
1.1、环境
电脑环境:Windows 7;
JDK环境: Jdk1.8;
zookeeper版本:3.5.6
1.2、问题
使用zookeeper已经有一段时间了,那么如何安装和调试呢?
二、解答
2.1、操作步骤;
1.zookeeper官网地址:官网
2.zookeeper镜像压缩包下载地址:镜像下载地址
这里有一个坑,就是一定要下载带bin字样的安装包:不然项目下载下来会有如下报错,因为这里有两个下载包,从目前的最新版本3.5.5开始,带有bin名称的包才是我们想要的下载可以直接使用的里面有编译后的二进制的包,而之前的普通的tar.gz的包里面是只是源码的包无法直接使用。原因详见:
二、集群伪分布模式 例如我们要部署3台服务器:我们在data目录下分别新增d_1,d_2,d_3三个子目录,用来存放数据;
1、复制zoo.cfg3份,分别命名为zoo1.cfg,zoo2.cfg,zoo3.cfg;
2、修改zkServer.cmd三份,分别命名为zkServer1.cmd,zkServer2.cmd,zkServer31.cmd; 然后修改内容如下:
①、zkServer1.cmd内容
②、zkServer2.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的配置问题了;
然后我们就排除端口号占用的问题;而且,如果是端口号冲突,应该是Address is alreadly in use;这样的报错才对;
这说明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; 但是执行的时候还是报错:
<pre spellcheck="false" class="md-fences md-end-block ty-contain-cm modeLoaded" lang="" contenteditable="true" cid="n20" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: var(--monospace); font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; white-space: normal; background-image: inherit; background-position: inherit; background-size: inherit; background-repeat: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(255, 255, 255); position: relative !important; width: inherit; color: rgb(51, 51, 51); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">java.io.IOException: No snapshot found, but there are log entries. Something is broken!</pre>
然后查找原因发现,我们做【伪分布式】集群的时候,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 微信公众号:幕桥社区