现在,我的集群中的ZooKeeper是好的。
启动看一下,
在看一下状态,
我先快照一下,做一个备份。
下面来复现一下当时遇到的问题。
先看一下成功时的文件状态吧。
会有一个zookeeper.out的文件出现在三台机器的普通用户的目录下,这个文件是在第一次启动ZooKeeper后出现的。并且可以看到这个文件的权限是归当前这个普通用户所有的。
下面我们把这个zookeeper.out的文件删掉,来模拟如果第一次启动时,使用的是root用户,会出现什么效果。
我们先只删一台机器上的zookeeper.out文件试试。
然后开始启动试试,
第一次启动时,是好的。
现在来看一下文件的状态。
zookeeper.out的文件的权限发生了改变。
这就是问题所在了,如标题所示【第一次启动使用ZooKeeper时,没注意用root用户启动了,生成的zookeeper.out文件权限就会改变,如果之后再使用普通用户去启动的话就会没有权限】
但,当时如果没有注意到使用的用户不对的话,去查看ZooKeeper的状态是,看不出来问题的,
好的。现在我们关闭ZooKeeper,来模拟第二次启动时的状态。因为第二次没有注意到之前的问题,启动肯定会是去用普通用户去启动的。
好,那我们用普通用户来启动zookeeper的话。
确实,出现了问题。
但要是再来个小技巧,换一个目录去启动zookeeper,
Zookeeper便又可以启动了,只是生成的文件出现在了,启动Zookeeper时所使用的目录下。
解决问题:
至于这个问题如何解决就显而易见了,删掉zookeeper.out文件或者修改权限就可以了。
但是,我们发现启动Zookeeper时,Zookeeper的日志文件会生成在所执行启动的命令文件目录下,这会让文件不好管理。所以我们需要从根本解决问题,指定zookeeper.out的文件位置。zookeeperk运行日志zookeeper.out位置修改
修改配置文件 bin/zkEnv.sh 和 conf/log4j.properties 的内容。
# 以下是原配置
zookeeper.root.logger=INFO, CONSOLE
log4j.appender.ROLLINGFILE=org.apache.log4j.RollingFileAppender
# 以下是修改后配置
zookeeper.root.logger=INFO, ROLLINGFILE
log4j.appender.ROLLINGFILE=org.apache.log4j.RollingFileAppender
# 以下是原配置
if [ "x${ZOO_LOG_DIR}" = "x" ]
then
ZOO_LOG_DIR="."
fi
if [ "x${ZOO_LOG4J_PROP}" = "x" ]
then
ZOO_LOG4J_PROP="INFO,CONSOLE"
fi
# 以下是修改后配置
if [ "x${ZOO_LOG_DIR}" = "x" ]
then
ZOO_LOG_DIR="/usr/local/app/zookeeper-3.4.13/zooLogDir"
fi
if [ "x${ZOO_LOG4J_PROP}" = "x" ]
then
ZOO_LOG4J_PROP="INFO,ROLLINGFILE"
fi
上述两个文件修改后,重新启动服务,zk会将日志文件保存到/usr/local/app/zookeeper-3.4.13/zooLogDir目录下,并且文件名为log4j.properties文件中配置的zookeeper.log