赞
踩
Apache ZooKeeper 是一个分布式的、开源的程序协调服务,是 Hadoop 项目下的一个子项目。ZooKeeper 主要应用场景包括集群管理、配置中心、分布式锁、注册中心等。实际项目中,为了保证高可用,ZooKeeper 都是以分布式集群的方式进行安装的,至少需要三个节点。
ZooKeeper 包含主从节点以及心跳机制(选举模式),假设 master 节点挂了之后,ZooKeeper 会通过选举模式在 slave 节点选举出一个新的 master。
这里 Linux 选择 CentOS 7.2。
# wget -P /usr/local http://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.4.13/zookeeper-3.4.13.tar.gz
# cd /usr/local
# tar -zxvf zookeeper-3.4.13.tar.gz
# vim /etc/rc.d/rc.local //配置开启自启动
追加如下配置即可(oracle jdk 对应的 JAVA_HOME 为 export JAVA_HOME=/usr/java/jdk):
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.171-8.b10.el7_5.x86_64
/usr/local/zookeeper-3.4.13/bin/zkServer.sh start
我们在三台不同的服务器上各部署一个 ZooKeeper 进程,以构成一个 ZooKeeper 集群。三个 ZooKeeper 进程均使用相同的 zoo.cfg 配置:
# cd /usr/local/zookeeper-3.4.13/conf
# mkdir -p /export/data/zookeeper //递归创建目录
# mkdir -p /export/logs/zookeeper
# cp zoo_sample.cfg zoo.cfg //拷贝配置文件
# vim zoo.cfg
修改配置如下:
# 配置存储快照文件的目录
dataDir=/export/data/zookeeper
# 配置存储日志文件的目录
dataLogDir=/export/logs/zookeeper
# zk服务进程监听的TCP端口
clientPort=2181
# 2888:ZooKeeper服务之间通信的端口,3888:ZooKeeper与其他应用程序通信的端口
# server.1:表示这是第几号服务器
server.1=192.168.20.11:2888:3888
server.2=192.168.20.12:2888:3888
server.3=192.168.20.13:2888:3888
然后在三台服务器 dataDir 目录下,分别创建一个 myid 文件,其内容分别为1,2,3。然后分别在这三台机器上启动 ZooKeeper 进程,这样我们便将 ZooKeeper 集群启动了起来。如下:
# cd /export/data/zookeeper
# echo 1 >>myid //创建myid文件并写入1
# cd /usr/local/zookeeper-3.4.13/bin
# ./zkServer.sh start //后台启动ZooKeeper
还有一些其他命令如下:
# ./zkServer.sh restart //重启ZooKeeper
# ./zkServer.sh stop //关闭ZooKeeper
# ./zkServer.sh status //查看服务状态,其中Mode参数:leader表示master节点,follower表示slave节点
# ./zkServer.sh start-foreground //前台启动
目录 | 说明 |
---|---|
zookeeper/bin | 主要的一些运行命令 |
zookeeper/conf | 存放配置文件 |
zookeeper/contrib | 附加的一些功能 |
zookeeper/dist-maven | mvn 编译后的目录 |
zookeeper/docs | 文档 |
zookeeper/lib | 需要依赖的 jar 包 |
zookeeper/recipes | 案例 demo 代码 |
zookeeper/src | 源码 |
配置项 | 默认值 | 说明 |
---|---|---|
tickTime | 2000 | 用于计算的时间单元,单位毫秒,比如 session 超时: N * tickTime |
initLimit | 10 | 用于集群,允许从节点连接并同步到 master 节点的初始化连接时间,以 tickTime 的倍数来表示 |
syncLimit | 5 | 用于集群,master 主节点与从节点之间发送消息,请求和应答时间长度(心跳机制) |
dataDir | 必须配置,配置存储快照文件的目录 | |
dataLogDir | 配置存储日志文件的目录,如果没有配置则会和 dataDir 共用同一个目录 | |
clientPort | 2181 | zk 服务进程监听的TCP端口 |
# cd /usr/local/zookeeper/bin # ./zkCli.sh //打开zk的客户端进入命令行后台 [zk: localhost:2181(CONNECTED) 0] ls / [zookeeper] [zk: localhost:2181(CONNECTED) 0] stat / cZxid = 0x0 //表示创建之后 zk 为此节点分配的 id ctime = Thu Jan 01 08:00:00 HKT 1970 //创建时间 mZxid = 0x0 //表示修改后 zk 分配的id mtime = Thu Jan 01 08:00:00 HKT 1970 //修改时间 pZxid = 0xd //表示子节点的 id, cversion = 5 //表示子节点的版本号, dataVersion = 0 //表示当前节点数据的版本号, aclVersion = 0 //表示当前节点权限的版本号, ephemeralOwner = 0x0 //表示与该节点绑定的session id, dataLength = 0 //表示数据长度, numChildren = 1 //表示子节点有几个
基于 Linux 的 zk 客户端命令:
命令 | 说明 |
---|---|
help | 打开帮助 |
ls path [watch] | 例如 ls /configCenter,表示显示 /configCenter 下的节点;可选参数 [watch] 表示当前命令可以设置 watcher 事件,例如 ls /configCenter watch,表示为 /config 设置 watcher 事件 |
ls2 path [watch] | 例如 ls2 /configCenter,比 ls 命令多输出一些状态信息,等价于 ls 命令 + stat 命令 |
get path [watch] | 例如 get /configCenter,把当前指定节点的数据取出来,状态信息也会输出 |
stat path [watch] | 例如 stat /configCenter,输出状态信息 |
create [-s] [-e] path data acl | 例如 create -s /configCenter/search 0,表示创建 /configCenter/search 节点,节点数据为 0 |
set path data [version] | version 参数如果设置的话,必须设置为指定节点最新的 version 才会去更新,起到乐观锁的效果 |
delete path [version] | version 参数如果设置的话,必须设置为指定节点最新的 version 才会去删除,起到乐观锁的效果 |
getAcl path | 获取某个节点的acl权限信息 |
setAcl path acl | 设置某个节点的acl权限信息,例如 setAcl /configCenter world:anyone:crwa |
addauth scheme auth | 输入认证授权信息,注册时输入明文密码 (登录),但是在 zk 的系统中,密码是以加密的形式存在的 |
zk 可以通过它自身提供的简写命令来和服务器进行交互。
# yum install nc //安装nc命令
zk 四字命令 (Four Letter Words):echo [commond] | nc [ip] [port]
# echo stat | nc localhost 2181 //查看zk的状态信息,以及是否mode(集群还是单机) Zookeeper version: Clients: Latency min/avg/max: 0/0/1 Received: 7 Sent: 6 Connections: 1 Outstanding: 0 Zxid: 0x1da Mode: standalone Node count: 9 # echo ruok | nc localhost 2181 //查看当前zkServer是否启动,返回imok imok # echo dump | nc localhost 2181 //列出未经处理的会话和临时节点 SessionTracker dump: Session Sets (0): ephemeral nodes dump: Sessions with Ephemerals (0): # echo conf | nc localhost 2181 //查看服务器配置 clientPort=2181 dataDir= dataLogDir= tickTime=2000 maxClientCnxns=60 minSessionTimeout=4000 maxSessionTimeout=40000 serverId=0 # echo cons | nc localhost 2181 //展示连接到服务器的客户端信息 /0:0:0:0:0:0:0:1:58070[0](queued=0,recved=1,sent=0) # echo envi | nc localhost 2181 //查看环境变量 Environment: host.name= java.version= ... # echo mntr | nc localhost 2181 //监控zk健康信息 zk_version zk_avg_latency 1 zk_max_latency 28 ... # echo wchs | nc localhost 2181 //展示watch的信息 1 connections watching 1 paths Total watches:1 # echo wchc | nc localhost 2181 //session与watch信息 # echo wchp | nc localhost 2181 //path与watch信息
找到原先配置中的数据保存地址,可以在 /usr/local/zookeeper-3.4.13/conf/zoo.cfg 配置文件中查看,例如 dataDir=/data/zookeeper/data
# cd /data/zookeeper/data/version-2
# ls -alh
找到最新的日志文件和快照文件,例如 log.ab0002cfd1 和 snapshot.1f0006b6eb,日志文件存放 ZooKeeper 全部数据记录 ,快照文件则是内存增量文件。
拷贝数据到新的 ZooKeeper 集群节点下,重启 ZooKeeper 服务,查看节点数据是否正常:
# scp log.ab0002cfd1 snapshot.1f0006b6eb root@192.168.90.200:/data/zookeeper2
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。