0


Zookeeper

1、简介

Zookeeper是一个树形目录服务,是一个基于观察者模式设计的分布式、开源应用程序协调服务,可存储数据和接受注册。一旦数据发生变化,Zookeeper负责通知已注册的节点。

主要功能:配置管理、分布式锁、集群管理

架构如下:
在这里插入图片描述

  1. Zookeeper:一个leader和多个follower组成集群
  2. Zookeeper集群中有半数以上节点正常,即可提供服务,适合奇数台服务器。
  3. 全局数据一致:Zookeeper保存一份相同的副本。
  4. 更新请求顺序执行,来自同一个Client的请求按发送顺序执行。
  5. 数据更新原子性。
  6. 同步时间很快,能保证实时性。
  • 数据结构

数据模型为树形结构,每个节点为ZNode,每个ZNode默认能存1MB,并可通过路径进行唯一标识。
在这里插入图片描述

2、下载安装(单机版)

下载地址:https://archive.apache.org/dist/zookeeper/zookeeper-3.5.7/

解压后修改conf文件夹下的配置文件,先修改配置文件名,将zoo-sample.cfg改为zoo.cfg,将否则启动报错

grep: /export/soft/zookeeper/apache-zookeeper-3.5.7-bin/bin/../conf/zoo.cfg: 没有那个文件或目录

之后创建Zookeeper数据存放文件夹zkData,并修改zoo.cfg

# The number of milliseconds of each ticktickTime=2000# The number of ticks that the initial # synchronization phase can takeinitLimit=10# The number of ticks that can pass between # sending a request and getting an acknowledgementsyncLimit=5# the directory where the snapshot is stored.# do not use /tmp for storage, /tmp here is just # example sakes.dataDir=/export/soft/zookeeper/apache-zookeeper-3.5.7-bin/zkData
# the port at which the clients will connectclientPort=2181# the maximum number of client connections.# increase this if you need to handle more clients#maxClientCnxns=60## Be sure to read the maintenance section of the # administrator guide before turning on autopurge.## http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance## The number of snapshots to retain in dataDir#autopurge.snapRetainCount=3# Purge task interval in hours# Set to "0" to disable auto purge feature#autopurge.purgeInterval=1

启动Zookeeper

cd /export/soft/zookeeper/apache-zookeeper-3.5.7-bin/bin
./zkServer.sh start#启动命令

查看Zookeeper状态

./zkServer.sh status

启动客户端

 ./zkCli.sh 

退出客户端

quit

停止zk服务

 ./zkServer.sh stop
3、配置参数含义
  1. tickTime:通信心跳时间,单位ms
  2. initLimit:leader和follower初始连接能容忍的最多心跳数(tickTime的数量),即如果通信时间超过initLimit*tickTime的时间就是通信超时
  3. syncLimit:同步通信时限,通信时间超过syncLimit*tickTime,就从列表中删除该节点
  4. dataDir:保存Zookeeper中的数据目录
  5. clientPort:客户端连接端口
4、集群安装、启动、停止

在/export/soft/zookeeper/apache-zookeeper-3.5.7-bin/zkData目录下新增myid文件,myid为服务器身份标识,三台机器分别为0,1,2并修改配置文件,增加如下配置:

server.0=hadoop100:2888:3888
server.1=hadoop101:2888:3888
server.2=hadoop102:2888:3888

含义:server.myid=服务器节点:follower与leader通信端口:重新选举通信端口。修改完成后进行分发。

集群启动:

三台服务器同时执行下面命令,并查看状态。

/export/soft/zookeeper/apache-zookeeper-3.5.7-bin/bin/zkServer.sh start
/export/soft/zookeeper/apache-zookeeper-3.5.7-bin/bin/zkServer.sh status

集群停止

/export/soft/zookeeper/apache-zookeeper-3.5.7-bin/bin/zkServer.sh stop
5、Zookeeper的leader选举原则
  • 第一次启动选举在启动没达到半数时,服务器处在looking状态,在启动达到半数以上后,myid最大的作为leader,后续启动的服务器都是follower
  • leader掉线重新选举通过服务器id(SID)、事务id(ZXID)、leader任期代号(Epoch)进行选举选举优先级:Epoch>ZXID>SID
