Zookeeper 安装使用

发布时间: 更新时间: 总字数:2364 阅读时间:5m 作者: 分享

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
  • dataDir:数据文件目录

Zookeeper 保存数据的目录,默认情况下,Zookeeper将写数据的日志文件也保存在这个目录里。

dataDir=/tmp/zookeeper
  • dataLogDir:日志文件目录

Zookeeper 日志数据的目录,默认情况下,Zookeeper将日志文件保存在这个目录里。

dataLogDir=/var/lib/zookeeper/dataLog/log
  • clientPort:客户端连接端口

客户端连接 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
  • 配置(先配置zk-1)

将文件conf/zoo_sample.cfg改为conf/zoo.cfg

mv zoo_sample.cfg zoo.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
  • 配置zookeeper环境参数

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
  • 修改文件内容: 对 zk 所关联的字符串进行设置

set /zk "zkbak"
  • 删除文件: 将刚才创建的 znode 删除

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

完毕。

Home Archives Categories Tags Docs