ZookeePer–两大核心
文章目录
进入客户端:zkCli.sh
一:文件系统
1)注意:
-
zk的文件系统的结构类似与linux的 /开始
-
zk的文件系统 绝对路径
-
zk中不存在目录的概念也不存在文件的概念,只存在znode的概念 这里的znode既具有文件的功能又具有目录的功能
-
zk中znode的分类(永久无编号节点,永久有编号节点,临时有编号节点,临时无编号节点)
-
对于zk来说znode存储的大小不要超过1兆 最好不要超过1kb(便于数据同步,速度快减少存储 减少zk每一个节点(机器)的压力)
-
对于zk来说znode存储的数据的份数 有几个zk节点 存储几份
-
在zk中可以添加监听的 但是这只能监听znode
2)znode的分类
1.znode节点按照生命周期分类
1)永久结点
creat path data
只要不是人为删除 永久存在
- 临时节点
create -e path data
临时存在,临时结点不能有子节点
2.znode节点按照有无编号分
1)有编号节点
create -s path data 创建一个永久且有编号的节点
在创建节点的时候自动分配一个编号,一个节点可以无限创建 这个编号父节点维护的
从0开始顺序递增的,但是在递增的过程中无论父节点的子节点是否位有编号节点都会递增的
2)无编号节点
总分类:有子节点的一定是永久节点
-
永久无编号节点,create path data
-
永久有编号节点,create -s path data
-
临时有编号节点,create -e -s path data
-
临时无编号节点,create -e path data
3)zookeeper的shell
help:
stat path [watch]
set path data [version]
ls path [watch]
delquota [-n|-b] path
ls2 path [watch]
setAcl path acl
setquota -n|-b val path
history
redo cmdno
printwatches on|off
delete path [version]
sync path
listquota path
rmr path
get path [watch]
create -s path data acl
addauth scheme auth
quit
getAcl path
close
connect host:port
①查看指定目录下的内容: ls 路径
②查看目录或者指定文件内容: get 路径
③创建结点的命令 creat -s -e 路径 结点的存储内容
④退出客户端 quit
⑤修改znode的内容
set path data
set /bd1906 “hello”
⑤查看状态信息 stat path
cZxid = 0x200000004//
ctime = Tue Oct 08 23:22:26 PDT 2019 //创建时间
mZxid = 0x200000011
mtime = Wed Oct 09 00:07:00 PDT 2019 //修改时间
pZxid = 0x200000004
cversion = 0 //创建版本
dataVersion = 1 //数据版本
aclVersion = 0//权限版本
ephemeralOwner = 0x0 // 0x0 是永久节点
dataLength = 5 存储内容的长度 byte
numChildren = 0 //子节点的个数
全局事件提交的顺序 全局顺序递增的
cZxid = 0x200000004 创建节点的时间id
mZxid = 0x200000011 修改节点的时间id
pZxid = 0x200000004 子节点变化的事件id
zk中各个节点(机器)山哪一个节点zxid最大 越大的代表这个节点上的数据最新
⑥删除节点
delete path 删除没有子节点的节点
rmr path 级联删除
⑦ connect host:port
二:监听机制
在zk中如果某一个客户端对莫一个znode感兴趣,需要添加监听
一旦有客户端感兴趣的事件发生 立即通知客户端
分布式一致性 :通过文件系统+监听机制实现
1)监听的事件类型
nodedatachanged 节点存储的内容是否发生变化
nodedeleted 节点是否删除了
nodecreates 节点是否被创建事件
nodechildrenchanged 节点是否创建了子节点
2)如何添加监听
ls path watch :对子节点感兴趣
get path watch: 对节点内容感兴趣
exists 是否存在
3)触发监听
create
delete
set
注意:监听只生效一次
4)Java API实现的监听器
public class TextWatchAPI {
static ZooKeeper zk;
public static void main(String[] args) throws IOException,
KeeperException, InterruptedException {
//创建zookeeper连接对象
zk=new ZooKeeper("hadoop01:2181,hadoop02:2181,hadoop03:2181",
6000,new Watcher() {
//回调方法
@Override
public void process(WatchedEvent event) {
//回调函数
//构建zj对象的时候 测试调用监听器
EventType type=event.getType();
String path =event.getPath();
System.out.println(type+"-----"+path);
}
});
//添加监听
/**
* 参数1:路径
* 参数2:监听器
* 1)boolean 是否监听监听器
* true:添加监听器 默认添加的监听器 zk对象构造的
* 必须保证zk对象构建的时候 监听器必须是传入的
* false:不添加监听
* 2)watch对象
*/
//添加监听
zk.getData("/bd1906", new Watcher() {
@Override
public void process(WatchedEvent event) {
//回调函数
//构建zj对象的时候 测试调用监听器
EventType type=event.getType();
String path =event.getPath();
System.out.println(type+"####"+path);
//成功添加上监听
try {
zk.getData("/bd1906", true, null);
} catch (KeeperException | InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}, null);
//触发监听
zk.setData("/bd1906", "zookeeper".getBytes(), -1);
//第二次触发监听
zk.setData("/bd1906", "zookeeper_01".getBytes(), -1);
//第三次
zk.delete("/test_api", -1);
zk.close();
}
}