首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Zookeeper 快速上手

Zookeeper 快速上手

作者头像
用户1212940
发布于 2020-03-18 09:22:11
发布于 2020-03-18 09:22:11
58200
代码可运行
举报
文章被收录于专栏:LambdaLambda
运行总次数:0
代码可运行

快速上手

Zookeeper 是什么

官方是这么解释 Zookeeper的,它是一个分布式服务框架,是 Apache Hadoop 的一个子项目,它主要是用来解决分布式应用中经常遇到的一些数据管理问题,如:统一命名服务、状态同步服务、集群管理、分布式应用配置项的管理等。

简单来说 Zookeeper = 文件系统 + 监听通知机制

功能总结

文件系统

Zookeeper 维护一个类似文件系统的数据结构,可以为客户端管理少量数据 k-v

每个子目录项如 NameService 都被称作为 znode(目录节点),和文件系统一样,我们能够自由的增加、删除 znode,在一个 znode 下增加、删除子 znode,唯一的不同在于 znode 是可以存储数据的。

监听通知机制

客户端注册监听它关心的目录节点,当目录节点发生变化(数据改变、被删除、子目录节点增加删除)时,Zookeeper 会通知客户端

Zookeeper 应用场景

Zookeeper 功能非常强大,可以实现诸如 分布式应用配置管理、统一命名服务、状态同步服务、集群管理等功能,我们这里拿比较简单的分布式应用配置管理为例来说明。

假设我们的程序是分布式部署在多台机器上,如果我们改变程序的配置文件,需要逐台机器去修改,非常麻烦,现在把这些配置放在 Zookeeper 上去,保存在 Zookeeper 的某个目录节点中,然后所有相关应用程序对这个目录节点进行监听,一旦配置信息发生变化,每个应用程序就会收到 Zookeeper 的通知,然后从 Zookeeper 获取新的配置信息应用到系统中。

如上,你大致应该了解zookeeper是个什么东西,大概能做些什么了,我们马上来学习下zookeeper的安装及使用,并开发一个小程序来实现zookeeper这个分布式配置管理的功能。

Zookeeper 单击模式安装

  • Step1:配置JAVA环境,检验环境:java -version
  • Step2:下载并解压zookeeper
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# cd /usr/local
# wget http://mirror.bit.edu.cn/apache/zookeeper/stable/zookeeper-3.4.12.tar.gz
# tar -zxvf zookeeper-3.4.12.tar.gz
# cd zookeeper-3.4.12
  • Step3:重命名配置文件zoo_sample.cfg
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# cp conf/zoo_sample.cfg conf/zoo.cfg
  • Step4:启动zookeeper
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# bin/zkServer.sh start
  • Step5:检测是否成功启动,用zookeeper客户端连接下服务端
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# bin/zkCli.sh

Zookeeper 使用

使用客户端命令操作 Zookeeper

1、使用 ls 命令来查看当前 ZooKeeper 中所包含的内容

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[zk: localhost:2181(CONNECTED) 0] ls /
[zookeeper]

2、创建一个新的 znode ,使用 create /zkPro myData

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[zk: localhost:2181(CONNECTED) 0] create /zkPro myData
Created /zkPro

3、再次使用 ls 命令来查看现在 zookeeper 中所包含的内容:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[zk: localhost:2181(CONNECTED) 1] ls /
[zookeeper, zkPro]

4、下面我们运行 get 命令来确认第二步中所创建的 znode 是否包含我们所创建的字符串:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[zk: localhost:2181(CONNECTED) 2] get /zkPro
myData
cZxid = 0x4
ctime = Thu Feb 27 12:00:32 CST 2020
mZxid = 0x4
mtime = Thu Feb 27 12:00:32 CST 2020
pZxid = 0x4
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 6
numChildren = 0

5、下面我们通过 set 命令来对 zk 所关联的字符串进行设置

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[zk: localhost:2181(CONNECTED) 0] set /zkPro myData1
cZxid = 0x4
ctime = Thu Feb 27 12:00:32 CST 2020
mZxid = 0x9
mtime = Thu Feb 27 12:02:46 CST 2020
pZxid = 0x4
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 7
numChildren = 0
[zk: localhost:2181(CONNECTED) 1] get /zkPro
myData1
cZxid = 0x4
ctime = Thu Feb 27 12:00:32 CST 2020
mZxid = 0x9
mtime = Thu Feb 27 12:02:46 CST 2020
pZxid = 0x4
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 7
numChildren = 0

