zookeeper核心概念和操作

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删除

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值