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);
    	}
    
    }
    

    参考资料

  • 相关阅读:
    严重: Parse error in application web.xml file at jndi:/localhost/ipws/WEBINF/web.xml java.lang.NoSuchMethodException: org.apache.catalina.deploy.WebXml
    Failed to install .apk on device 'emulator5554': timeout解决方法
    java.lang.NoClassDefFoundError:org.jsoup.Jsoup
    Conversion to Dalvik format failed: Unable to execute dex:解决方法
    apache Digest: generating secret for digest authentication ...
    Description Resource Path Location Type Project has no default.properties file! Edit the project properties to set one.
    android service随机自启动
    MVC3 安装部署
    EF 4.3 CodeBased 数据迁移演练
    SQL Server 2008开启sa账户
  • 原文地址:https://www.cnblogs.com/powercto/p/6844798.html
Copyright © 2011-2022 走看看