6、下面我们将刚才创建的 znode 删除

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[zk: localhost:2181(CONNECTED) 0] delete /zkPro
[zk: localhost:2181(CONNECTED) 1] ls /
[zookeeper]

使用 Java API 操作 Zookeeper

再此之前我们需要学习下有关 Zookeepe 的类型 znode:

  • PERSISTENT - 持久化目录节点 客户端与zookeeper断开连接后,该节点依旧存在
  • EPHEMERAL - 短暂(临时)目录节点 客户端与zookeeper断开连接后,该节点被删除
  • SEQUENTIAL - 带序号目录节点 zk会自动拼接上一个序号,而且序号是递增的

组合类型:

  • PERSISTENT:持久不带序号
  • EPHEMERAL :短暂不带序号
  • PERSISTENT_SEQUENTIAL:持久带序号
  • EPHEMERAL_SEQUENTIAL:短暂带序号

使用Java API操作zookeeper需要引用下面的包

  1. 导入依赖包
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.4.12</version>
        </dependency>
  1. 编写测试用例
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.pyy.zk;

import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.ZooDefs;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.data.Stat;
import org.junit.Before;
import org.junit.Test;

import java.io.IOException;
import java.util.List;

/**
 * ---------------------------
 * Zookeeper Java API 简单实例Demo
 * ---------------------------
 * 作者:  pyy
 * 时间:  2020-02-27 12:26
 * 版本:  v1.0
 * ---------------------------
 */
public class ZookeeperClientDemo {
    private ZooKeeper zk = null;

    @Before
    public void init() throws IOException {
        // zookeepe客户端
        zk = new ZooKeeper("10.10.50.140:2181", 2000, null);
    }

