0 介绍

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

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种节点类型

类型 说明
持久节点(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);
} }

参考资料

ZooKeeper 入门的更多相关文章

  1. 分布式进阶(十六)Zookeeper入门基础

    Zookeeper入门基础 前言 在Zookeeper中,znode是一个跟Unix文件系统路径相似的节点,可以往这个节点存储或获取数据.如果在创建znode时Flag设置为EPHEMERAL,那么当 ...

  2. zookeeper 入门知识

    作为开启分布式架构的基石,除了必会还有的选么 自己的一些理解,有错误的话请一定要给予指正! 一.是什么? 分布式数据一致性的解决方案. 二.有什么用 数据的发布/订阅(配置中心)  . 负载均衡(du ...

  3. 学习Zookeeper之第1章Zookeeper入门

    第 1 章 Zookeeper入门 1.1 概述 1.2 特点 1.3 数据结构 1.4 应用场景 统一命名服务 统一配置管理 统一集群管理 服务器动态上下线 软负载均衡 1.5 下载地址 第 1 章 ...

  4. [转帖]Zookeeper入门看这篇就够了

    Zookeeper入门看这篇就够了 https://my.oschina.net/u/3796575/blog/1845035 Zookeeper是什么 官方文档上这么解释zookeeper,它是一个 ...

  5. Zookeeper入门(一)之概述

    今天主要讲这么几个方面? 1.分布式应用: 2.什么是Zookeeper: 3.使用Zookkeeper有什么好处: ZooKeeper是一种分布式协调服务,用于管理大型主机.在分布式环境中协调和管理 ...

  6. ZooKeeper入门(四)

    入门:使用ZooKeeper的协调分布式应用 这个文档使你对ZooKeeper快速入门,它主要针对想尝试它的开发者.并且包含简单的单机的ZooKeeper服务的安装说明,一些验证是否运行的命令,和一个 ...

  7. Zookeeper 入门第一篇

    转载原文地址: ZooKeeper学习总结 第一篇:ZooKeeper快速入门 ZooKeeper学习总结 第二篇:ZooKeeper深入探讨 ZooKeeper学习第一期---Zookeeper简单 ...

  8. java springboot整合zookeeper入门教程(增删改查)

    java springboot整合zookeeper增删改查入门教程 zookeeper的安装与集群搭建参考:https://www.cnblogs.com/zwcry/p/10272506.html ...

  9. Zookeeper入门看这篇就够了!!

    Zookeeper是什么 官方文档上这么解释zookeeper,它是一个分布式服务框架,是Apache Hadoop 的一个子项目,它主要是用来解决分布式应用中经常遇到的一些数据管理问题,如:统一命名 ...

  10. zookeeper入门学习

    1.基本概念 ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件.它是一个为分布式应用提供一致性服务的 ...

随机推荐

  1. 解决VIM编辑器中文乱码

    追加如下内容到/etc/vimr (或者不同的用户家目录下的.vimrc文件中) set encoding=utf8filetype plugin indent onsyntax on" s ...

  2. webpack独立打包与缓存处理

    关于 微信公众号:前端呼啦圈(Love-FED) 我的博客:劳卜的博客 知乎专栏:前端呼啦圈 前言 先前写了一篇webpack入门的文章<webpack入门必知必会>,简单介绍了webpa ...

  3. python实现mysql的读写分离及负载均衡

    Oracle数据库有其公司开发的配套rac来实现负载均衡,目前已知的最大节点数能到128个,但是其带来的维护成本无疑是很高的,并且rac的稳定性也并不是特别理想,尤其是节点很多的时候. 但是,相对my ...

  4. 【Egret】使用Egret开发的HTML5项目,使用本地电脑作为服务器进行移动端调试流程

    流程: 1.先开启本机IIS服务器 具体开启流程如下:http://www.jb51.net/article/29787.htm 2.添加服务器MIME类型, 按照以下两个教程把所有的MIME类型都添 ...

  5. 性能测试培训:tomcat性能调优方法

    性能测试培训:tomcat性能调优方法   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.在poptest的loadrunner ...

  6. 老李分享:QTP的录制原理以及实现

    老李分享:QTP的录制原理以及实现   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨询qq:9088 ...

  7. 1.Redis 的安装

    一.Redis 介绍 Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API. 作为Key-value型数据库,Red ...

  8. JDBC基础学习(五)—批处理插入数据

    一.批处理介绍      当需要成批插入或者更新记录时.可以采用Java的批量更新机制,这一机制允许多条语句一次性提交给数据库批量处理.通常情况下比单独提交处理更有效率. JDBC的批量处理语句包括下 ...

  9. 理解C++中的头文件和源文件的作用【转】

    一.C++编译模式通常,在一个C++程序中,只包含两类文件--.cpp文件和.h文件.其中,.cpp文件被称作C++源文件,里面放的都是C++的源代码:而.h文件则被称作C++头文件,里面放的也是C+ ...

  10. 小结:Swift、OC语言中多target在代码中如何区分

    一.对swift工程 经实践,网上的方法都无法成功,后来思考DEBUG宏定义方式,经实测有效,方式如下: 注意:不能把swift flags 小三角折叠后双击设置-DTarget4AppStore, ...