一.Zookeepr 概述
1.1 Zookeeper 介绍
介绍 Zookeeper 之前,先说这样一个场景。
假设有三台服务器 A、B、C 组成的分布式系统,在 A 机器上有一个资源 RS,A、B、C 三个服务器上的过程都要竞争这个资源,而因为业务须要,同一个时刻,只能有一个过程拜访该资源,那么如何去做?
那就加锁 lock,当 A 的过程拜访到 RS 资源时,加上一把锁 lock,使得其余过程不能再拜访该资源,而 A 用完 RS 资源,开释掉这把锁 lock,其余过程又能拜访资源 RS,但只有拜访到,就同样加锁,用完开释锁。
在这个分布式系统中的锁,称之为分布式锁,也是分布式协调服务的外围。
Zookeeper 就是一个分布式,开源的为分布式提供协调服务的一个 Apache 的我的项目。它是基于观察者设计模式的分布式服务治理框架,它负责存储管理相干数据,承受观察者的注册,当这些数据状态产生扭转,Zookeeper 就负责告诉注册过的观察者做出反馈。
Zookeeper 提供这些服务次要通过其文件系统和监听机制。
1.2 Zookeeper 利用场景
对立集群治理、配置管理、队列治理、分布式服务的同步、负载平衡等等。
二.Zookeeper 数据结构
Zookeeper 的数据结构和 Unix 的文件系统很类似,如下图
整体能够看成一个树,树中每一个节点都是叫做 Znode。
3.1 Znode 类型
- 长久节点:客户端和服务器断开连接后,创立的节点不会删除,仍然存在
- 长期节点:顾名思义,长期节点在客户端与服务器端会话断开后,节点就会删除
创立 znode 时设置程序标识,znode 名称后会附加一个值,顺序号是一个枯燥递增的计数器,由父节点保护
2.1 Znode 组成
Znode 蕴含三局部内容:
- 1.stat:状态信息, 形容该 Znode 的版本, 权限等,具体如下表
属性 | 形容 |
---|---|
czxid | 创立节点的事务 zxid,每次批改 ZooKeeper 状态都会收到一个 zxid 模式的工夫戳,也就是 ZooKeeper 事务 ID。事务 ID 是 ZooKeeper 中所有批改总的秩序。每个批改都有惟一的 zxid,如果 zxid1 小于 zxid2,那么 zxid1 在 zxid2 之前产生。 |
ctime | znode 被创立的毫秒数(从 1970 年开始) |
mzxid | znode 最初更新的事务 zxid |
mtime | znode 最初批改的毫秒数(从 1970 年开始) |
pZxid | znode 最初更新的子节点 zxid |
cversion | znode 子节点变动号,znode 子节点批改次数 |
dataversion | znode 数据变动号 |
aclVersion | znode 访问控制列表的变动号 |
ephemeralOwner | 如果是长期节点,这个是 znode 拥有者的 session id。如果不是长期节点则是 0。 |
dataLength | znode 的数据长度 |
numChildren | znode 子节点数量 |
- 2.data:与该 Znode 关联的数据,但最多为 1M,通常应用远远小于这个值。且数据操作为原子性,一次数据操作要么胜利,要么失败。
- 3.children:子节点
三.Zookeeper 装置部署
3.1. 分布式装置
- 1)后期布局
我这里有三台 hadoop 集群
主机名 | IP 地址 |
---|---|
hadoop10 | 192.168.122.10 |
hadoop11 | 192.168.122.11 |
hadoop12 | 192.168.122.12 |
在 hadoop10、hadoop11、hadoop12 上部署 Zookeeper
上传压缩包 zookeeper-3.5.7.tar.gz 至三个节点下
- 2)解压文件
sudo tar -zxvf zookeeper-3.5.7.tar.gz -C /opt/
// 因为我所有操作都是用 v2admin 去做,所以改下所属用户和组
sudo chown v2admin:v2admin -R /opt/zookeeper-3.5.7
- 3)创立服务器编号文件并配置服务器编号
cd /opt/zookeeper-3.5.7
mkdir zkId
cd zkId
echo 10 > server_id
// 另外两节点设置为 11 12
- 4)配置 zoo.cfg
cd /opt/zookeeper-3.5.7/conf
cp zoo_sample.cfg zoo.cfg
vim zoo.cfg
===============
# 批改数据存储门路,就是服务器编号的门路
dataDir=/opt/zookeeper.3.5.7/zkId
# 减少如下内容
server.10=hadoop10:2888:3888
server.11=hadoop11:2888:3888
server.12=hadoop12:2888:3888
============
-5)启动脚本
当然能够挨个启动服务 bin/zKserver.sh start,但要是更多的服务器,那就太麻烦了。
vim zk_server.sh
#!/bin/bash
if [$# -lt 1]
then
echo Not enough Args
fi
for i in hadoop10 hadoop11 hadoop12
do
case $1 in
"start")
echo "====================start $i zookeeper============"
ssh v2admin@$i /opt/module/zookeepr-3.5.7/bin/zkServer.sh start
;;
"status")
echo "====================status $i =================="
ssh v2admin@$i /opt/module/zookeepr-3.5.7/bin/zkServer.sh status
;;
"stop")
echo "=================stop $i =================="
ssh v2admin@$i /opt/module/zookeepr-3.5.7/bin/zkServer.sh stop
;;
*)
echo "Args Error"
esac
done
赋予脚本执行权限
chmod a+x zk_server.sh
启动
[v2admin@hadoop10 conf]$ zk_start.sh start
====================start hadoop10 zookeeper============
ZooKeeper JMX enabled by default
Using config: /opt/module/zookeepr-3.5.7/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
====================start hadoop11 zookeeper============
ZooKeeper JMX enabled by default
Using config: /opt/module/zookeepr-3.5.7/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
====================start hadoop12 zookeeper============
ZooKeeper JMX enabled by default
Using config: /opt/module/zookeepr-3.5.7/bin/../conf/zoo.cfg
Starting zookeeper ... already running as process 1663.
至此部署实现
3.2. 客户端命令行操作
- 1)启动客户端
[v2admin@hadoop10 ~]$ zkCli.sh
// 我这里配置了环境变量,所以能够间接执行,如果没有配置,能够到 zookeeper 装置目录下的 bin 目录去执行
- 2 )显示所有操作命令 help
[zk: localhost:2181(CONNECTED) 0] help
- 3)查看以后 znode 中内容
[zk: localhost:2181(CONNECTED) 2] ls /
[admin, brokers, cluster, config, consumers, controller_epoch, isr_change_notification, latest_producer_id_block, log_dir_event_notification, zookeeper]
- 4)查看以后节点具体内容
// 以前版本用 ls2,当初被 ls -s 代替了
[zk: localhost:2181(CONNECTED) 6] ls -s /
[admin, brokers, cluster, config, consumers, controller_epoch, isr_change_notification, latest_producer_id_block, log_dir_event_notification, zookeeper]cZxid = 0x0
ctime = Thu Jan 01 08:00:00 CST 1970
mZxid = 0x0
mtime = Thu Jan 01 08:00:00 CST 1970
pZxid = 0x300000002
cversion = 10
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 0
numChildren = 10
- 5)创立节点
[zk: localhost:2181(CONNECTED) 7] create /beijing "bj"
Created /beijing
[zk: localhost:2181(CONNECTED) 8] create /beijing/chaoyang "bj_cy"
Created /beijing/chaoyang
- 6)获取节点
// 获取值
[zk: localhost:2181(CONNECTED) 9] get /beijing
bj
// 获取具体
[zk: localhost:2181(CONNECTED) 16] get -s /beijing
bj
cZxid = 0x300000007
ctime = Sun Dec 27 12:43:57 CST 2020
mZxid = 0x300000007
mtime = Sun Dec 27 12:43:57 CST 2020
pZxid = 0x300000008
cversion = 1
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 2
numChildren = 1
- 7)创立长期节点
[zk: localhost:2181(CONNECTED) 17] create -e /beijing/haidian 'bj_hd'
Created /beijing/haidian
[zk: localhost:2181(CONNECTED) 18] get -s /beijing/haidian
bj_hd
cZxid = 0x300000009
ctime = Sun Dec 27 12:51:17 CST 2020
mZxid = 0x300000009
mtime = Sun Dec 27 12:51:17 CST 2020
pZxid = 0x300000009
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0xa00002895e50001
dataLength = 5
numChildren = 0
- 8)创立序号节点
[zk: localhost:2181(CONNECTED) 19] create /China
Created /China
[zk: localhost:2181(CONNECTED) 20] create -s /China/Beijing
Created /China/Beijing0000000000
[zk: localhost:2181(CONNECTED) 21] create -s /China/Shanghai
Created /China/Shanghai0000000001
[zk: localhost:2181(CONNECTED) 22] create -s /China/Hebei
Created /China/Hebei0000000002
// 如果之前没有序号节点,则序号从开始,顺次递增。[zk: localhost:2181(CONNECTED) 25] ls /China
[Beijing0000000000, Hebei0000000002, Shanghai0000000001]
// 如果之前原节点下有 2 个节点,则从 2 开始递增
[zk: localhost:2181(CONNECTED) 26] ls /beijing
[chaoyang, haidian]
[zk: localhost:2181(CONNECTED) 27] create -s /beijing/xicheng 'xc'
Created /beijing/xicheng0000000002
[zk: localhost:2181(CONNECTED) 28] ls /beijing
[chaoyang, haidian, xicheng0000000002]
- 9)批改节点数据值
[zk: localhost:2181(CONNECTED) 33] get /beijing/haidian
bj_hd
[zk: localhost:2181(CONNECTED) 34] set /beijing/haidian 'hd'
[zk: localhost:2181(CONNECTED) 35] get /beijing/haidian
hd
更多操作参见文档 https://zookeeper.apache.org/doc/r3.6.2/zookeeperCLI.html