    @Test
    public void testCerate() throws Exception {
        // 参数1:要创建节点路径 参数2:数据  参数3:访问权限 参数4:节点类型
        String path = zk.create("/hello/b", "hello-zk-b".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
        System.out.println("持久节点创建成功:" + path);
        zk.close();
    }

    @Test
    public void testCerateSon() throws Exception {
        // 参数1:要创建节点路径 参数2:数据  参数3:访问权限 参数4:节点类型
        String path = zk.create("/hello/b", "hello-zk-b".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
        System.out.println("持久节点创建成功:" + path);
        zk.close();
    }

    @Test
    public void testUpdate() throws Exception {
        // 参数1:节点路径 参数2:数据 参数3:要修改的版本, -1 代表任何版本
        Stat stat = zk.setData("/hello", "hello-update".getBytes(), -1);
        System.out.println("持久节点修改成功:" + stat);
        zk.close();
    }

    @Test
    public void testGet() throws Exception {
        // 参数1:节点路径 参数2:是否要监听 参数3:要修改的版本, null代表最新版本
        byte[] data = zk.getData("/hello", false, null);
        System.out.println("持久节点查询成功:" + new String(data));
        zk.close();
    }

    @Test
    public void testGetChildren() throws Exception {
        // 参数1:节点路径 参数2:是否要监听
        // 注意:返回的结果中只有子节点的名字,不带全路径
        List<String> children = zk.getChildren("/hello", false);
        for (String child : children) {
            System.out.println("子节点:" + child);
        }
        zk.close();
    }


    @Test
    public void testDelete() throws Exception {
        // 参数1:节点路径 参数2:版本 -1 所有版本
        zk.delete("hello", -1);
        System.out.println("持久节点删除成功:");
        zk.close();
    }
}

分布式配置中心案例

  1. 在zookeeper里增加一个目录节点,并且把配置信息存储在里面
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[zk: localhost:2181(CONNECTED) 4] create /username root
Created /username
  1. 启动两个zookeeper客户端程序,代码如下所示
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.pyy.zk;

import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.data.Stat;

import java.util.concurrent.CountDownLatch;

/**
 * ---------------------------
 * zookeeper 分布式配置中心 demo
 * ---------------------------
 * 作者:  pyy
 * 时间:  2020-02-27 12:06
 * 版本:  v1.0
 * ---------------------------
 */
public class ZookeeperProSync implements Watcher {

    private static CountDownLatch connectedSemaphore = new CountDownLatch(1);
    private static ZooKeeper zk = null;
    private static Stat stat = new Stat();

    public static void main(String[] args) throws Exception {
        // zookeeper配置数据存放路径
        String path = "/username";
        // 连接zookeeper并且注册一个默认的监听器
        zk = new ZooKeeper("10.10.50.140:2181", 5000, //
                new ZookeeperProSync());
        // 等待zk连接成功的通知
        connectedSemaphore.await();
        // 获取path目录节点的配置数据,并注册默认的监听器
        System.out.println(new String(zk.getData(path, true, stat)));

        Thread.sleep(Integer.MAX_VALUE);
    }

    public void process(WatchedEvent event) {
        if (Event.KeeperState.SyncConnected == event.getState()) {  //zk连接成功通知事件
            if (Event.EventType.None == event.getType() && null == event.getPath()) {
                connectedSemaphore.countDown();
            } else if (event.getType() == Event.EventType.NodeDataChanged) {  //zk目录节点数据变化通知事件
                try {
                    System.out.println("配置已修改,新值为:" + new String(zk.getData(event.getPath(), true, stat)));
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
  1. 我们在zookeeper里修改下目录节点/username下的数据
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[zk: localhost:2181(CONNECTED) 0] set /username pyy
cZxid = 0x1f
ctime = Thu Feb 27 15:14:46 CST 2020
mZxid = 0x23
mtime = Thu Feb 27 15:20:09 CST 2020
pZxid = 0x1f
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 3
numChildren = 0

修改完成后,我们看见两个程序后台都及时收到了他们监听的目录节点数据变更后的值,如下所示

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
root
配置已修改,新值为:pyy
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
ZooKeeper 基础5
Attribute Comment czxid The zxid of the change that caused this znode to be created. mzxid The zxid of the change that last modified this znode. ctime The time in milliseconds from epoch when this znode was created. mtime The time in milliseconds from epoc
franket
2022/03/25
2560
你的简历写了 “熟悉” zookeeper ?那这些你会吗?
Zookeeper 它作为Hadoop项目中的一个开源子项目,是一个经典的分布式数据一致性解决方案,致力于为分布式应用提供一个高性能、高可用,且具有严格顺序访问控制能力的分布式协调服务。
程序员小富
2020/07/13
4830
你的简历写了 “熟悉” zookeeper ?那这些你会吗?
Zookeeper系列一:Zookeeper基础命令操作
由于公司年底要更换办公地点,所以最近投了一下简历,发现面试官现在很喜欢问dubbo、zookeeper和高并发等。由于公司没有使用dubbo,只知道dubbo是一个远程服务调用的分布式框架,zookeeper为分布式应用程序协调服务。因此,本周查阅资料整理下zookeeper学习笔记。
java干货
2021/02/19
7460
Zookeeper系列一:Zookeeper基础命令操作
zookeeper使用详解(命令、客户端、源码)
  zookeeper我们常用来做分布式协调中间件,很多时候我们都接触不到它的原理和用法,我对他的了解也仅限于知道它可以做分布式协调、配置管理、分布式锁,并且有个watch节点监听常常能听到。接下来我要系统的学下zookeeper的功能和原理,一起走进zookeeper的世界
老梁
2019/09/10
2.5K0
zookeeper使用详解(命令、客户端、源码)
一篇文章带你入门Zookeeper
官方文档上这么解释zookeeper,它是一个分布式服务框架,是Apache Hadoop 的一个子项目,它主要是用来解决分布式应用中经常遇到的一些数据管理问题,如:统一命名服务、状态同步服务、集群管理、分布式应用配置项的管理等。
动力节点Java培训
2019/01/10
1.2K0
Zookeeper 数据结构详解
https://zookeeper.apache.org/doc/current/zookeeperOver.html
斯武丶风晴
2020/05/26
1.8K0
答应我,不会这些概念,简历不要写 “熟悉” zookeeper
本文主要分享一下zookeeper的一些基本概念,在正式进入正题前,和大家聊一聊刚入行时我的面试经验,可以说是耿直的有些可爱。
程序员小富
2020/03/31
4920
答应我,不会这些概念,简历不要写 “熟悉” zookeeper
3.Zookeeper常用Shell命令
查看节点列表有 ls path 和 ls2 path 两个命令,后者是前者的增强,不仅可以查看指定路径下的所有节点,还可以查看当前节点的信息。
每天进步一点点
2022/12/15
4180
Zookeeper学习笔记
Zookeeper是一个分布式应用程序协调服务,主要负责集中维护配置信息的服务,提供分布式的同步机制。其所有的服务都是做为其他分布式应用的基础。Zookeeper是Google Chubby的一个开源实现,是现在很多分布式应用的重要组件,包括诸如Hadoop、HBase、Kafka等,可以说现在Zookeeper是大家必须掌握的一门软件。
大江小浪
2019/04/17
4930
zookeeper(2)——操作命令
ls path 查看某个路径下目录列表,ls / 查看根目录下有一个zookeeper的目录。 目录就是一个节点。/ 根节点 zookeeper是子节点
羊羽shine
2019/05/29
8000
快速学习-Zookeeper分布式安装部署
1.集群规划 在hadoop102、hadoop103和hadoop104三个节点上部署Zookeeper。 2.解压安装 (1)解压Zookeeper安装包到/opt/module/目录下
cwl_java
2020/03/25
4860
快速学习-Zookeeper分布式安装部署
zookeeper介绍及mac环境搭建(5)
zookeeper是Apacahe Hadoop的子项目,是一个树型的目录服务,支持变更推送,适合作为Dubbo服务的注册中心,工业强度高,可用于生产环境,并推荐使用
桑鱼
2020/03/17
5660
zookeeper(4)——alc
权限控制(access control lists) 针对节点可以设置相关读写等权限,目的是为了保证数据安全性。 权限permissions 可以指定不同的权限访问以及角色
羊羽shine
2019/05/29
6960
zookeeper常用命令 - 雨中散步撒哈拉
包含c、c++、java、python、linux、html、php等上百本电子书!
雨中散步撒哈拉
2022/09/21
2150
zookeeper 的数据模型
在zookeeper shell中使用get命令查看指定路径节点的data、stat信息:
兮动人
2021/06/11
7140
zookeeper 的数据模型
Zookeeper系列(2):客户端基本命令与监听机制
默认不带参数就是创建持久节点,节点数据是可选的,可以创建节点时指定,也可以不指定。
布禾
2021/04/28
4760
微服务(四)——zookeeper入门&api实践
Zookeeper是一个开源的分布式的,为分布式应用提供协调服务的 Apache 项目。
不愿意做鱼的小鲸鱼
2022/09/26
4550
微服务(四)——zookeeper入门&api实践
zookeeper的shell命令使用
介绍zookeeper的shell命令 1.进入客户端命令行 --(1) 连接本地服务 [hadoop@hadoop01 ~]$ zkCli.sh [zk: localhost:2181(CONNECTED) 0] --(2) 连接其他节点服务 [hadoop@hadoop01 ~]$ zkCli.sh -server hadoop02:2181 [zk: hadoop02:2181(CONNECTED) 0] --(3) 连接其他节点服务 [hadoop@hadoop01 ~]$ zkCli.sh -
CoderJed
2018/09/13
1.2K0
zookeeper初探
大数据解决方案里面有一个组件是zookeeper,最开始看到这个的时候,脑海里不由得闪现出一个职业,动物园管理员。打开Apache里面的项目介绍,发现和我想的也差不多,看里面的测试目录确实都是各种动物,比如大象,小蜜蜂,确实得管管了。 现在谈到大数据,必然会谈到分布式,zookeeper就是分布式里面的一种解决方案,主要面向分布式应用程序协调服务,是Google的Chubby一个开源的实现, ZooKeeper的目标比较单纯,就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系
jeanron100
2018/03/22
7330
zookeeper初探
Alex 的 Hadoop 菜鸟教程: 第9课 zookeeper 介绍和使用
原文地址: http://blog.csdn.net/nsrainbow/article/details/42836479 最新课程请关注原作者博客,获得更好的显示体验
全栈程序员站长
2022/09/02
3470
相关推荐
ZooKeeper 基础5
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档