6、客户端命令

使用远程客户端

 ./zkCli.sh -server hadoop102:2181

查看节点信息

[zk: hadoop102:2181(CONNECTED)3]ls-s /
[zookeeper]cZxid = 0x0
ctime = Thu Jan 01 08:00:00 CST 1970
mZxid = 0x0
mtime = Thu Jan 01 08:00:00 CST 1970
pZxid = 0x0
cversion =-1
dataVersion =0
aclVersion =0
ephemeralOwner = 0x0
dataLength =0
numChildren =1

创建节点

#不带序号
create /test "111"#带序号
create -s /test2 "222"

获取节点值

get /test

修改节点值

set /test "333"

删除节点(只能删除叶子节点)

delete /test
7、节点类型

持久:客户端与服务端断开后,创建的节点不删除。其中,持久化顺序编号目录节点只是Zookeeper给该节点名称进行顺序编号

短暂:客户端与服务端断开后,创建的节点删除

8、监听器

监听步骤:

  1. 有main()线程
  2. 在main()线程中创建Zookeeper客户端,客户端创建两个线程分别负责通信和监听
  3. 通信线程将注册监听事件发送给Zookeeper
  4. 在Zookeeper的注册监听器列表中将注册的监听事件添加到列表中
  5. Zookeeper监听到变化,发消息给监听线程
  6. 监听线程调用process方法

常见的监听:监听节点数据变化、监听节点增减变化

注意:注册一次,监听只监听一次,后续变化不会通知。

创建数据监听

 get -w /test

在节点数据改变后,监听到数据变化后会给出通知。

WATCHER::

WatchedEvent state:SyncConnected type:NodeDataChanged path:/test

创建路径监听

 create /test/test1

路径变化后,监听到路径变化后会给出通知。

WATCHER::

WatchedEvent state:SyncConnected type:NodeChildrenChanged path:/test
9、java代码操作Zookeeper
  1. 添加maven<dependency><groupId>org.apache.zookeeper</groupId><artifactId>zookeeper</artifactId><version>3.5.7</version></dependency>
  2. 初始化客户端privateZooKeeper zkClient;@Beforepublicvoidinit()throwsIOException{String connectSring="192.168.132.102:2181";int sessionTimeout=80000; zkClient =newZooKeeper(connectSring, sessionTimeout,newWatcher(){publicvoidprocess(WatchedEvent watchedEvent){}});}
  3. 创建节点@Testpublicvoid create ()throwsKeeperException,InterruptedException{ zkClient.create("/testJava","11".getBytes(),ZooDefs.Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT);}
  4. 获取子节点,只能监听一次@TestpublicvoidgetChild()throwsKeeperException,InterruptedException{List<String> children = zkClient.getChildren("/",true); children.forEach((s)->{System.out.println(s);});}
  5. 持续监听在初始化时,将事件写到process方法中,实现持续监听publicvoidinit()throwsIOException{String connectSring="192.168.132.102:2181";int sessionTimeout=80000; zkClient =newZooKeeper(connectSring, sessionTimeout,newWatcher(){publicvoidprocess(WatchedEvent watchedEvent){List<String> children =null;try{ children = zkClient.getChildren("/",true);}catch(KeeperException e){ e.printStackTrace();}catch(InterruptedException e){ e.printStackTrace();} children.forEach((s)->{System.out.println(s);});}});}
  6. 判断节点存在publicvoidexist()throwsKeeperException,InterruptedException{Stat stat = zkClient.exists("/testJava",true);System.out.println(stat);}
标签: zookeeper 分布式

本文转载自: https://blog.csdn.net/wslzoooo/article/details/136083664
版权归原作者 空指针异常Null_Point_Ex 所有, 如有侵权,请联系我们删除。

“Zookeeper”的评论:

还没有评论