Zookeeper入门,一篇就够啦

1 初识Zookeeper

ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。

ZooKeeper代码版本中,提供了分布式独享锁、选举、队列的接口,代码在$zookeeper_home\src\recipes。其中分布锁和队列有Java和C两个版本,选举只有Java版本。(百度百科

2 Zookeeper运行环境

如果没有zk运行环境的童鞋们,可以参考我的博文 Linux下搭建Zookeeper运行环境,搭建zookeeper的运行环境。

3 zoo.cfg配置文件详解

zookeeper的核心配置文件zoo.cfg如下图示,整体来看,还是比较简单的。

# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial 
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between 
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just 
# example sakes.
dataDir=/usr/local/apache-zookeeper-3.6.1-bin/data
# the port at which the clients will connect
clientPort=2181
# the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60
#
# Be sure to read the maintenance section of the 
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1

## Metrics Providers
#
# https://prometheus.io Metrics Exporter
#metricsProvider.className=org.apache.zookeeper.metrics.prometheus.PrometheusMetricsProvider
#metricsProvider.httpPort=7000
#metricsProvider.exportJvmInfo=true

核心配置说明:

  • tickTime
    Zookeeper服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个 tickTime时间就会发送一个心跳,tickTime以毫秒为单位
  • initLimit
    集群中的follower服务器与leader服务器之间初始连接时能容忍的最多心跳数(tickTime的数量)
  • syncLimit
    集群中的follower服务器与leader服务器之间请求和应答之间能容忍的最多心跳数(tickTime的数量)
  • dataDir
    存储zookeeper的快照文件pid文件,默认为/tmp/zookeeper,建议在zookeeper安装目录下创建data目录,将dataDir配置改为/usr/local/apache-zookeeper-3.6.1-bin/data
  • clientPort
    客户端连接zookeeper需要的端口,即zookeeper对外的服务端口,默认为2181

4 Zookeeper数据结构

ZooKeeper是一个类似与操作系统的文件系统数据结构,整体来看就是一棵树结构,如下图所示:
在这里插入图片描述

每个节点被称为znode,这个znode是可以存储数据的。
可以增加、删除、查询、修改每一个znode,也可以在一个znode下增加、删除子znode,也即是操作children节点。

znode分类,大致可以分为两类:

  • 持久化目录节点

    PERSISTENT 持久化目录节点
    客户端与zookeeper断开连接后,该节点依旧存在;
    PERSISTENT_SEQUENTIAL 持久化顺序编号目录节点
    客户端与zookeeper断开连接后,该节点依旧存在,只是Zookeeper给该节点名称进行顺序编号

  • 临时目录节点

    EPHEMERAL 临时目录节点;
    客户端与zookeeper断开连接后,该节点将被删除
    EPHEMERAL_SEQUENTIAL 临时顺序编号目录节点
    客户端与zookeeper断开连接后,该节点将被删除,只是Zookeeper给该节点名称进行顺序编号

5 Zookeeper客户端

5.1 图形界面客户端

Zookeeper图形客户端工具下载地址:
https://issues.apache.org/jira/secure/attachment/12436620/ZooInspector.zip

下载完成后,解压即可使用:
在ZooInspector\build目录下,有一个zookeeper-dev-ZooInspector.jar的jar包

运行jar文件:java -jar zookeeper-dev-ZooInspector.jar
稍微等一会,启动完成后,这个图形化工具就可以使用啦。
连接成功后,如下图所示:
在这里插入图片描述

当然啦,如果偷懒,不想敲启动jar命令,写个简单的批处理文件,点击启动也可以。
例如:

@echo off
title zk client

cmd /k "cd /d D:\workplace\ZooInspector\build && java -jar zookeeper-dev-ZooInspector.jar"

注意:如果云服务器开启了防火墙,需要开放2181端口

firewall-cmd --zone=public --add-port=2181/tcp --permanent
firewall-cmd --reload

如果是阿里云服务器,另外,需要开放端口
在这里插入图片描述

5.2 命令行客户端

使用zkCli命令行工具连接ZooKeeper,跟mysql命令行工具类似,可以在命令行操作zookeeper。

进入bin目录下,执行命令:./zkCli.sh
默认直接连接的是本地的zk服务:127.0.0.1:2181
可以指定ip和端口号进行连接:./zkCli.sh -server ip:2181

命令行工具启动成功后,如下图所示:
在这里插入图片描述

命令行客户端主要是通过命令对zookeeper进行操作,一般地,我们对ZooKeeper的操作,都是对znode节点进行增、删、改、查

  • 添加节点

    语法:create [-s] [-e] [-c] [-t ttl] path [data] [acl]
    其中 -s 表示顺序节点,-e表示临时节点,默认是持久化的
    -s 和 -e 可以同时结合使用
    临时节点:当客户端会话结束后,临时节点会被删除
    顺序节点:该特性可用于分布式环境下的主键生成器

    示例:
    创建节点:create /root
    创建节点并且指定数据:create /root/hello write-data
    在这里插入图片描述
    在这里插入图片描述

  • 查询语法:ls /节点名称(路径)

    列出nodeName节点下的节点:ls /nodeName
    在这里插入图片描述
    注意:
    所有的节点,都是以/开头,否则提示:Path must start with / character

  • 列出根目录节点下的所有节点

    使用命令:ls /
    目前就只有一个系统自带的zookeeper节点

  • 获取刚才添加的root节点下所有的子节点

    使用命令:ls /root
    在这里插入图片描述

  • 获取节点的数据

    使用命令:get /root/hello
    可以获取到,刚才添加的hello节点的数据 write-data
    在这里插入图片描述

  • 查看节点状态信息

    使用命令:stat [-w] path
    比如:stat /root
    在这里插入图片描述

    节点状态信息详解:

    名称 描述
    cZxid 节点创建时的zxid
    ctime 节点创建时间
    mZxid 节点最近一次更新时的zxid
    mtime 节点最近一次更新的时间
    pZxid 操作当前节点的子节点列表的事物ID(这种操作包含增加子节点,删除子节点)
    cversion 子节点数据更新次数
    dataVersion 本节点数据更新次数
    aclVersion 节点ACL(授权信息)的更新次数
    ephemeralOwner 如果该节点为临时节点,ephemeralOwner值表示与该节点绑定的session id。如果该节点不是临时节点,ephemeralOwner值为0
    dataLength 节点数据长度
    numChildren 子节点个数
  • 修改某个节点的数据

    语法:set [-s] [-v version] path data
    比如:set /root/hello write-data2
    在这里插入图片描述

  • 删除某个节点的数据

    语法:delete [-v version] path

    比如:delete /root/hello
    注意:delete只能删除不包含子节点的节点,如果要删除的节点包含子节点,使用deleteall命令。
    deleteall语法:deleteall path [-b batch size]

  • 关闭当前会话

    使用命令:close
    在这里插入图片描述

  • 退出连接的客户端命令行

    使用命令:quit
    在这里插入图片描述

写博客是为了记住自己容易忘记的东西,另外也是对自己工作的总结,希望尽自己的努力,做到更好,大家一起努力进步!

如果有什么问题,欢迎大家一起探讨,代码如有问题,欢迎各位大神指正!

给自己的梦想添加一双翅膀,让它可以在天空中自由自在的飞翔!

猜你喜欢

转载自blog.csdn.net/smilehappiness/article/details/105933292