zookeeper 笔记
NodeCache: 监视当前节点的增删改, 并将节点数据缓存到本地PathChildrenCache: 监视一个路劲下孩子节点的创建, 删除,修改TreeCache : PathChildrenChache+NodeCahce的合体, 监视路径下创建,删除,修改, 并缓存路径下所有孩子节点的数据.
zookeeper 的视图结构
和标准的文件系统非常类似,每一个节点称之为 ZNode,是 zookeeper 的最小单元。每个 znode上都可以保存数据以及挂载子节点。构成一个层次化的树形结构
持久节点(PERSISTENT)创建后会一直存在 zookeeper 服务器上,直到主动删除
持久有序节点(PERSISTENT_SEQUENTIAL)每个节点都会为它的一级子节点维护一个顺序
临时节点(EPHEMERAL)临时节点的生命周期和客户端的会话绑定在一起,当客户端会话失效该节点自动清理
CONTAINER 当子节点都被删除后,Container 也随即删除PERSISTENT_WITH_TTL 超过 TTL 未被修改,且没有子节点
PERSISTENT_SEQUENTIAL_WITH_TTL 客户端断开连接后不会自动删除 Znode,如果该 Znode 没有子 Znode 且在给定 TTL 时间内无修改,该 Znode 将会被删除;TTL 单位是毫秒,必须大于0 且小于或等于 EphemeralType.MAX_TTL
Stat 状态信息
每个节点除了存储数据内容以外,还存储了数据节点本身的一些状态信息,通过 get 命令可以获得状态信息的详细内容
其中version,cversion,aversion保证数据的一致性. 其使用的是乐观锁.
Watcher
zookeeper 提供了分布式数据的发布/订阅功能,zookeeper 允许客户端向服务端注册一个 watcher 监听,当服务端的一 些指定事件触发了 watcher,那么服务端就会向客户端发送一个事件通知。
值得注意的是,Watcher 通知是一次性的,即一旦触发一次 通知后,该 Watcher 就失效了,因此客户端需要反复注册 Watcher,即程序中在 process 里面又注册了 Watcher,否则, 将无法获取 c3 节点的创建而导致子节点变化的事件。
JAVA 访问zookeeper
推荐使用Curator
<dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-framework</artifactId> <version>2.10.0</version> </dependency>
代码演示如下:
public class CuratorDemo { private static String Connect_string = "x.x.x.x:2181"; private static String strPath = "/data1"; public static void main(String[] args) throws Exception { CuratorFramework curatorFramework = CuratorFrameworkFactory.builder().connectString(Connect_string).sessionTimeoutMs(5000).retryPolicy(new ExponentialBackoffRetry(1000, 3)).build(); curatorFramework.start(); // // curatorFramework.start(); // ACTTest(curatorFramework); WatchDemo(curatorFramework); // WatchCacheDemo(curatorFramework); System.in.read(); } private static void create_node(CuratorFramework curatorFramework) throws Exception { curatorFramework.create().creatingParentsIfNeeded().withMode(CreateMode.PERSISTENT). forPath("/data/program", "test".getBytes()); } private static void update_node(CuratorFramework curatorFramework) throws Exception { curatorFramework.setData().forPath(strPath, "2".getBytes()); } private static void delete_node(CuratorFramework curatorFramework) throws Exception { Stat stat = new Stat(); String val = new String(curatorFramework.getData().storingStatIn(stat).forPath(strPath)); curatorFramework.delete().withVersion(stat.getVersion()).forPath(strPath); } private static void ACTTest(CuratorFramework curatorFramework) throws Exception { List<ACL> acls = new ArrayList<ACL>(); ACL ac = new ACL(ZooDefs.Perms.READ | ZooDefs.Perms.WRITE, new Id("digest", DigestAuthenticationProvider.generateDigest("admin:admin"))); acls.add(ac); curatorFramework.create().creatingParentsIfNeeded().withMode(CreateMode.PERSISTENT).withACL(acls).forPath("/authNoPassword"); } private static void WatchDemo(CuratorFramework curatorFramework) throws Exception { TreeCache treeCache = new TreeCache(curatorFramework, "/watch"); TreeCacheListener treeCacheListener = new TreeCacheListener() { @Override public void childEvent(CuratorFramework curatorFramework, TreeCacheEvent treeCacheEvent) throws Exception { System.out.println(treeCacheEvent.getType() + "-> " + treeCacheEvent.getData()); } }; treeCache.getListenable().addListener(treeCacheListener); treeCache.start(); } private static void WatchCacheDemo(CuratorFramework curatorFramework) throws Exception { final NodeCache nodeCache = new NodeCache(curatorFramework, "/node", false); NodeCacheListener nodeCacheListener = new NodeCacheListener() { @Override public void nodeChanged() throws Exception { System.out.println(new String(nodeCache.getCurrentData().getData())); } }; nodeCache.getListenable().addListener(nodeCacheListener); nodeCache.start(); } }
Curator 内部实现的几种重试策略:
• ExponentialBackoffRetry:重试指定的次数, 且每一次重试之 间停顿的时间逐渐增加.
• RetryNTimes:指定最大重试次数的重试策略
• RetryOneTime:仅重试一次
• RetryUntilElapsed:一直重试直到达到规定的时间
权限模式
IP: 针对地址颗粒进行控制: 如: ip:192.168.0.1/24 Digest: 常用控制,类似username:pwd , 设置的时候需要加密DigestAuthenticationProvider.generateDigest() world: 最开放式的控制方式, 访问规则对所有用户开放
super:超级用户模式Demo:Id ipId1 = new Id("ip", "192.168.190.1");Id ANYONE_ID_UNSAFE = new Id("world", "anyone");
ZK事件包括:
EventType.NodeCreated 当 node-x 这个节点被创建时,该事件被触发
EventType.NodeChildrenChanged 当 node-x 这个节点的直接子节点被创建、被删除、子节点数据发生变更时,该事件被触发。
EventType.NodeDataChanged 当 node-x 这个节点的数据发生变更时,该事件被触发
EventType.NodeDeleted 当 node-x 这个节点被删除时,该事件被触发。
EventType.None 当 zookeeper 客户端的连接状态发生变更时,即 KeeperState.Expired、KeeperState.Disconnected、 KeeperState.SyncConnected、KeeperState.Aut
事件监听机制推荐使用curator-recipes
<dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-recipes</artifactId> <version>2.10.0</version> </dependency>
监听节点分类, demo参照上面代码
NodeCache: 监视当前节点的增删改, 并将节点数据缓存到本地
PathChildrenCache: 监视一个路劲下孩子节点的创建, 删除,修改
TreeCache : PathChildrenChache+NodeCahce的合体, 监视路径下创建,删除,修改, 并缓存路径下所有孩子节点的数据.