今天启动zookeeper的时候,发现怎么zookeeper集群启动不起来了,一共三台机器,用脚本启动只有一台启动成功了,真的是怪了。遇到问题不慌不忙,去看日志
java.lang.RuntimeException: My id 0 not in the peer list
at org.apache.zookeeper.server.quorum.QuorumPeer.startLeaderElection(QuorumPeer.java:674)
at org.apache.zookeeper.server.quorum.QuorumPeer.start(QuorumPeer.java:593)
at org.apache.zookeeper.server.quorum.QuorumPeerMain.runFromConfig(QuorumPeerMain.java:164)
at org.apache.zookeeper.server.quorum.QuorumPeerMain.initializeAndRun(QuorumPeerMain.java:111)
at org.apache.zookeeper.server.quorum.QuorumPeerMain.main(QuorumPeerMain.java:78)
看了一下原来是我的myid出了问题,说是0不在列表中,估计是配错了或者什么问题。
其实问题还是比较容易解决的,我去看了看132这台机器的myid确实是0,那么他不在列表中应该看一下zoo.conf的配置是不是出了什么问题。
通过看zoo.conf发现,原来我在配集群的时候,设置的是server.2=hadoop132:2888:3888给的服务器号是2,那么肯定会出错了。最后将集群中的myid与zoo.conf的配置相互对应集群顺利的启动起来了。
最玄学的是这个集群我搭起来用了几次了,没出现过问题,今天就出现这个问题,好玄学…
既然在搭集群的时候出现的问题,就在回顾回顾zookeeper的集群搭建吧
首先分三台机器,我们先去安装一台机器,然后在分发到其他机器中,进行修改即可
tar -zxvf zookeeper-3.4.10.tar.gz -C /opt/module/
将zookpeer/conf这个路径下的zoo.sample.cfg修改为zoo.conf
mv zoo_sample.cfg zoo.cfg
并修改zoo.conf文件,即将dataDir的目录修改一下,并添加配置
dataDir=/opt/module/zookeeper-3.4.10/zkData
# 在最后添加
#######################cluster##########################
server.2=hadoop132:2888:3888
server.3=hadoop133:2888:3888
server.4=hadoop134:2888:3888
要在你指定的这个目录下创建zkData这个文件夹
mkdir zkData
还有在配置集群配置中,是什么意思呢
其实是这样的,server.A=B:C:D。
A是一个数字,表示这个是第几号服务器;(2 3 4是随便的,只要不同就可以)
集群模式下配置一个文件myid,这个文件在dataDir目录下,这个文件里面有一个数据就是A的值,Zookeeper启动时读取此文件,拿到里面的数据与zoo.cfg里面的配置信息比较从而判断到底是哪个server。
B是这个服务器的地址;
C是这个服务器Follower与集群中的Leader服务器交换信息的端口;
D是万一集群中的Leader服务器挂了,需要一个端口来重新进行选举,选出一个新的Leader,而这个端口就是用来执行选举时服务器相互通信的端口。
还有一步就是创建相应的myid文件,我们在zkData目录下创建myid,里面就添加一个2
vim myid
# 添加
2
完成上面后,还要修改zookpeer的日志文件的目录,zookpeer默认是将日志问题放在启动的当前目录,我们为了好查看日志,就将日志的存放目录进行修改,修改在zookpeer/bin/下的zkEnv.sh文件
vim /zookeeper-3.4.13/bin/zkEnv.sh
# 修改位置在56行
if [ "x${ZOO_LOG_DIR}" = "x" ]
then
##修改日志的目录
ZOO_LOG_DIR="/opt/module/zookeeper-3.4.10/logs"
fi
if [ "x${ZOO_LOG4J_PROP}" = "x" ]
then
##修改为INFO,ROLLINGFILE
ZOO_LOG4J_PROP="INFO,ROLLINGFILE"
fi
这个路径也是要提前创建好的
将132机器上配置好的zookeeper分发到其他两台机器上,并修改响应的myid即可。
我们在每台机器上运行
bin/zkServer.sh start
# 查看zookeeper的运行状态
bin/zkServer.sh status
其实也可以通过脚本来实现一键群起,不需要一个一个启动
# 这里我采用读hadoop中slave里面的机器地址,也可以自己随便建立一个文件,只要存放分发机器的地址即可
for i in `cat /opt/module/hadoop-2.7.2/etc/hadoop/slaves`
do
echo "========== $i =========="
ssh $i 'source /etc/profile;/opt/module/zookeeper-3.4.10/bin/zkServer.sh start'
done