目录
Zookeeper概述
Zookeeper命令操作
Zookeeper数据模型
Zookeeper 服务端常用命令
Zookeeper客户端常用命令
javaAPI操作
Curator操作
事件监听:
分布式锁
Zookeeper集群
概念
集群搭建
Zookeeper概述
Zookeeper
是
Apache Hadoop
项目下的一个子
项目,是一个树形目录服务。
Z
ookeeper
翻译过来就是 动物园管理员,他是用来管
H
adoop(
大象)、
Hive(
蜜蜂
)、
Pig(
小 猪
)
的管理员。简称
zk
Zookeeper
是一个分布式的、开源的分布式应用程序的协调服务。
Zookeeper
提供的主要功能包括:
配置管理
分布式
锁
集群管理
Zookeeper命令操作
Zookeeper数据模型
ZooKeeper
是
一个树形目录
服务
,
其数据模型
和
Unix
的文件系统目录树很类似,拥有一个
层次化
结构。
这里面的每一个节点都被称为:
ZNode
,每个节点上都会保存自己的数据和节点信息。
节点可以拥有子节点,同时也允许少量(
1MB
)数据存储在该节点之下。
节点可以分为四大类:
•
PERSISTENT
持久化节点
•
EPHEMERAL
临时节点
:
-e
•
PERSISTENT_SEQUENTIAL
持久化顺序节点
:
-s
•
EPHEMERAL_SEQUENTIAL
临时顺序节点
:
-
es
Zookeeper 服务端常用命令
Zookeeper数据模型
ZooKeeper
是
一个树形目录
服务
,
其数据模型
和
Unix
的文件系统目录树很类似,拥有一个
层次化
结构。
这里面的每一个节点都被称为:
ZNode
,每个节点上都会保存自己的数据和节点信息。
节点可以拥有子节点,同时也允许少量(
1MB
)数据存储在该节点之下。
节点可以分为四大类:
•
PERSISTENT
持久化节点
•
EPHEMERAL
临时节点
:
-e
•
PERSISTENT_SEQUENTIAL
持久化顺序节点
:
-s
•
EPHEMERAL_SEQUENTIAL
临时顺序节点
:
-
es
Zookeeper 服务端常用命令
• 启动 ZooKeeper 服务 : ./zkServer.sh start • 查看 ZooKeeper 服务状态 : ./zkServer.sh status • 停止 ZooKeeper 服务 : ./zkServer.sh stop • 重启 ZooKeeper 服务 : ./zkServer.sh restart
Zookeeper客户端常用命令
连接服务器
./zkCli.sh –server ip:port
设置节点值
set /节点path value
退出
quit
删除单个节点
delete /节点path
删除带子节点的节点
deleteall /节点path
创建节点
create /节点path value
显示指定节点目录
ls 目录
查看命令帮助
help
获取节点值
get /节点path
javaAPI操作
Curator操作
Curator 是 Apache ZooKeeper 的Java客户端库
Curator API常用操作
- 建立连接
- connectin
- 添加节点
基本创建 creat().forpath(“/path”)
默认有数据:数据是当前的ip地址
创建节点(带有数据)forpath(“/path”,byte [] 数组)
设置结点类型 withMode(Mode .forpath).(“/path”,byte [] 数组)
默认类型:持久化
多级节点 withMode(Mode .
forpath).(“/path/path”)
不存在使用CreatingifNeeded方法创建
- 删除节点 delete
单个节点 delete()forpath()
带有子节点的 delete().deletingChildrenIfneeded().forpath(“path”)
必须成功删除的删除 detele().granted().forpath()
回调 detele().granted().inbackground(new backgroundCallback)
- 修改节点
修改数据 setData().forpath(“path”,数据.bytes)
根据版本修改 版本是查询出来的
- 查询节点
查数据 getData().forpath(“path”)
查子节点 ls / getChildren().forpath(“path”)
查节点状态 ls-s /
getData().storingStarin.forpath(“path”)
- Watch事件监听
- 分布式锁实现
事件监听:
- 建立连接
- connectin
- 添加节点
基本创建 creat().forpath(“/path”)
默认有数据:数据是当前的ip地址
创建节点(带有数据)forpath(“/path”,byte [] 数组)
设置结点类型 withMode(Mode .forpath).(“/path”,byte [] 数组)
默认类型:持久化
多级节点 withMode(Mode . forpath).(“/path/path”) 不存在使用CreatingifNeeded方法创建
单个节点 delete()forpath() 带有子节点的 delete().deletingChildrenIfneeded().forpath(“path”) 必须成功删除的删除 detele().granted().forpath() 回调 detele().granted().inbackground(new backgroundCallback)
- 删除节点 delete
修改数据 setData().forpath(“path”,数据.bytes) 根据版本修改 版本是查询出来的
- 修改节点
查数据 getData().forpath(“path”) 查子节点 ls / getChildren().forpath(“path”) 查节点状态 ls-s / getData().storingStarin.forpath(“path”)
- 查询节点
- Watch事件监听
- 分布式锁实现
事件监听:
ZooKeeper 允许用户在指定节点上注册一些Watcher,并且在一些特定事件触发的时,ZooKeeper 服务端会将事件通知到感兴趣的客户端上去,该机制是 ZooKeeper 实现分布式协调服务的重要特性。
ZooKeeper 中引入了Watcher机制来实现了发布/订阅功能能,能够让多个订阅者同时监听某一个对象,当一个对象自身状态变化时,会通知所有订阅者。
ZooKeeper 原生支持通过注册Watcher来进行事件监听,但是其使用并不是特别方便
需要开发人员自己反复注册Watcher,比较繁琐。
Curator引入了 Cache 来实现对 ZooKeeper 服务端事件的监听。
ZooKeeper提供了三种Watcher:
- NodeCache : 只是监听某一个特定的节点
- PathChildrenCache : 监控一个ZNode的子节点.
- TreeCache : 可以监控整个树上的所有节点,类似于PathChildrenCache和NodeCache的组合
分布式锁 在我们进行单机应用开发,涉及并发同步的时候,我们往往采用 synchronized 或者 Lock 的方式来解决多线程间的代码同步 问题,这时 多线程的运行都是在同一个 JVM 之下,没有任何问题。但当我们的应用是分布式集群工作的情况下,属于多 JVM 下的工作环境 ,跨 JVM 之间已经无法通过多线程的锁解决同步问题 。那么就需要一种更加高级的锁机制,来处理种 跨机器的进程之间的数据同步问题 —— 这就是分布式锁。 分布式锁:
核心思想:当客户端要获取锁,则创建节点,使用完锁,则删除 该 节点。- 客户端获取锁时,在lock节点下创建临时顺序节点。
- 然后获取lock下面的所有子节点,客户端获取到所有的子节点之后,如果发现自己创建的子节点序号最小,那么就认为该客户端获取到了锁。使用完锁后,将该节点删除。
- 如果发现自己创建的节点并非lock所有子节点中最小的,说明自己还没有获取到锁,此时客户端需要找到比自己小的那个节点,同时对其注册事件监听器,监听删除事件。
- 如果发现比自己小的那个节点被删除,则客户端的Watcher会收到相应通知,此时再次判断自己创建的节点 是否是lock子节点中序号最小的,如果是则获取到了锁, 如果不是则重复以上步骤继续获取到比自己小的一个节点并注册监听。
Zookeeper集群
概念
Leader选举:
- Serverid:服务器ID
- Zxid:数据ID
在Leader选举的过程中,如果某台ZooKeeper获得了超过半数的选票,则此ZooKeeper就可以成为Leader了。
集群搭建
使用虚拟机虚拟集群,在服务器上安装3个zookeeper。
配置集群
详细过程如链接::Zookeeper集群搭建_小白文的博客-CSDN博客_zk集群搭建
Zookeeper 集群角色- Leader 领导者 :
1. 处理事务请求
2. 集群内部各服务器的调度者
- Follower 跟随者 :
1. 处理客户端非事务请求,转发事务请求给Leader服务器
2. 参与Leader选举投票
- Observer 观察者:
1. 处理客户端非事务请求,转发事务请求给Leader服务器



