读书笔记-第5章zookeeper使用

本文属于分布式系统学习笔记系列,上篇文章整理了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]

下面是一个简单演示。

读书笔记-第5章zookeeper使用_第1张图片

二 使用java客户端操作

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

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


      com.github.sgroschupf
      zkclient
      0.1
    

      org.apache.zookeeper
      zookeeper
      3.4.3
    
创建会话

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() {

				@Override
				public 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 stub

		ZookeeperOperator oper = new ZookeeperOperator();
		oper.createNewFile("/zktest/a");
		oper.setFileData("/zktest/a", "1".getBytes());
		boolean res =oper.exists("/zktest/a");
		System.out.println(res);
	}

}
本机输出:

读书笔记-第5章zookeeper使用_第2张图片

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

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

读书笔记-第5章zookeeper使用_第3张图片

下面是书上的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 stub

		ZkClient client = new ZkClient("192.168.190.36:2181",50000);
		String path ="/zktest/a";
		client.writeData(path, "2");
		client.subscribeDataChanges(path, new IZkDataListener(){

			@Override
			public void handleDataChange(String dataPath, Object data)
					throws Exception {		
				System.out.println("node"+dataPath+"chaged,new data:"+data);
			}

			@Override
			public 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" );
	}

}
读书笔记-第5章zookeeper使用_第4张图片
书上作者还介绍了另一种客户端curator,这里不多介绍。

总结:

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


你可能感兴趣的:(zookeeper,java,zkclient,zkcli.sh,分布式)