<从PAXOS到ZOOKEEPER分布式一致性原理与实践>读书笔记-第5章zookeeper使用

来源:互联网 发布:量子工作室 知乎 编辑:程序博客网 时间:2024/05/16 17:02

本文属于分布式系统学习笔记系列,上篇文章整理了zookeeper安装,本文继续整理第5章zookeeper使用,只做简单演示。

一 使用客户端脚本zkCli.sh

执行./zkCli.sh
出现以下信息表示连接成功。
WatchedEvent state:SyncConnected type:None path:null
[zk: localhost:2181(CONNECTED) 0] 
以上是默认连接本机地址,如果是希望连接其它指定的zookeeper服务器。
zkCli.sh -server ip:port

1.1 创建

create [-s] [-e] path data acl

-s -e分别代表顺序、临时节点,不用默认的是永久节点。

acl表示访问权限,默认是不做任何权限控制。

1.2 获取 

ls是列出指定节点的所有子节点。

用法: ls path [watch]

get 获取指定节点的数据。

用法: get path [watch] 

1.3 更新

set 更新指定节点的数据内容。

用法:set path data [version]

version表示节点数据是由版本的。

1.4 删除

delete 删除指定节点 

用法:delete path [version]

下面是一个简单演示。

二 使用java客户端操作

书上介绍了比较多的方式,这里只筛选一小部分基于zkClient实现。

首先在maven里面引入依赖配置:

<dependency>      <groupId>com.github.sgroschupf</groupId>      <artifactId>zkclient</artifactId>      <version>0.1</version>    </dependency><dependency>      <groupId>org.apache.zookeeper</groupId>      <artifactId>zookeeper</artifactId>      <version>3.4.3</version>    </dependency>
创建会话

private void initZk() {String zkServers = "192.168.190.36:2181";String expireTime ="60000";try {if(zk!=null){try {zk.close();} catch (InterruptedException e1) {log.error(e1.getMessage(), e1);}}zk = new ZooKeeper(zkServers, Integer.parseInt(expireTime), new Watcher() {@Overridepublic void process(WatchedEvent event) {log.info(event.toString());}});}catch (NumberFormatException e) {log.error(e.getMessage(), e);}catch (IOException e) {log.error(e.getMessage(), e);}}

zookeeper操作节点相关代码

public boolean exists(String path) {Stat stat = null;try {stat = zk.exists(path, false);}catch (KeeperException e) {log.error(e.getMessage(), e);if (e.code() == KeeperException.Code.SESSIONEXPIRED) {initZk();return exists(path);}}catch (InterruptedException e) {log.error(e.getMessage(), e);}return stat != null;}public boolean createNewFile(String path) {boolean succuess = false;String parentPath = path.substring(0, path.lastIndexOf('/'));if (!"/".equals(parentPath)&&!"".equals(parentPath)) {if (!exists(parentPath)) {createNewFile(parentPath);}}try {zk.create(path, null, Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);succuess = true;}catch (KeeperException e) {if (e.code() == KeeperException.Code.NODEEXISTS) {return false;}if (e.code() == KeeperException.Code.SESSIONEXPIRED||e.code()==KeeperException.Code.CONNECTIONLOSS) {initZk();return createNewFile(path);}log.error(e.getMessage(), e);}catch (InterruptedException e) {log.error(e.getMessage(), e);}return succuess;}//设置对应znode下的数据 , -1表示匹配所有版本     public boolean setFileData(String path,byte[] data)    {    boolean succuess = false;        try {zk.setData(path, data, -1);} catch (KeeperException e) {if (e.code() == KeeperException.Code.SESSIONEXPIRED) {initZk();return setFileData(path,data);}log.error(e.getMessage(), e);} catch (InterruptedException e) {log.error(e.getMessage(), e);}    return succuess;    }
测试demo

public class ZKTest {public static void main(String[] args) {// TODO Auto-generated method stubZookeeperOperator oper = new ZookeeperOperator();oper.createNewFile("/zktest/a");oper.setFileData("/zktest/a", "1".getBytes());boolean res =oper.exists("/zktest/a");System.out.println(res);}}
本机输出:



我们看下服务器的过程:参见下面的截图,红线之上是java程序运行之前,红线后是java程序运行之后。

可见确实能方便用java来操作zookeeper的结点。


下面是书上的listener例子

import org.I0Itec.zkclient.IZkDataListener;import org.I0Itec.zkclient.ZkClient;public class ZKTest {public static void main(String[] args) throws InterruptedException {// TODO Auto-generated method stubZkClient client = new ZkClient("192.168.190.36:2181",50000);String path ="/zktest/a";client.writeData(path, "2");client.subscribeDataChanges(path, new IZkDataListener(){@Overridepublic void handleDataChange(String dataPath, Object data)throws Exception {System.out.println("node"+dataPath+"chaged,new data:"+data);}@Overridepublic void handleDataDeleted(String dataPath) throws Exception {System.out.println("node"+dataPath+"deleted");}});System.out.println( client.readData(path) );client.writeData(path, "4");System.out.println( "begin sleep" );    Thread.sleep(20000);    System.out.println( "over" );}}

书上作者还介绍了另一种客户端curator,这里不多介绍。

总结:

本文简单总结第5章的zookeeper使用,下一篇是结合第6章的典型zookeeper场景来学习。


0 0
原创粉丝点击