简介:ZooKeeper 是一个开源的分布式协调框架,是Apache Hadoop 的一个子项目,主要用来解决分布式集群中应用系统的一致性问题。
设计目标:将那些复杂且容易出错的分布式一致性服务封装起来,构成一个高效可靠的原语集,并以一系列简单易用的接口提供给用户使用。
ZooKeeper本质上是一个分布式的小文件存储系统(Zookeeper=文件系统+监听机制)。
功能:基于数据的集群管理、统一命名服务、分布式配置管理、分布式消息队列、分布式锁、分布式协调。
设计模式:一个基于观察者模式设计的分布式服务管理框架
下载地址:Apache ZooKeeper
运行环境:jdk8
解压安装包后进入conf目录,复制zoo_sample.cfg,修改为zoo.cfg
修改 zoo.cfg 配置文件,将 dataDir=/tmp/zookeeper 修改为指定的data目录
zoo.cfg中参数含义:
# 可以通过 bin/zkServer.sh 来查看都支持哪些参数
# 默认加载配置路径conf/zoo.cfg
bin/zkServer.sh start
bin/zkServer.sh start conf/my_zoo.cfg
# 查看zookeeper状态
bin/zkServer.sh status
bin/zkCli.sh
# 连接远程的zookeeper server
bin/zkCli.sh -server ip:port
输入命令 help 查看所有命令:
命令基本语法 | 功能描述 |
---|---|
help | 显示所有操作命令 |
ls [-s] [-w] [-R] path | 使用 ls 命令来查看当前 znode 的子节点 [可监听] -w: 监听子节点变化 -s: 节点状态信息(时间戳、版本号、数据大小等)-R: 表示递归的获取 |
create [-s] [-e] [-c] [-t ttl] path [data] [acl] | 创建节点-s : 创建有序节点。-e : 创建临时节点。-c : 创建一个容器节点。t ttl] : 创建一个TTL节点, -t 时间(单位毫秒)。data:节点的数据,可选,如果不使用时,节点数据就为null。acl:访问控制 |
get [-s] [-w] path | 获取节点数据信息 -s: 节点状态信息(时间戳、版本号、数据大小等) -w: 监听节点变化 |
set [-s] [-v version] path data | 设置节点数据-s:表示节点为顺序节点-v: 指定版本号 |
getAcl [-s] path | 获取节点的访问控制信息-s: 节点状态信息(时间戳、版本号、数据大小等) |
setAcl [-s] [-v version] [-R] path acl | 设置节点的访问控制列表-s:节点状态信息(时间戳、版本号、数据大小等)-v:指定版本号-R:递归的设置 |
stat [-w] path | 查看节点状态信息 |
delete [-v version] path | 删除某一节点,只能删除无子节点的节点。-v: 表示节点版本号 |
deleteall path | 递归的删除某一节点及其子节点 |
setquota -n|-b val path | 对节点增加限制n:表示子节点的最大个数b:数据值的最大长度,-1表示无限制 |
Zookeeper图形化工具:ZooInspector
Zookeeper图形化工具:开源的prettyZoo(推荐)
Zookeeper图形化工具:收费的ZooKeeperAssistant
ZooKeeper 数据模型的结构与 Unix 文件系统很类似,整体上可以看作是一棵树,每个节点称做一个 ZNode。
ZooKeeper的数据模型是层次模型,层次模型和key-value模型是两种主流的数据模型。
ZooKeeper使用文件系统模型主要基于以下两点考虑:
文件系统的树形结构便于表达数据之间的层次关系
文件系统的树形结构便于为不同的应用分配独立的命名空间( namespace )?
ZooKeeper的层次模型称作Data Tree,Data Tree的每个节点叫作Znode。不同于文件系统,每个节点都可以保存数据,每一个 ZNode 默认能够存储 1MB 的数据,每个 ZNode 都可以通过其路径唯一标识,每个节点都有一个版本(version),版本从0开始计数。
public class DataTree
{
private final ConcurrentHashMap<String, DataNode> nodes =
new ConcurrentHashMap<String, DataNode>();
private final WatchManager dataWatches = new WatchManager();
private final WatchManager childWatches = new WatchManager();
}
public class DataNode implements Record
{
byte data[];
Long acl;
public StatPersisted stat;
private Set<String> children = null;
}
zookeeper存在几种不同的节点类型,具有不同的生命周期:
类型 | 生命周期 |
---|---|
持久节点 (persistent node) | 一直存在,一直存储在ZooKeeper 服务器上,即使创建该节点的客户端与服务端的会话关闭了,该节点依然不会被删除 |
临时节点 (ephemeral node) | 当创建该临时节点的客户端会话因超时或发生异常而关闭时,该节点也相应在 ZooKeeper 服务器上被删除。 |
有序节点 (sequential node) | 并不算是一种单独种类的节点,而是在之前提到的持久节点和临时节点特性的基础上,增加了一个节点有序的性质。在我们创建有序节点的时候会自动使用一个单调递增的数字作为后缀 |
容器节点 (container node) | 当一个容器节点的最后一个子节点被删除后,容器节点也会被删除 |
TTL节点 (ttl node) | 当一个TTL节点在 TTL 内没有被修改并且没有子节点,会被删除。注意:默认此功能不开启,需要修改配置文件extendedTypesEnabled=true |
无序节点:
持久节点(PERSISTENT): 这样的znode在创建之后即使发生ZooKeeper集群宕机或者client宕机也不会丢失。
临时节点(EPHEMERAL ): client宕机或者client在指定的timeout时间内没有给ZooKeeper集群发消息,这样的znode就会消失。
有序节点:
持久顺序节点(PERSISTENT_SEQUENTIAL): znode除了具备持久性znode的特点之外,znode的名字具备顺序性。
临时顺序节点(EPHEMERAL_SEQUENTIAL): znode除了具备临时性znode的特点之外,zorde的名字具备顺序性。
以上4种节点常用
Container节点 (3.5.3版本新增):Container容器节点,当容器中没有任何子节点,该容器节点会被zk定期删除(定时任务默认60s 检查一次)。 和持久节点的区别是 ZK 服务端启动后,会有一个单独的线程去扫描,所有的容器节点,当发现容器节点的子节点数量为 0 时,会自动删除该节点。可以用于 leader 或者锁的场景中。
TTL节点: 带过期时间节点,默认禁用,需要在zoo.cfg中添加 extendedTypesEnabled=true 开启。 注意:TTL不能用于临时节点
#创建持久节点
create /servers xxx
#创建临时节点
create -e /servers/host xxx
#创建临时有序节点
create -e -s /servers/host xxx
#创建容器节点
create -c /container xxx
# 创建ttl节点
create -t 10 /ttl