Zookeeper 安装使用
简介
Apache ZooKeeper是Apache软件基金会的一个软件项目,他为大型分布式计算提供开源的分布式配置服务、同步服务和命名注册。ZooKeeper曾经是Hadoop的一个子项目,但现在是一个独立的顶级项目。
用例
安装部署
下载
https://zookeeper.apache.org/releases.html#download
配置说明
zookeeper的默认配置文件为zookeeper/conf/zoo_sample.cfg,需要将其修改为zoo.cfg。其中各配置项的含义,解释如下:
- tickTime:Client-Server通信心跳时间
Zookeeper 服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个 tickTime 时间就会发送一个心跳。tickTime以毫秒为单位。
tickTime=2000
- initLimit:Leader-Follower初始通信时限
集群中的follower服务器(F)与leader服务器(L)之间初始连接时能容忍的最多心跳数(tickTime的数量)。
initLimit=5
- syncLimit:Leader-Follower同步通信时限
集群中的follower服务器与leader服务器之间请求和应答之间能容忍的最多心跳数(tickTime的数量)。
syncLimit=5
Zookeeper 保存数据的目录,默认情况下,Zookeeper将写数据的日志文件也保存在这个目录里。
dataDir=/tmp/zookeeper
Zookeeper 日志数据的目录,默认情况下,Zookeeper将日志文件保存在这个目录里。
dataLogDir=/var/lib/zookeeper/dataLog/log
客户端连接 Zookeeper 服务器的端口,Zookeeper 会监听这个端口,接受客户端的访问请求。
clientPort=2181
- maxClientCnxns:客户端连接的最大数量
disable the per-ip limit on the number of connections since this is a non-production config
客户端连接的最大数量,如果你需要处理更多的客户,就增加该值。
maxClientCnxns=60
- autopurge.snapRetainCount:在DATADIR中保留的快照数量
autopurge.snapRetainCount=3
- autopurge.purgeInterval:清理任务间隔
设置0
禁用自动清除功能
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1
- 服务器名称与地址:集群信息(服务器编号,服务器地址,LF通信端口,选举端口)
这个配置项的书写格式比较特殊,规则如下:
server.N=YYY:A:B
server.1=zk-1:2888:3888
server.2=zk-2:2888:3888
server.3=zk-3:2888:3888
ZK 为什么设置奇数个
zookeeper有这样一个特性:集群中只要有过半的机器是正常工作的,那么整个集群对外就是可用的。也就是说如果有2个zookeeper,那么只要有1个死了zookeeper就不能用了,因为1没有过半,所以2个zookeeper的死亡容忍度为0;同理,要是有3个zookeeper,一个死了,还剩下2个正常的,过半了,所以3个zookeeper的容忍度为1;同理你多列举几个:2 -> 0; 3 -> 1; 4 - >1; 5 -> 2; 6 -> 2会发现一个规律,2n和2n-1的容忍度是一样的,都是n-1,所以为了更加高效,何必增加那一个不必要的zookeeper呢。
单节点环境
yum install -y jdk
cd /usr/local/src/
tar -zxvf zookeeper-3.4.12.tar.gz -C /usr/local/src/zookeeper-3.4.12
cd /usr/local/src/zookeeper-3.4.12/conf
mv zoo_sample.cfg zoo.cfg
tickTime=2000
maxClientCnxns=0
dataDir=/var/lib/zookeeper/data
dataLogDir=/var/lib/zookeeper/dataLog
clientPort=2181
mkdir /var/lib/zookeeper/data
mkdir /var/lib/zookeeper/dataLog
集群环境
cd /usr/local/src/
tar -zxvf zookeeper-3.4.12.tar.gz
将文件conf/zoo_sample.cfg
改为conf/zoo.cfg
mv zoo_sample.cfg zoo.cfg
dataDir=/var/lib/zookeeper/data
dataLogDir=/var/lib/zookeeper/dataLog
maxClientCnxns=0
server.1=zk-1:2888:3888
server.2=zk-2:2888:3888
server.3=zk-3:2888:3888
mkdir /var/lib/zookeeper/data
mkdir /var/lib/zookeeper/dataLog
- 在
dataDir=/var/local/zookeeper
创建一个myid文件,里面内容是server.N中的N(server.2里面内容为2)
echo "1" > myid
将配置好的zk拷贝到其他节点:
scp -r zookeeper-3.4.12/ zk-2:/usr/local/src/zookeeper-3.4.12/
scp -r zookeeper-3.4.12/ zk-3:/usr/local/src/zookeeper-3.4.12/
注意:在其他节点上一定要修改myid的内容
在zk-2应该讲myid的内容改为2
echo "2" > myid
在zk-3应该讲myid的内容改为3
echo "3" > myid
vim /etc/profile
-----------------------------------------
# Zookeeper
export ZOOKEEPER_HOME=/usr/local/src/zookeeper-3.4.12
export PATH=:$ZOOKEEPER_HOME/bin$PATH
-----------------------------------------
source环境参数
source /etc/profile
zk 管理命令
管理命令
# 启动
$ bin/zkServer.sh start
# 查看状态
$ bin/zkServer.sh status
# 停止服务
$ bin/zkServer.sh stop
# 重启
$ bin/zkServer.sh restart
# 以输出日志方式启动
$ bin/zkServer.sh start-foreground
zk的datalog数据怎么清除
cd ./zk/bin
./zkCleanup.sh -n 3 # 3表示保留最近的3个日志文件.
客户端命令
ZooKeeper命令行工具类似于Linux的shell环境,不过功能肯定不及shell啦,但是使用它我们可以简单的对ZooKeeper进行访问,数据创建,数据修改等操作. 使用 zkCli.sh -server 127.0.0.1:2181 连接到 ZooKeeper 服务,连接成功后,系统会输出 ZooKeeper 的相关环境以及配置信息。
命令行工具的一些简单操作如下:
- 显示根目录下、文件: 使用 ls 命令来查看当前 ZooKeeper 中所包含的内容
ls /
- 显示根目录下、文件: 查看当前节点数据并能看到更新次数等数据
ls2 /
- 创建文件,并设置初始内容: 创建一个新的 znode节点
zk
以及与它关联的字符串
create /zk "test"
- 获取文件内容: 确认 znode 是否包含我们所创建的字符串
get /zk
set /zk "zkbak"
delete /zk
quit
help
常用四字命令
来查看哪个节点被选择作为follower或者leader:
echo stat | nc 127.0.0.1 2181
测试是否启动了该Server,若回复imok表示已经启动:
echo ruok | nc 127.0.0.1 2181
列出未经处理的会话和临时节点:
echo dump | nc 127.0.0.1 2181
关掉server:
echo kill | nc 127.0.0.1 2181
输出相关服务配置的详细信息:
echo conf | nc 127.0.0.1 2181
列出所有连接到服务器的客户端的完全的连接 / 会话的详细信息:
echo cons | nc 127.0.0.1 2181
输出关于服务环境的详细信息(区别于 conf 命令)
echo envi | nc 127.0.0.1 2181
列出未经处理的请求
echo reqs | nc 127.0.0.1 2181
列出服务器 watch 的详细信息
echo wchs | nc 127.0.0.1 2181
通过 session 列出服务器 watch 的详细信息,它的输出是一个与 watch 相关的会话的列表
echo wchc | nc 127.0.0.1 2181
通过路径列出服务器 watch 的详细信息。它输出一个与 session 相关的路径
echo wchp | nc 127.0.0.1 2181
工具
https://github.com/XiaoMi/shepher/blob/master/README-zh.md
https://github.com/zifangsky/zkui/releases
排错
数据目录异常导致启动失败
zookeeper 错误日志:
2018-06-27 19:37:47,543 [myid:2] - INFO [main:FileSnap@83] - Reading snapshot /data/bkce/public/zk/data/version-2/snapshot.d0010eac6
2018-06-27 19:37:47,557 [myid:2] - ERROR [main:QuorumPeer@648] - Unable to load database on disk
java.io.IOException: The accepted epoch, e is less than the current epoch, f
at org.apache.zookeeper.server.quorum.QuorumPeer.loadDataBase(QuorumPeer.java:645)
at org.apache.zookeeper.server.quorum.QuorumPeer.start(QuorumPeer.java:591)
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)
2018-06-27 19:37:47,558 [myid:2] - ERROR [main:QuorumPeerMain@89] - Unexpected exception, exiting abnormally
java.lang.RuntimeException: Unable to run quorum server
at org.apache.zookeeper.server.quorum.QuorumPeer.loadDataBase(QuorumPeer.java:649)
at org.apache.zookeeper.server.quorum.QuorumPeer.start(QuorumPeer.java:591)
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)
Caused by: java.io.IOException: The accepted epoch, e is less than the current epoch, f
at org.apache.zookeeper.server.quorum.QuorumPeer.loadDataBase(QuorumPeer.java:645)
... 4 more
解决方法:
在 conf/zoo.cfg
,找到下面两个配置的值
dataDir=/var/lib/zookeeper/data
dataLogDir=/var/lib/zookeeper/dataLog
删除两个目录:
rm -rf /var/lib/zookeeper/data/version-2
rm -rf /var/lib/zookeeper/dataLog/version-2