> 文章列表 > 安装Zookeeper

安装Zookeeper

安装Zookeeper

安装Zookeeper
ZK是一个分布式应用服务协调服务,安装部署有单节点模式和分布式集群模式两种。
独立安装Zookeeper是为向Hadoop和HBase共同提供服务的,Zookeeper对操作系统、软件和网络环境的要求与这些组件基本一致,能够安装Hadoop和HBase的节点也可以直接安装Zookeeper。
下载Zookeeper可以得到一个压缩包,将其解压到权限合适的目录即可完成基本部署。其中bin目录下为
可执行命令,conf目录下为配置文件,lib目录下为对应的库包。
下载解压压缩文件 tar -zxvf zookeeper.tar.gz
添加环境变量vim /etc/profile
1 export ZOOKEEPER_HOME=/usr/local/zookeeper
2 export PATH=$ZOOKEEPER_HOME/bin:$PATH
使得配置的环境变量生效 source /etc/profile
2.7.3.2 修改配置
Zookeeper的配置文件为zoo.cfg,纯文本格式。如果是多台服务器,则每个服务器的zoo.cfg文件配置内
容完全一致,但在每台服务器的conf下还需要各建立一个myid文件,该文件为纯文本文件,内容分别为
1、2、3之类的序号用于实现选举,这里的服务号不能重复。
配置文件zoo.cfg例如三台服务器的配置
1 tickTime=2000一个事件长度的时间设置,单位ms,后面的initLimit和syncLimit单位都是这个
2 dataDir=/usr/ZooKeeper/data设置ZK存储持久数据的本地文件系统
3 clientPort=2181指定ZK用于监听客户端端连接的端口号
4 initLimit=10设置了所有跟随者与Leader节点进行连接并同步的时间范围,如果在设定的时间段内半
数以上的跟随者未能完成同步,Leader节点便会宣布放弃Leader地址,然后进行另外一次Leader选举
5
6
syncLimit=5设置了允许一个Follower与Leader进行同步的时间,这里设定的时间范围是10秒,计
算公式为syncLimit * tickTime
7
8
9
#server.1中的1表示自定义ZooKeeper的服务ID是1。192.168.1.xxx表示ZooKeeper所在服务器
的IP。2888表示集群内机器通信使用2888端口。3888表示选举leader使用3888端口。
10 server.1=192.168.1.10:2888:3888
11 server.2=192.168.1.20:2888:3888
12 server.3=192.168.1.30:2888:3888
tickTime配置内容为超时时间的基础值,单位为毫秒
initLimit 配置follower与leader之间建立连接后进行同步的最长时间,数值5表示实际时间为
5*tickTime
syncLimit为leader和follower之间等待回复消息的最大时间,数值2表示2*tickTimedataDir表示zookeeper服务器存储快照数据文件的目录,需要提前手工创建
dataLogDir表示配置 zookeeper事务日志的存储路径,默认指定在dataDir目录下,需要提前手工
创建
clientPort 表示客户端和服务端建立连接的端口号 2181,是Znode的访问入口地址
server.id=host:port1:port2表示Zookeeper集群中有三个节点及其id、ip地址。port1是follower
和leader交换消息的端口,port2表示follower选举leader使用的端口
在不同的节点的opt/zookeeper/data下创建myid文件,并且写入数字1、2、3,与配置文件保持一致
启动服务zkServer.sh start保证所有节点都启动Zookeeper
使用 JPS 验证进程是否已经启动,出现 QuorumPeerMain 则代表启动成功
可以通过zkServer.sh status查看状态,当出现一个Leader和两个Folower时则代表启动成功
可以通过zkServer.sh stop停止服务
重启服务zkServer.sh restart
客户端连接服务器zkCli.sh -server 127.0.0.1:2181
2.7.3.3 基本使用方法
在各个节点的linux命令行依次执行启动 zkServer.sh start
jps或zkServer.sh status命令查看进程是否成功启动 zkServer.sh status
进入zk命令行环境 zcCli.sh -server 192.168.10.1:2181
2.7.3.4 zk shell客户端命令
1 # 启动服务
2 bin/zkServer.sh start
3
4 #连接服务 不指定服务地址则默认连接到localhost:2181
5 zkCli.sh -server hadoop001:2181
使用 help 可以查看所有命令及格式
connect 127.0.0.1:2181连接到本机的2181端口
查看znode结构 ls /查看节点列表有 ls path 和 ls2 path 两个命令,后者是前者的增强,不仅可以查看指定路径
下的所有节点,还可以查看当前节点的信息
1 [zk: localhost:2181(CONNECTED) 0] ls /
2 [cluster, controller_epoch, brokers, storm, zookeeper, admin,
...]
3
4 [zk: localhost:2181(CONNECTED) 1] ls2 /
5 [cluster, controller_epoch, brokers, storm, zookeeper, admin, ....]
6 cZxid = 0x0
7 ctime = Thu Jan 01 08:00:00 CST 1970
8 mZxid = 0x0
9 mtime = Thu Jan 01 08:00:00 CST 1970
10 pZxid = 0x130
11 cversion = 19
12 dataVersion = 0
13 aclVersion = 0
14 ephemeralOwner = 0x0
15 dataLength = 0
16 numChildren = 11
创建znode节点 create /test helloworld
基础语法 create [-s] [-e] path data acl 其中-s 为有序节点,-e 临时节点
创建节点并写入数据 create /hadoop 123456
创建有序节点,此时创建的节点名为指定节点名 + 自增序号
1 [zk: localhost:2181(CONNECTED) 23] create -s /a
2 Created /a0000000022
"aaa"
3
4 [zk: localhost:2181(CONNECTED) 24] create -s /b
5 Created /b0000000023
"bbb"
6
7 [zk: localhost:2181(CONNECTED) 25] create -s /c
8 Created /c0000000024
"ccc"
创建临时节点,临时节点会在会话过期后被删除
1 [zk: localhost:2181(CONNECTED) 26] create -e /tmp
2 Created /tmp
查看znode节点内容 get /test
获取节点数据语法格式 get path [watch]
"tmp"1 [zk: localhost:2181(CONNECTED) 31] get /hadoop
2 123456   #节点数据
3 cZxid = 0x14b
4 ctime = Fri May 24 17:03:06 CST 2019
5 mZxid = 0x14b
6 mtime = Fri May 24 17:03:06 CST 2019
7 pZxid = 0x14b
8 cversion = 0
9 dataVersion = 0
10 aclVersion = 0
11 ephemeralOwner = 0x0
12 dataLength = 6
13 numChildren = 0
节点各个属性如下表。其中一个重要的概念是 Zxid(ZooKeeper Transaction Id),ZooKeeper 节
点的每一次更改都具有唯一的 Zxid,如果 Zxid1 小于 Zxid2,则 Zxid1 的更改发生在 Zxid2 更改
之前
状态属性 说明
cZxid 数据节点创建时的事务 ID
ctime 数据节点创建时的时间
mZxid 数据节点最后一次更新时的事务 ID
mtime 数据节点最后一次更新时的时间
pZxid 数据节点的子节点最后一次被修改时的事务 ID
cversion 子节点的更改次数
dataVersion 节点数据的更改次数
aclVersion 节点的 ACL 的更改次数
ephemeralOwner
如果节点是临时节点,则表示创建该节点的会话的 SessionID;如果
节点是持久节点,则该属性值为 0
dataLength 数据内容的长度
numChildren 数据节点当前的子节点个数
修改znode节点内容 set /test zookeeper
1 [zk: localhost:2181(CONNECTED) 33] set /hadoop 345
2 cZxid = 0x14b
3 ctime = Fri May 24 17:03:06 CST 2019
4 mZxid = 0x14c
5 mtime = Fri May 24 17:13:05 CST 2019
6 pZxid = 0x14b
7 cversion = 0
8 dataVersion = 1  # 注意更改后此时版本号为 1,默认创建时为 0
9 aclVersion = 0
10 ephemeralOwner = 0x0
11 dataLength = 3
12 numChildren = 0也可以基于版本号进行更改,此时类似于乐观锁机制,当你传入的数据版本号 (dataVersion) 和当
前节点的数据版本号不符合时,zookeeper 会拒绝本次修改
1 [zk: localhost:2181(CONNECTED) 34] set /hadoop 678 0
2 version No is not valid : /hadoop    #无效的版本号
删除znode节点 delete /test
和更新节点数据一样,也可以传入版本号,当你传入的数据版本号 (dataVersion) 和当前节点的数
据版本号不符合时,zookeeper 不会执行删除操作
1 [zk: localhost:2181(CONNECTED) 36] delete /hadoop 0
2 version No is not valid : /hadoop   #无效的版本号
3 [zk: localhost:2181(CONNECTED) 37] delete /hadoop 1
4 [zk: localhost:2181(CONNECTED) 38]
要想删除某个节点及其所有后代节点,可以使用递归删除,命令为 rmr path
查看节点状态可以使用 stat 命令查看节点状态,它的返回值和 get 命令类似,但不会返回节点数据
1 [zk: localhost:2181(CONNECTED) 32] stat /hadoop
2 cZxid = 0x14b
3 ctime = Fri May 24 17:03:06 CST 2019
4 mZxid = 0x14b
5 mtime = Fri May 24 17:03:06 CST 2019
6 pZxid = 0x14b
7 cversion = 0
8 dataVersion = 0
9 aclVersion = 0
10 ephemeralOwner = 0x0
11 dataLength = 6
12 numChildren = 0
引入监听器
get path [watch]
使用 get path [watch] 注册的监听器能够在节点内容发生改变的时候,向客
户端发出通知。需要注意的是 zookeeper 的触发器是一次性的 (One-time trigger),即触发一次后就会
立即失效
1 [zk: localhost:2181(CONNECTED) 4] get /hadoop
watch
2 [zk: localhost:2181(CONNECTED) 5] set /hadoop 45678
3 WATCHER::
4 WatchedEvent state:SyncConnected type:NodeDataChanged path:/hadoop  #节点值改变
 
