1.什么是zookeeper?
zookeeper ,它是一个分布式协调框架,是Apache Hadoop 的一个子项目,它主要是用来解决分布式应用总经常遇到的一些数据管理问题,如:统一命名服务、状态同步服务、集群管理、分布式应用配置项的管理等。
2.文件系统的数据结构
Zookeeper维护一个类似文件系统的数据结构
每一个子目录项目都称为znode(目录节点),和文件系统类似,我们能够自由的增加、删除znode、在一个znode下增加、删除znode。
一共有四种类型的znode:
1.PERSISTENT-持久化目录节点
客户端与zookeeper断开连接之后,该节点依旧存在,只要不手动删除该节点、它将永远存在
2.PERSISTENT_SEQUENTIAL-持久化顺序编号目录节点
客户端与zookeeper断开连接之后,该节点依旧存在,只是zookeeper给该节点名称进行顺序编号
3.EPHEMERAL-临时目录节点
客户端与zookeeper断开连接之后,该节点被删除
4.EPHEMERAL_SEQUENTIAL-临时顺序编号目录节点
客户端与zookeeper断开连接之后,该节点被删除,只是Zookeeper给该节点名称进行顺序编号
5.Container (如果容器节点下面没有子节点,则Container节点在未来会被Zookeeper自动清除,定时任务默认60s检查一次)
6.TTL 节点(默认禁用,只能通过系统配置 zookeeper.extendedTypesEnabled=true 开启,不稳定)
3.监听通知机制
客户端注册监听它关心的任意节点,或者目录节点及递归子目录节点
1.如果注册的是对某个节点的监听,则当这个节点被删除、或者被修改时、对应的客户端将被通知
2.如果注册的是对某个目录对监听、则当这个目录有子节点被创建,或者有子节点被删除,对应的客户端将被通知
3.如果住的是对某个目录对递归子节点进行监听,则当这个目录下面的任意子节点有目录结构的变化(有子节点被创建,或者被删除)或者根节点有数据变化时候,对应的客户端将被通知
所有的通知都是一次性的,及无论是对节点还是对目录进行监听,一旦触发,对应的监听将被移除。递归子节点,监听是对所有子节点的,所以,每个子节点下面的事件同样只会被触发一次。
Zookeeper 经典的应用场景
1.分布式配置中心
2.分布式注册中心
3.分布式锁
4.分布式队列
5.集群选举
6.分布式屏障
7.发布/订阅
zookeeper安装
1.配置java环境
java -version
2.解压
tar -zxvf apache-zookeeper-3.5.8-bin.tar.gz
3.重命名
cp zoo_sample.cfg zoo.cfg
4:启动zookeeper
./zkServer.sh start zoo.cfg
5.连接服务器
./zkCli.sh -server ip:port
1.创建zookeeper节点命令
create [-s] [-e] [-c] [-t ttl] path [data] [acl]
中括号为可选项,没有则默认创建持久节点
-s:顺序节点
-e:临时节点
-c:容器节点
-t:可以给节点添加过期时间,默认禁用,需要通过系统参数启用
创建节点
create /node-test zookeeper
如果没有天际任何可选参数,创建的就是持久化节点
查看节点
[zk: localhost:2181(CONNECTED) 6] get /node-test
zookeeper
[zk: localhost:2181(CONNECTED) 7]
修改节点数据:
[zk: localhost:2181(CONNECTED) 7] set /node-test zookeeper-change
查看节点状态信息
[zk: localhost:2181(CONNECTED) 8] stat /node-test
cZxid = 0x39
ctime = Tue Apr 18 07:55:12 UTC 2023
mZxid = 0x3a
mtime = Tue Apr 18 07:59:07 UTC 2023
pZxid = 0x39
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 16
numChildren = 0
cZxid:创建znode的事务ID(Zxid的值)。
mZxid:最后修改znode的事务ID
pZxid:最后添加或者删除子节点的事务ID(子节点列表发生变化才会发生变化)。
ctime:znode创建时间
mtime:znode最近修改时间
dataVersion:znode的当前数据版本
cversion:znode的子节点结果集版本(一个节点的子节点增加、删除都会影响这个版本)
aclVersion:表示对此znode的ac版本。
ephemeralOwner:znode 是临时znode时,表示znode所有者的session ID。如果znode不是临时znode,则该字段设置为零。
dataLength:znode数据字段的长度。
numChildren:znode的子znode的数量
根据状态数据中的版本号有并发修改数据实现了乐观锁的功能
/node-test 当前的数据版本是1,这时候客户端用set命令修改数据的时候可以把版本号带上
[zk: localhost:2181(CONNECTED) 10] set -v 1 /node-test change
如果在执行上面set命令前,有人修改了数据,zookeeper会递增版本号,这个时候,如果再用以前的版本号去修改,将会导致修改失败,
[zk: localhost:2181(CONNECTED) 11] set -v 1 /node-test change-error
version No is not valid : /node-test
[zk: localhost:2181(CONNECTED) 12]
创建子节点,这里要注意,zookeeper是以节点数据组织的,没有相对路径这么一说,所以,所有的节点一定是以/开头
[zk: localhost:2181(CONNECTED) 12] create /node-test/node-test-sub
Created /node-test/node-test-sub
查看子节点信息,比如根节点下面的所有子节点,加上一个大写R可以查看递归子节点列表
[zk: localhost:2181(CONNECTED) 20] ls -R /node
node-1 node-2 node-test node4
[zk: localhost:2181(CONNECTED) 20] ls -R /node-test
/node-test
/node-test/node-test-sub
创建临时节点
create 后跟随一个-e 创建临时节点、临时节点不能创建子节点
[zk: localhost:2181(CONNECTED) 21] create -e /ephemeral node-ephemeral
Created /ephemeral
[zk: localhost:2181(CONNECTED) 22] create -e /ephemeral/ephemeral-sub
Ephemerals cannot have children: /ephemeral/ephemeral-sub
创建序号节点
创建序号节点,加参数-s
[zk: localhost:2181(CONNECTED) 23] create /seq-node-parent data-seq
Created /seq-node-parent
[zk: localhost:2181(CONNECTED) 24] create -s /seq-node-parent/ data-change
Created /seq-node-parent/0000000000
[zk: localhost:2181(CONNECTED) 25]
创建容器节点
[zk: localhost:2181(CONNECTED) 25] create -c /container-node
Created /container-node
容器节点主要用来容纳子节点,如果没有给其创建子节点,容器节点表现和持久化节点一样,如果给容器节点创建了子节点,后续又把子节点清空,容器节点也会被zookeeper删除