简介:
主要是用来维护和监控一个目录节点树中存储的数据的状态(维护一致性)
Path类型:
PERSISTENT:持久化目录节点,这个目录节点存储的数据不会丢失;
PERSISTENT_SEQUENTIAL:顺序自动编号的目录节点,这种目录节点会根据当前已近存在的节点数自动加 1,然后返回给客户端已经成功创建的目录节点名;
EPHEMERAL:临时目录节点,一旦创建这个节点的客户端与服务器端口也就是 session 超时,这种节点会被自动删除;
EPHEMERAL_SEQUENTIAL:临时自动编号节点
注:Zookeeper 中的目录节点权限不具有传递性,父目录节点的权限不能传递给子目录节点
访问权限:目录节点 ACL(访问权限)
perms:ALL、READ、WRITE、CREATE、DELETE、ADMIN
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.存储公共配置信息
1.集群中A机器创建一个PERSISTENT类型的/data目录,如下:zk.create("/testRootPath", "testRootData".getBytes(), Ids.OPEN_ACL_UNSAFE,
CreateMode.PERSISTENT);
2.其他机器在getData的时候添加watcher监控,一旦/data节点下的数据发送变化,则zookeeper服务器通知所有注册上来的观察者,回调它们的watcher方法,从而实现配置统一
2.集群管理
1.master创建一个root节点,并且调用getChild("/root",true)方法,设置对root目录子节点的监控
2.datanode create 一个EPHEMERAL节点
3.触发master的Watcher process方法调用,在Globl配置中添加datanode ip或其他信息
3.master选主
由于master可能要做些特别的事情,比如发放任务给task节点,那么如何选出一台master节点(每台机器创建一个EPHEMERAL_SEQUENTIAL节点,然后zookeeper把seq最低的节点选举为master,当节点断开后,再从中选seq最低的节点为master)
4.提供分布式同步支持(分布式锁等功能)