概述
Zookeeper 是一个基于观察者模式设计的分布式服务管理框架。
它负责存储和管理共享数据,并接受观察者注册,当共享数据状态发生变化时,Zookeeper 将会通知已经注册的观察者,为分布式框架提供协调服务。官网的架构如下:
特点
1. Zookeeper 是由一个 Leader 领导多个 Follower 组成的集群。
2. Zookeeper 集群中只要超过半数节点回复,Leader 就可以直接应答,所以适合安装奇数台服务器。
3. Zookeeper 集群中每个 Server 保存一份相同的数据副本,可以保证数据的全局一致性。
4. 来自同一个 Client 的更新请求会按其发送顺序依次执行。
5. Zookeeper 集群可以保证数据更新的原子性。
6. 由于 Zookeeper 每个节点仅储存了少量数据,所以在一定时间范围内 Client 能实时读取到最新的数据。
数据结构
ZooKeeper 数据模型的结构整体上可以看作是一棵树,其节点称为 ZNode,ZNode 默认存储 1MB 的数据,通过其文件路径唯一标识。官网的数据结构图如下:
应用场景
1. 统一命名服务:分布式环境下经常需要进行统一命名,可以通过 Znode 节点实现。
2. 统一配置管理:可将配置信息写入一个 Znode 上,Client 监听此 Znode,当数据被修改将通知各个 Client 同步变更。
3. 统一集群管理:可将节点信息写入一个 Znode,监听获取其状态变化,实现统一管理。
4. 服务器动态上下线:服务器启动时注册一个 Znode,下线时将 Znode 删除,Client 可以通过监听 Znode 感知到服务器是否在线。
5. 软负载均衡:在 Zookeeper 中记录每台服务器的访问数,让访问数最少的服务器去处理最新的客户端请求。
基本操作
1. 命令行
# -s:顺序节点;-e:临时节点;若不指定,则创建持久节点
# acl:进行权限控制
create [-s][e] path data acl
# 列出指定节点下的所有子节点,只能查看第⼀级的所有子节点
ls path data
# 获取指定节点的数据内容和属性信息
get path data
# 更新节点
set path data [version]
# 删除节点
delete path [version]
2. 原生 API
/*
connectString: IP 地址
sesssionTimeOut: 超时时间,单位毫秒
Watcher:监听器
Zookeeper(String, int, Watcher)
*/
ZooKeeper zooKeeper = new Zookeeper("connectString", sesssionTimeOut, new Watcher(){......});
/*
创建节点
path: Znode 路径
data: Znode 储存的数据
acl: 权限控制
createMode: 节点的类型
持久节点:PERSISTENT
持久顺序节点:PERSISTENT_SEQUENTIAL
临时节点:EPHEMERAL
临时顺序节点:EPHEMERAL_SEQUENTIAL
ZooKeeper.create(String, byte[], List, CreateMode)
*/
String node = zooKeeper.create("path", "data".getByte(), acl, CreateMode);
/*
获取节点
path: Znode 路径
watch: 是否要启动监听
ZooKeeper.getChildren(String, boolean)
*/
List<String> children = zooKeeper.getChildren("path", watch);
/*
获取节点数据
path: 路径
watch: 是否开启监听
stat: 节点状态信息
ZooKeeper.getData(String, boolean, Stat);
*/
byte[] data = zooKeeper.getData("path", watch, stat);
/*
修改节点状态信息
path: Znode 路径
data: Znode 储存的数据
version: 版本
ZooKeeper.setData(String, byte[], int)
*/
Stat stat = zooKeeper.setData("path", "data".getByte(), version);
/*
删除节点
path: Znode 路径
version: 版本
Zookeeper.delete(String, int)
*/
zooKeeper.delete("path", version);