乐趣区

关于zookeeper:Zookeeper概述与部署

一.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

退出移动版