最近刚好重新安装了zookeeper集群,记个笔记,供参考。
安装步骤记录如下:
环境
zookeeper版本:3.4.6,集群 节点个数 3
1.准备工作
下载linux版本 zookeeper3.4.6(官网:http://zookeeper.apache.org/),复制到所有机器上,tar命令解压
2.修改配置
zoo.cfg配置
定位到zookeeper的conf文件夹下,从zoo_sample.cfg复制一个文件,并重命名为zoo.cfg
修改zoo.cfg的配置项,以下是几个比较重要的配置项
tickTime=2000 tick单位的时间,毫秒为单位,之后的zookeeper配置一般都是以多少多少个tick为单位 syncLimit=5 是指follower与leader的心跳时间为5个tick dataDir=/data0/zookeeper/bins_datas/zookeeper dataLogDir=/data0/logs/zookeeper/zookeeper-3.4.6
dataLogDir如果没提供的话使用的则是dataDir。zookeeper的持久化都存储在这两个目录里。dataLogDir里是放到的顺序日志(WAL)(注意与程序的log日志不一样,WAL(Write-Ahead-Log) 参考 http://www.wuzesheng.com/?p=2609)。而dataDir里放的是内存数据结构的snapshot,便于快速恢复。为了达到性能最大化,一般建议把dataDir和dataLogDir分到不同的磁盘上,这样就可以充分利用磁盘顺序写的特性。
clientPort=2181 zookeeper服务的监听端口
maxClientCnxns=60 一个zookeeper节点接受的设置,每个客户端能连接的最大连接数
server.1=node1.zk.service.basic.fdd:2888:3888
server.2=node2.zk.service.basic.fdd:2888:3888
server.3=node3.zk.service.basic.fdd:2888:3888
集群的所有节点配置,注意server.num数字后续会用到,要确保集群中所有节点对应数字唯一
上面的配置中有两个TCP port。后面一个是用于Zookeeper选举用的,而前一个是Leader和Follower或Observer交换数据使用的。
myid配置
dataDir中创建一个myid文件,名字就叫myid,文件的内容与zoo.cfg中的server.num的num保持一致
比如对于zk node1 ,执行echo "1" > dataDir/myid
3.配置完成之后,进入zk bin目录,执行 ./zkServer.sh start 启动zookeeper。
zookeeper log4j日志配置
背景知识:配置根Logger:
log4j.rootLogger = [ level ] , appenderName1, appenderName2, …
log4j.additivity.org.apache=false:表示Logger不会在父Logger的appender里输出,默认为true。
level :设定日志记录的最低级别,可设的值有OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者自定义的级别,Log4j建议只使用中间四个级别。通过在这里设定级别,您可以控制应用程序中相应级别的日志信息的开关,比如在这里设定了INFO级别,则应用程序中所有DEBUG级别的日志信息将不会被打印出来。
appenderName:就是指定日志信息要输出到哪里。可以同时指定多个输出目的地,用逗号隔开。
例如:log4j.rootLogger=INFO,A1,B2,C3
1.修改log4j.properties
Appender修改(输出日志到file文件)
更改方式:
1.log4j.rootLogger=DEBUG, CONSOLE, ROLLINGFILE ## 将日志修改输出到CONSOLE以及日志文件中
注意此处,不要直接使用变量log4j.rootLogger=${zookeeper.root.logger},然后修改变量${zookeeper.root.logger},该变量会在zkServer.sh脚本中被重写为INFO, CONSOLE,修改变量是不能写日志到log4j配置的文件中的。
ROLLINGFILE日志级别修改
ROLLINGFILE的日志级别可以修改变量${zookeeper.log.threshold},或者直接log4j.appender.ROLLINGFILE.Threshold=DEBUG修改成你需要的级别
日志路径修改
直接修改${zookeeper.log.dir}也不生效,该变量在zkEnv环境中会被直接覆盖
有两种方式修改
1.修改zkEnv.sh脚本
if [ "x${ZOO_LOG_DIR}" = "x" ]
then
ZOO_LOG_DIR="."
fi
更新为
if [ "x${ZOO_LOG_DIR}" = "x" ]
then
ZOO_LOG_DIR="your own path"
fi
2.log4j.properties 修改如下
log4j.appender.ROLLINGFILE.File=${zookeeper.log.dir}/${zookeeper.log.file} 更新为
log4j.appender.ROLLINGFILE.File=yourpath/${zookeeper.log.file}
去掉zookeeper.out文件输出
1.尝试log4j.rootLogger=DEBUG, ROLLINGFILE
发现虽然zookeeper.out虽然没有输出,但是还是会生成zookeeper.out文件
修改zkServer.sh文件
start)
...
nohup "$JAVA" "-Dzookeeper.log.dir=${ZOO_LOG_DIR}" "-Dzookeeper.root.logger=${ZOO_LOG4J_PROP}" \
-cp "$CLASSPATH" $JVMFLAGS $ZOOMAIN "$ZOOCFG" > "$_ZOO_DAEMON_OUT" 2>&1 < /dev/null &
更新为
start)
...
nohup "$JAVA" "-Dzookeeper.log.dir=${ZOO_LOG_DIR}" "-Dzookeeper.root.logger=${ZOO_LOG4J_PROP}" -cp "$CLASSPATH" $JVMFLAGS $ZOOMAIN "$ZOOCFG" > /dev/null 2>&1 &
启动zookeeper
进入zookeeper的bin目录
./zkServer.sh start
./zkServer.sh stop
./zkServer.sh restart
查看zookeeper端口以及日志确认zookeeper是否正常启动即可。