使用 stat path [watch] 注册的监听器能够在节点状态发生改变的时候,向客户端发出通知。
 
1 [zk: localhost:2181(CONNECTED) 7] stat /hadoop watch
2 [zk: localhost:2181(CONNECTED) 8] set /hadoop 112233
3 WATCHER::
4 WatchedEvent state:SyncConnected type:NodeDataChanged path:/hadoop  #节点值改变使用 ls path [watch] 或 ls2 path [watch] 注册的监听器能够监听该节点下所有子节点的增加和
删除操作
1 [zk: localhost:2181(CONNECTED) 9] ls /hadoop watch
2 []
3 [zk: localhost:2181(CONNECTED) 10] create
4 WATCHER::
5 WatchedEvent state:SyncConnected type:NodeChildrenChanged path:/hadoop
/hadoop/yarn "aaa"
2.7.3.5 zk集群安装
为保证集群高可用,Zookeeper 集群的节点数最好是奇数,最少有三个节点,所以这里可以搭建一个三
个节点的集群。这里使用三台虚拟主机进行搭建,主机名分别为 node1,node2,node3
修改配置,可以使用 scp 命令( scp local_file root@node1:remote_file )将安装包分发到三台服
务器上
1 tickTime=10000
2 initLimit=10
3 syncLimit=5
4 dataDir=/usr/local/zookeeper-cluster/data/
5 dataLogDir=/usr/local/zookeeper-cluster/log/
6 clientPort=2181
7
8
# server.1 这个1是服务器的标识,可以是任意有效数字,标识这是第几个服务器节点,这个标识要
写到dataDir目录下面myid文件里
9
# 指名集群间通讯端口和选举端口
10 server.1=node1:2288:3388
11 server.2=node2:2288:3388
12 server.3=node3:2288:3388
 
