zoukankan      html  css  js  c++  java
  • ZooKeeper 入门

    0 介绍

    官网:http://zookeeper.apache.org/

    ZooKeeper是Hadoop的正式子项目,它是一个针对大型分布式系统的可靠协调系统,提供的功能包括:配置维护、名字服务、分布式同步、组服务等。ZooKeeper的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。

    ZooKeeper代码版本中,提供了分布式独享锁、选举、队列的接口,代码在zookeeper-x.x.xsrc ecipes。其中分布锁和队列有Java和C两个版本,选举只有Java版本。

    ZooKeeper是可以集群复制的,集群间通过Zab(ZooKeeper Atomic Broadcast)协议来保持数据的一致性。

    原理:http://cailin.iteye.com/blog/2014486/


    1 安装

    1.1 前提

    需配置Java运行环境

    1.2 下载

    http://mirrors.cnnic.cn/apache/zookeeper

    https://mirrors.cnnic.cn/apache/zookeeper/zookeeper-3.4.10/zookeeper-3.4.10.tar.gz

    1.3 解压

    解压到自己想要的目录即可

    1.4 配置

    可通过复制conf/zoo_sample.cfg文件,命名为zoo.cfg,然后进行修改。

    示例

    # ZooKeeper 服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个 tickTime 时间就会发送一个心跳。
    tickTime=2000
    
    # 投票选举新leader的初始化时间
    initLimit=10
    
    # 集群中的follower服务器与leader服务器之间请求和应答之间能容忍的最多心跳数(tickTime的数量)
    syncLimit=5
    
    # 保存数据的目录
    dataDir=D:\zookeeper\data
    #保存日志文件的目录
    dataLogDir=D:\zookeeper\log
    
    # 客户端启动端口
    clientPort=2181
    

    1.5 运行

    双击bin/zkServer.cmd启动ZooKeeper启动服务端。

    binzkCli.cmd -server 127.0.0.1:2181启动客户端操作。


    2 结构

    ZooKeeper的核心类似一个精简的文件系统,提供一些简单的操作和一些附件的抽象(例如,znode的排序与watch)。

    有4种节点类型

    类型 说明
    持久节点(PERSISTENT) 节点创建后,就一直存在,直到有删除操作来主动清除这个节点
    持久顺序节点(PERSISTENT_SEQUENTIAL) 持久化节点,每个父节点会为他的第一级子节点维护一个单调增数
    临时节点(EPHEMERAL) 临时节点的生命周期和客户端会话绑定。也就是说,如果客户端会话失效,那么这个节点就会自动被清除掉。
    临时顺序节点(EPHEMERAL_SEQUENTIAL) 临时节点,每个父节点会为他的第一级子节点维护一个单调增数,可用于实现分布式锁

    3 常用命令

    • help:查看可执行的命令
    • quit:退出客户端
    • ls:查看某个节点下的数据
    • create:在某个节点下创建子节点
    • delete:删除子节点
    • rmr:删除路径
    • get:获取节点数据
    • set:设置节点数据

    4 在Java中进行使用

    导入相应的jar包,这里使用Maven进行jar包的管理,如下配置

    <zookeeper.version>3.4.10</zookeeper.version>
    <zkclient.version>0.10</zkclient.version>
    
    <dependency>
    	<groupId>org.apache.zookeeper</groupId>
    	<artifactId>zookeeper</artifactId>
    	<version>${zookeeper.version}</version>
    </dependency>
    <dependency>
    	<groupId>com.101tec</groupId>
    	<artifactId>zkclient</artifactId>
    	<version>${zkclient.version}</version>
    </dependency>
    

    org.apache.zookeeper.ZooKeeper的使用

    import org.apache.zookeeper.CreateMode;
    import org.apache.zookeeper.KeeperException;
    import org.apache.zookeeper.WatchedEvent;
    import org.apache.zookeeper.Watcher;
    import org.apache.zookeeper.ZooDefs.Ids;
    import org.apache.zookeeper.ZooKeeper;
    import org.apache.zookeeper.data.Stat;
    
    public class ZooKeeperTest {
    	private static final String ZK_CONNECT_URL = "127.0.0.1:2181";
    	private static final int SESSION_TIMEOUT = 3000;
    	
    	// 这里直接抛出Exception,实际项目中需要自行捕获异常
    	public static void main(String[] args) throws Exception {
    		ZooKeeper zooKeeper = new ZooKeeper(ZK_CONNECT_URL, SESSION_TIMEOUT, null);
    		// 设置监听器
    		zooKeeper.register(new ZkWatcher(zooKeeper, "/root"));
    		
    		// 创建root节点,其包含的数据为“root data”,设置访问权限为所有人均可访问,创建模式为持久化节点
    		zooKeeper.create("/root", "root data".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
    		
    		// 设置节点内容,-1无视版本,如果版本与服务器上版本不一致则抛出异常
    		zooKeeper.setData("/root", "new data".getBytes(), -1);
    		
    		// 获取节点内容
    		Stat stat = new Stat();
    		System.out.println(new String(zooKeeper.getData("/root", false, stat)));
    
    		// 创建子节点
    		zooKeeper.create("/root/child", "child".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
    		
    		// 删除节点,必须先删除子节点才能删除根节点,不然会报错
    		zooKeeper.delete("/root/child", -1);
    		zooKeeper.delete("/root", -1);
    	}
    	
    	// 节点监听器
    	private static class ZkWatcher implements Watcher {
    		private ZooKeeper zooKeeper;
    		private String path;
    		
    		public ZkWatcher(ZooKeeper zooKeeper, String path) {
    			this.zooKeeper = zooKeeper;
    			this.path = path;
    		}
    		
    		@Override
    		public void process(WatchedEvent event) {
    			System.out.println("watcher:" + event.getType());
    			// 由于Watcher的监听只能是一次性,所以需要这样处理,或者改用ZkClient进行实现
    			try {
    				zooKeeper.exists(path, true);
    			} catch (KeeperException e) {
    				e.printStackTrace();
    			} catch (InterruptedException e) {
    				e.printStackTrace();
    			}
    		}
    	}
    
    }
    

    org.I0Itec.zkclient.ZkClient的使用

    import org.I0Itec.zkclient.IZkDataListener;
    import org.I0Itec.zkclient.ZkClient;
    import org.apache.zookeeper.CreateMode;
    
    public class ZkClientTest {
    	private static final String ZK_CONNECT_URL = "127.0.0.1:2181";
    	private static final String PATH = "/zkclient";
    	
    	public static void main(String[] args) {
    		ZkClient zkClient = new ZkClient(ZK_CONNECT_URL);
    		
    		zkClient.subscribeDataChanges(PATH, new IZkDataListener() {
    			
    			@Override
    			public void handleDataDeleted(String dataPath) throws Exception {
    				System.out.println("handleDataDeleted dataPath:" + dataPath);
    			}
    			
    			@Override
    			public void handleDataChange(String dataPath, Object data) throws Exception {
    				System.out.println("handleDataChange dataPath:" + dataPath + " data:" + data);
    				
    			}
    		});
    		
    		// 创建节点
    		zkClient.create(PATH, "Hello", CreateMode.PERSISTENT);
    		
    		// 设置节点数据
    		zkClient.writeData(PATH, "new");
    		
    		// 获取数据
    		System.out.println(zkClient.readData(PATH));
    		
    		// 创建子节点
    		zkClient.create(PATH + "/child", "child", CreateMode.PERSISTENT);
    		
    		// 获取子节点信息
    		System.out.println(zkClient.getChildren(PATH));
    		
    		// 删除节点
    		zkClient.delete(PATH + "/child");
    		zkClient.delete(PATH);
    	}
    
    }
    

    参考资料

  • 相关阅读:
    div嵌套出现的样式问题
    知乎最多支持答案的黄色渐隐效果
    对话框图形的css实现方式
    排序算法的相关问题
    数据库优化
    常用的Java基本代码汇总
    浅谈getStackTrace()方法(一)
    ECharts学习总结(三)-----基本概念分析
    ECharts学习总结(二)-----图表组件漏斗图(funnel)
    Echarts学习总结(一)-----柱状图
  • 原文地址:https://www.cnblogs.com/powercto/p/6844798.html
Copyright © 2011-2022 走看看