zookeeper特性

顺序同等性: 事务要求终极会严格按顺序实行原子性:可靠性:实时性:单一视图:

安装

mzx铝合金门锁_分布式系列zookeeper简单用法 玻璃门

利用windows的linux子系统时: cd /mnt/e/chromedownload/转到windows下载路径

拷贝 cp /mnt/e/chromedownload/zookeeper.tar.gz /program/zookeeper.tar.gz

转到 cd /program 如果没有的先mkdir program

解压 tar -zxvf zookeeper.tar.gz

转到 cd ZK_HOME/conf

拷贝 cp zoo_sample.cfg zoo.cfg

转到 cd ZK_HOME/bin

启动 sh zkServer.sh start

集群搭建

zoo.cfg中配置集群, 配置格式如 server.id=ip:port:port ; 有几台就配置几个.例如:server.1=192.168.1.145:2897:3181server.2=192.168.1.146:2897:3181server.3=192.168.1.147:2897:3181zoo.cfg中的dataDir所配置的目录下新增myid文件, 值对应server.id的idzoo.cfg中, 如果须要observer,则添加peerType=observer, 并且修正server.id=ip:port:port:observer

zoo.cfg 配置

tickTime=2000 zk的方法最小韶光单位initTime=10 时长为10tickTime, follow节点和leader节点同步的韶光syncLimit=5 时长为5tickTime, leader和follow几点进行心跳检测的最大延迟韶光dataDir=/tmp/zookeeper 存储快照文件的目录dataLogDir = /log/zookeeper 事务日志的存储路径, 默认在dataDir下clientPort=2181 连接zookeeper的默认端口

zookeeper几个观点

znode: zookeeper数据存储为树形构造, 深度层级没有限定, znode是数据存储节点,是zookeeper的最小存储单元. 分为1.持久化节点;2.持久化有序节点;3.临时节点;4.临时有序节点;临时节点, 是会话时天生的节点, 会话结束后节点会自动删除.

客户端命令操作

help 可以查看客户端支持的命令

create [-s] [-e] node : 创建节点 -s是有序 -e临时节点get path [watch] 获取节点的信息set path data [version] : 修正节点的值delete path [version] : 删除节点, 当节点有子节点时无法删除

[version] 乐不雅观锁

[Watcher] 供应了发布/订阅, 许可客户端向做事器端注册一个监听, 当做事端触发指定事宜时会触发watcher,做事端向客户端发送一个关照.

Watcher是一次性的, 触发一次后自动失落效

信息节点

stat path 可以查看节点的信息

cversion=0 子节点的版本AclVersion=0 acl的版本号, 权限掌握干系dataVersion=1 数据的版本号cxid 创建的事务idmzxid 末了一次修正的事务idpzxid 子节点末了一次修正的事务idephemeralOwner 临时会话的iddataLength 数据长度numChidren 子节点数量

java开拓

引用依赖

<dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> <version>3.5.4-beta</version></dependency>

java代码

/ 定义Watcher /public class MyWatcher implements Watcher { @Override public void process(WatchedEvent event) { if(event.getState()== Event.KeeperState.SyncConnected){ System.out.println(\公众---->>>>>\"大众+event.getType()); System.out.println(\"大众---->>>>>\"大众+event.getPath()); } }}//测试public class MySession { private static final String CONN = \"大众localhost:2181\公众; private static Stat stat = new Stat(); public static void main(String[] args) throws IOException, KeeperException, InterruptedException { ZooKeeper zooKeeper = new ZooKeeper(CONN,1000,new MyWatcher()); // 创建 zooKeeper.create(\公众/xlx\公众,\"大众this is a string\"大众.getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); // 查询,注册watcher byte[] rst = zooKeeper.getData(\"大众/xlx\公众,true,stat); System.out.println(new String(rst)); //删除(只能删除永久节点) zooKeeper.delete(\公众/xlx\"大众,-1); // 创建 zooKeeper.create(\"大众/xlx\公众,\公众this is a string\"大众.getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); // 查询 byte[] rs = zooKeeper.getData(\"大众/xlx\公众,true,stat); System.out.println(new String(rs)); // 注册watcher zooKeeper.exists(\"大众/xlx/yy\"大众,true); // 创建 zooKeeper.create(\公众/xlx/yy\"大众,\"大众this is a sub child string\公众.getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); // 获取子节点 List<String> children = zooKeeper.getChildren(\"大众/xlx\"大众, true); System.out.println(children); //删除(只能删除永久节点) zooKeeper.delete(\公众/xlx/yy\公众,-1); // 修正 zooKeeper.setData(\公众/xlx\"大众,\"大众this is a modified string\"大众.getBytes(),-1); byte[] rss = zooKeeper.getData(\公众/xlx\公众,true,stat); System.out.println(new String(rss)); //删除(只能删除永久节点) zooKeeper.delete(\"大众/xlx\"大众,-1); // watcher 异步的, 这里勾留段韶光才可以查看到watcher打印的信息 Thread.sleep(2000); }}

三方API

zkClientcurator 这个用的较多,Netflix开源

curator开拓

特点:

抽象层次更高链式编程风格异步回调

public class CuratorSession { private static final String CONN = \公众localhost:2181\公众; public static void main(String[] args) throws Exception { // 创建 CuratorFramework curatorFramework = CuratorFrameworkFactory.newClient(CONN, 2000, 5000, new ExponentialBackoffRetry(1000,3)); curatorFramework.start(); System.out.println(curatorFramework.getState()); //另一种办法 //curatorFramework = CuratorFrameworkFactory.builder().build(); // 新增节点 curatorFramework.create().creatingParentsIfNeeded().withMode(CreateMode.PERSISTENT).forPath(\"大众/curator/chd/dd\"大众,\"大众dfadfe\"大众.getBytes()); //读取 byte[] data = curatorFramework.getData().forPath(\"大众/curator/chd/dd\公众); java.lang.String string = new java.lang.String(data); System.out.println(string); // 修正 Stat stat = curatorFramework.setData().forPath(\公众/curator/chd/dd\"大众,\"大众fdaefv\"大众.getBytes()); System.out.println(stat); curatorFramework.setData().inBackground(new BackgroundCallback() { @Override public void processResult(CuratorFramework client, CuratorEvent event) throws Exception { System.out.println(event); } }).forPath(\"大众/curator/chd/dd\"大众,\公众fafdae\"大众.getBytes()); //删除 curatorFramework.delete().guaranteed().deletingChildrenIfNeeded().forPath(\公众/curator/chd\"大众); Thread.sleep(2000); }}

这些代码写下来就算入门了, curator真正有用的利用场景还没打仗到, 比如分布式锁,leader选举等, curator有示例程序, 可以在github上查看Curator源码.