分别在三台主机的 dataDir 目录下新建 myid 文件,并写入对应的节点标识。
Zookeeper 集群通过 myid 文件识别集群节点,并通过上文配置的节点通信端口和选举端口来进
行节点通信,选举出 Leader 节点。
创建存储目录:
1 # 三台主机均执行该命令
2 mkdir -vp
/usr/local/zookeeper-cluster/data/
创建并写入节点标识到 myid 文件:
1 # node1主机
2 echo "1" > /usr/local/zookeeper-cluster/data/myid
3 # node2主机
4 echo "2" > /usr/local/zookeeper-cluster/data/myid
5 # node3主机
6 echo "3" > /usr/local/zookeeper-cluster/data/myid
启动集群:分别在三台主机上,执行如下命令启动服务:
1
./bin/zkServer.sh start集群验证:启动后使用 zkServer.sh status 查看集群各个节点状态。三个节点进程均启动成功,并
且 node2 为 leader 节点,node1 和 node3 为 follower 节点。
1 node1节点上运行# bin/zkServer.sh status
2 JMX enabled by default
3 Using
4 Mode: fsollower
config:
/opt/module/zookeeper/bin/../conf/zoo.cfg
5
6 node2节点上运行# bin/zkServer.sh status
7 JMX enabled by default
8 Using
9 Mode: leader
config:
/opt/module/zookeeper/bin/../conf/zoo.cfg
10
11 node3节点上运行# bin/zkServer.sh status
12 JMX enabled by default
13 Using
14 Mode: follower
config:
/opt/module/zookeeper/bin/../conf/zoo.cfg