简介:
主要是用来维护和监控一个目录节点树中存储的数据的状态(维护一致性)
Path类型:
- PERSISTENT:持久化目录节点,这个目录节点存储的数据不会丢失;
- PERSISTENT_SEQUENTIAL:顺序自动编号的目录节点,这种目录节点会根据当前已近存在的节点数自动加
1,然后返回给客户端已经成功创建的目录节点名;
- EPHEMERAL:临时目录节点,一旦创建这个节点的客户端与服务器端口也就是 session 超时,这种节点会被自动删除;
- EPHEMERAL_SEQUENTIAL:临时自动编号节点
目录节点 ACL(访问权限):
ALL、READ、WRITE、CREATE、DELETE、ADMIN
注:Zookeeper 中的目录节点权限不具有传递性,父目录节点的权限不能传递给子目录节点
标识了访问目录节点的身份列表(id):
默认:ANYONE_ID_UNSAFE = new Id("world", "anyone") 和 AUTH_IDS = new Id("auth", "")
分别表示任何人都可以访问和创建者拥有访问权限
Watcher 观察者模式:
可以监控目录节点的数据变化以及子目录的变化,一旦这些状态发生变化,服务器就会通知所有设置在这个目录节点上的 Watcher KeeperState:
Disconnected
NoSyncConnected
SyncConnected
AuthFailed
ConnectedReadOnly
SaslAuthenticated
Expired
EventType node变更
None
NodeCreated
NodeDeleted NodeDataChanged,就算设置重复的数据也会有该事件
NodeChildrenChanged
AsyncCallback
DataCallback getData
ACLCallback setACL
ChildrenCallback getChildren
StatCallback exisit
StringCallback
VoidCallback
Children2Callback
Zookeeper一致性协议Zab,保证应用程序的HA和一致性
同类算法:分布式一致性算法(二阶段提交、paxos算法、raft算法)
场景使用:
- 存储公共配置信息
1.集群中A机器创建一个PERSISTENT类型的/data目录,如下:zk.create("/testRootPath", "testRootData".getBytes(),Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT);
2.其他机器在getData的时候添加watcher监控,一旦/data节点下的数据发送变化,则zookeeper服务器通知所有注册上来的观察者,回调它们的watcher方法,从而实现配置统一
- 集群管理
1.master创建一个root节点,并且调用getChild(“/root”,true)方法,设置对root目录子节点的监控
2.datanode create 一个EPHEMERAL节点
3.触发master的Watcher process方法调用,在Globl配置中添加datanode ip或其他信息
- master选主
由于master可能要做些特别的事情,比如发放任务给task节点,那么如何选出一台master节点(每台机器创建一个EPHEMERAL_SEQUENTIAL节点,然后zookeeper把seq最低的节点选举为master,当节点断开后,再从中选seq最低的节点为master)
- 提供分布式同步支持(分布式锁等功能)