ZooKeeper 入门
来源:互联网 发布:python获取当前日期 编辑:程序博客网 时间:2024/06/07 02:11
ZooKeeper是Hadoop的正式子项目,它是一个针对大型分布式系统的可靠协调系统,提供的功能包括:配置维护、名字服务、分布式同步、组服务等。ZooKeeper的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。
ZooKeeper代码版本中,提供了分布式独享锁、选举、队列的接口,代码在zookeeper-x.x.x\src\recipes。其中分布锁和队列有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启动服务端。
bin\zkCli.cmd -server 127.0.0.1:2181
启动客户端操作。
2 结构
ZooKeeper的核心类似一个精简的文件系统,提供一些简单的操作和一些附件的抽象(例如,znode的排序与watch)。
有4种节点类型
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); }}
- zookeeper 入门
- zookeeper 入门
- Zookeeper入门
- Zookeeper入门
- Zookeeper入门
- zookeeper入门
- ZooKeeper入门
- zookeeper入门
- ZooKeeper入门
- Zookeeper入门
- zookeeper入门
- zookeeper入门
- zookeeper入门
- Zookeeper-入门
- zookeeper入门
- zookeeper 入门
- zookeeper 入门
- Zookeeper入门
- Spring面向切面编程(AOP)
- 类的启动过程
- 自定义View:自定义CircleImageView实现及图形渲染
- js函数作用域及this指向
- mysqli使用预处理技术进行数据库查询的方法
- ZooKeeper 入门
- 做一个简单的太阳系(二)
- Maven介绍,包括作用、核心概念、用法、常用命令、扩展及配置
- 山东省第八届ACM省赛 K 题 CF (排序01背包)
- "<<"运算符的重载
- Maven
- 代码抽象
- 数组中包含对象的去重方法
- linux下rename命令的用法——适合大批量修改文件名