热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Zookeeper入门教程一(概述、安装和命令)

文章目录一、Zookeeper概述1.1什么是Zookeeper1.2数据模型ZNode二、Zookeeper安装与部署2.2单机安装2.2集群部署三、Zookeeper命令简介3

文章目录

  • 一、Zookeeper 概述
    • 1.1 什么是Zookeeper
    • 1.2 数据模型ZNode
  • 二、Zookeeper 安装与部署
    • 2.2 单机安装
    • 2.2 集群部署
  • 三、Zookeeper 命令简介
    • 3.1 ZNode节点命令
  • 四、总结


一、Zookeeper 概述

1.1 什么是Zookeeper

官网图标

Zookeeper官网对于“What is Zookeeper?”做出以下解释(吐槽了难以管理的应用):

ZooKeeper is a centralized service for maintaining configuration information, naming, providing distributed synchronization, and providing group services. All of these kinds of services are used in some form or another by distributed applications. Each time they are implemented there is a lot of work that goes into fixing the bugs and race conditions that are inevitable. Because of the difficulty of implementing these kinds of services, applications initially usually skimp on them ,which make them brittle in the presence of change and difficult to manage. Even when done correctly, different implementations of these services lead to management complexity when the applications are deployed.

from

ZooKeeper是一个开源的分布式应用程序协调服务,是Hadoop的一个子项目。它是集群的管理者(就是用来管理服务的);

ZooKeeper本身提供的常见服务如下(先看看,以后会用起来的) :

  • 命名服务 - 按名称标识集群中的节点。它类似于DNS,但仅对于节点。
  • 配置管理 - 加入节点的最近的和最新的系统配置信息。
  • 集群管理 - 是否有机器退出和加入、选举master。
  • 选举算法 - 选举一个节点作为协调目的的leader。
  • 分布式锁 - 在修改数据的同时锁定数据。
  • 队列管理 - 同步队列或者按照 FIFO 方式进行入队和出队操作

1.2 数据模型ZNode

Zookeeper使用了类似文件系统的数据模型,它的命名空间中的每个节点拥有它自己或者自己子节点相关的数据,ZK中必须使用绝对路径“/”开头。如图所示:

znode

ZooKeeper树中,每一个节点被称为znode,和文件系统一样,我们能够自由的添加、删除znode,唯一的不同在于znode是可以存储数据的。有两种类型的znode:

  • 持久节点(PERSISTENT):

即使在创建该特定znode的客户端断开连接后,持久节点仍然存在。默认情况下所有znode节点都是持久的。


  • 临时节点(EPHEMERAL):

客户端活跃时,临时节点就是有效的。当客户端与ZooKeeper集合断开连接时,临时节点会自动删除。临时节点不允许有子节点。\


  • 顺序节点

顺序节点可以是持久的或临时的。当一个新的znode被创建为一个顺序节点时,ZooKeeper通过将10位的序列号附加到原始名称来设置znode的路径。例如,如果将具有路径 /db的znode创建为顺序节点,则ZooKeeper会将路径更改为 /db0000000001 ,并将下一个序列号设置为0000000002。如果两个顺序节点是同时创建的,那么ZooKeeper不会对每个znode使用相同的数字。


二、Zookeeper 安装与部署

ZooKeeper服务器是用Java创建的,它在JVM上运行,安装zookeeper之前要先安装JVM(此步骤略过)。

ZooKeeper可以运行在多种系统平台上面,下表展示了ZooKeeper支持的系统平台。

系统开发环境生产环境
linux支持支持
windows支持不支持
MacOS支持不支持
FreeBSD支持支持
Solaris支持支持

2.2 单机安装

可以到官网下载,也可以点击百度云下载3.4.9版本 ,执行命令:

tar -zxvf zookeeper-3.4.9.tar.gz

进入解压缩后的文件,如图所示,
安装环境

解释一下目录:

bin目录中是zk可执行脚本目录,包括zk服务端、zk客户端;conf 是zk的配置文件目录;lib中是zk依赖的包;contrib 中是用于操作zk的工具包;recipes目录 :zk某些用法的代码示例;

在conf文件夹中,有一个文件zoo_sample.cfg,修改其名称为zoo.cfg;
在这里插入图片描述
编辑该配置文件:vim 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/zk/datadataLogDir=/usr/local/zk/log
# 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

了解一下这些配置参数的意思:

  1. tickTime

时长单位为毫秒,是zk使用的基本时间度量单位。默认值为2000毫秒。


  1. initLimit

指定了启动zookeeper时,zookeeper实例中的随从实例同步到领导实例的初始化连接时间限制,超出时间限制则连接失败(以tickTime为时间单位);


  1. syncLimit

指定了zookeeper正常运行时,主从节点之间同步数据的时间限制,若超过这个时间限制,那么随从实例将会被丢弃;


  1. clientPort

客户端连接使用端口,默认2181端口;


  1. dataDir

必须配置,用于配置存储快照文件。如果没有配置dataLogDir,那么事务日志也会存储在此目录。

添加日志存储路径,保存;进入bin目录下。执行 ./zkServer.sh start 启动zookeeper,显示如图信息,zookeeper启动成功;
在这里插入图片描述

启动zookeeper 客户端,连接到服务端,成功安装并开启!
在这里插入图片描述

2.2 集群部署

对于集群模式下的ZooKeeper部署,3个ZooKeeper服务进程是建议的最小进程数量(建议是奇数个,原因之后将),而且不同的服务进程建议部署在不同的物理机器上面,减少机器宕机带来的风险,以实现ZooKeeper集群的高可用。

三个zookeeper的conf/zoo.cfg 配置如下:

tickTime=2000
initLimit=10
syncLimit=5
dataDir=/usr/lcoal/zk/data
dataLogDir=/usr/local/zk/log
clientPort=2181
server.1=192.168.2.149:2888:3888
server.2=192.168.2.151:2888:3888
server.3=192.168.2.152:2888:3888

每个节点的配置文件(zoo.cfg)都是一样的,只有 myid 文件不一样。myid 的值必须是 zoo.cfg中server.{数值} 的{数值}部分。其中2888是集群之间的通信端口,3888 是投票选举使用的端口;

在dataDir目录下,添加myid文件;内容如下:

149 :echo '1' > /usr/local/zk/data/myid;
151 :echo '2' > /usr/local/zk/data/myid;
152 :echo '3' > /usr/local/zk/data/myid;

最后使用单机模式的方式启动zookeeper即可,完成集群式部署;
151
151
149
通过命令./zkCli.sh -server 192.168.2.149:2181,192.168.2.151:2181,192.168.2.152:2181,即可连接到zookeeper集群,至于连接到哪一个上,是随机的。

[root@linux-test bin]# ./zkCli.sh -server 192.168.2.149:2181,192.168.2.151:2181,192.168.2.152:2181
Connecting to 192.168.2.149:2181,192.168.2.151:2181,192.168.2.152:2181
2018-11-26 18:01:23,551 [myid:] - INFO [main:Environment@100] - Client environment:zookeeper.version=3.4.9-1757313, built on 08/23/2016 06:50 GMT
2018-11-26 18:01:23,554 [myid:] - INFO [main:Environment@100] - Client environment:host.name=localhost
2018-11-26 18:01:23,554 [myid:] - INFO [main:Environment@100] - Client environment:java.version=1.8.0_161
2018-11-26 18:01:23,556 [myid:] - INFO [main:Environment@100] - Client environment:java.vendor=Oracle Corporation
2018-11-26 18:01:23,556 [myid:] - INFO [main:Environment@100] - Client environment:java.home=/software/jdk/jdk1.8.0_161/jre
2018-11-26 18:01:23,557 [myid:] - INFO [main:Environment@100] - Client environment:java.class.path=/software/zookeeper-3.4.9/bin/../build/classes:/software/zookeeper-3.4.9/bin/../build/lib/*.jar:/software/zookeeper-3.4.9/bin/../lib/slf4j-log4j12-1.6.1.jar:/software/zookeeper-3.4.9/bin/../lib/slf4j-api-1.6.1.jar:/software/zookeeper-3.4.9/bin/../lib/netty-3.10.5.Final.jar:/software/zookeeper-3.4.9/bin/../lib/log4j-1.2.16.jar:/software/zookeeper-3.4.9/bin/../lib/jline-0.9.94.jar:/software/zookeeper-3.4.9/bin/../zookeeper-3.4.9.jar:/software/zookeeper-3.4.9/bin/../src/java/lib/*.jar:/software/zookeeper-3.4.9/bin/../conf:.:/software/jdk/jdk1.8.0_161/lib/dt.jar:/software/jdk/jdk1.8.0_161/lib/tools.jar
2018-11-26 18:01:23,557 [myid:] - INFO [main:Environment@100] - Client environment:java.library.path=/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib
2018-11-26 18:01:23,557 [myid:] - INFO [main:Environment@100] - Client environment:java.io.tmpdir=/tmp
2018-11-26 18:01:23,557 [myid:] - INFO [main:Environment@100] - Client environment:java.compiler=
2018-11-26 18:01:23,557 [myid:] - INFO [main:Environment@100] - Client environment:os.name=Linux
2018-11-26 18:01:23,557 [myid:] - INFO [main:Environment@100] - Client environment:os.arch=amd64
2018-11-26 18:01:23,557 [myid:] - INFO [main:Environment@100] - Client environment:os.version=2.6.32-358.el6.x86_64
2018-11-26 18:01:23,557 [myid:] - INFO [main:Environment@100] - Client environment:user.name=root
2018-11-26 18:01:23,557 [myid:] - INFO [main:Environment@100] - Client environment:user.home=/root
2018-11-26 18:01:23,557 [myid:] - INFO [main:Environment@100] - Client environment:user.dir=/software/zookeeper-3.4.9/bin
2018-11-26 18:01:23,561 [myid:] - INFO [main:ZooKeeper@438] - Initiating client connection, connectString=192.168.2.149:2181,192.168.2.151:2181,192.168.2.152:2181 sessionTimeout=30000 watcher=org.apache.zookeeper.ZooKeeperMain$MyWatcher@579bb367
Welcome to ZooKeeper!
2018-11-26 18:01:23,615 [myid:] - INFO [main-SendThread(192.168.2.152:2181):ClientCnxn$SendThread@1032] - Opening socket connection to server 192.168.2.152/192.168.2.152:2181. Will not attempt to authenticate using SASL (unknown error)
JLine support is enabled
2018-11-26 18:01:23,731 [myid:] - INFO [main-SendThread(192.168.2.152:2181):ClientCnxn$SendThread@876] - Socket connection established to 192.168.2.152/192.168.2.152:2181, initiating session
2018-11-26 18:01:23,766 [myid:] - INFO [main-SendThread(192.168.2.152:2181):ClientCnxn$SendThread@1299] - Session establishment complete on server 192.168.2.152/192.168.2.152:2181, sessionid = 0x3674f6dcafc0000, negotiated timeout = 30000WATCHER::WatchedEvent state:SyncConnected type:None path:null
[zk: 192.168.2.149:2181,192.168.2.151:2181,192.168.2.152:2181(CONNECTED) 0]

三、Zookeeper 命令简介

ZooKeeper命名空间中的Znode,兼具文件和目录两种特点。既像文件一样维护着数据、元信息、ACL、时间戳等数据结构,又像目录一样可以作为路径标识的一部分。

3.1 ZNode节点命令

在bin目录下,通过./zkCli.sh 连接到本地zkserver,就可以操作znode节点了,常用命令:

① help命令用于查询客户端所支持的命令

[zk: localhost:2181(CONNECTED) 0] help
ZooKeeper -server host:port cmd argsstat path [watch]set path data [version]ls path [watch]delquota [-n|-b] pathls2 path [watch]setAcl path aclsetquota -n|-b val pathhistory redo cmdnoprintwatches on|offdelete path [version]sync pathlistquota pathrmr pathget path [watch]create [-s] [-e] path data acladdauth scheme authquit getAcl pathclose connect host:port

② create 命令用于创建节点,其中-s为顺序节点,-e为临时节点

create /orm/mybatis mydata
create -s /orm/mybatis orderData
create -e /orm/mybatis temporaryData

③ set命令用于设置节点的数据,如:

(注:Zookeeper是用来协调服务的,因此znode里存储的都是小数据,而不是大容量的数据,数据容量一般在1MB范围内。)

set /orm/mybatis i_am_a_mybatis

④ get 命令用于获取节点的信息,注意节点的路径必须是以/开头的绝对路径。如get /orm/mybatis

[zk: localhost:2181(CONNECTED) 12] get /orm/mybatis
i_am_a_mybatis
cZxid = 0x200000009
ctime = Mon Nov 26 18:18:49 CST 2018
mZxid = 0x20000000a
mtime = Mon Nov 26 18:24:22 CST 2018
pZxid = 0x200000009
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 14
numChildren = 0

参数解释:

参数描述备注
cZxid节点创建时的zxid格式时间戳Zxid是一个64为的数字,它高32位是epoch用来标识leader关系是否改变,每次一个leader被选出来,它都会有一个 新的epoch。低32位是个递增计数。
ctime节点创建时间
mZxid节点最近一次更新时的zxid格式时间戳
mtime节点最近一次更新的时间
cversion子节点数据更新次数
dataVersion本节点数据更新次数
aclVersion节点ACL(权限列表)的更新次数
ephemeralOwner如果该节点为临时节点,ephemeralOwner值表示与该节点绑定的session id. 如果该节点不是临时节点,ephemeralOwner值为0
dataLength节点数据长度,本例中为i_am_a_mybatis的长度
numChildren子节点个数

⑤stat 命令用于查看节点的状态信息,如stat /orm/mybatis

⑥ls命令 用于获取路径下的节点信息,注意路径为绝对路径,如:ls /orm/mybatis

⑦setquota命令用于设置节点个数以及数据长度的配额,如:

setquota –n 5 /orm/mybatis //设置/orm/mybatis 子节点个数最大为5setquota –b 100 /orm/mybatis //设置/orm/mybatis 节点长度最大为100

⑧ listquota命令用于显示配额,如listquota /orm/mybatis

在这里插入图片描述

⑨delquota:该命令用于删除配额,-n为子节点个数,-b为节点数据长度,如:delquota –n 2

⑪ setAcl命令,用于设置节点ACL (注:每个znode都有一个ACL:Access Control List(访问控制列表))

⑫ getAcl命令获取节点的Acl,如getAcl /node1

zk提供了下边三种身份验证模式:world: 它下面只有一个id, 叫anyone, world:anyone代表任何人,zookeeper中对所有人有权限的结点就是属于world:anyone的auth: 它不需要id, 只要是通过authentication的user都有权限(zookeeper支持通过kerberos来进行authencation, 也支持username/password形式的authentication)digest: 它对应的id为username:BASE64(SHA1(password)),它需要先通过username:password形式的authenticationip: 它对应的id为客户机的IP地址,设置的时候可以设置一个ip段,比如ip:192.168.1.0/16, 表示匹配前16个bit的IP段super: 在这种scheme情况下,对应的id拥有超级权限,可以做任何事情(cdrwa)

ACL权限对应如下表:

权限描述
CREATE(c)创建权限,可以在当前node下创建child node
DELETE(d)删除权限,可以删除当前的node
READ(r)读权限,可以获取当前node的数据,可以list当前node所有的child nodes
WRITE(w)写权限,可以向当前node写数据
ADMIN(a)管理权限,可以设置当前node的permission

在设置ACL时,可以给zk客户端和服务器端的连接设置ACL,也可以在创建znode时,给znode设置ACL,在创建了znode后,如果有zk客户端来操作znode,只有满足权限要求时,才能完成相对应的操作:

⑩ addauth命令,用于节点认证,使用方式:如addauth digest username:password

⑬ sync命令

sync命令用于强制同步,由于请求在半数以上的zk server上生效就表示此请求生效,那么就会有一些zk server上的数据是旧的。sync命令就是强制同步所有的更新操作。

⑭printwatchers命令,用于设置和显示监视状态,值为on或则off

⑮ quit命令 ,退出客户端

四、总结

以上内容就是zookeper入门级别学习的开始,我们了解了什么是zookeeper,以及zookeepr的数据模型、常用命令、安装部署等;但zookeeper能帮助我们做哪些东西呢?我们为什么要学习并且使用它呢,在之后的系列文章中,我们会更多的了解并使用zookeeper。

欢迎各位留言交流。


推荐阅读
  • 在Linux系统中,网络配置是至关重要的任务之一。本文详细解析了Firewalld和Netfilter机制,并探讨了iptables的应用。通过使用`ip addr show`命令来查看网卡IP地址(需要安装`iproute`包),当网卡未分配IP地址或处于关闭状态时,可以通过`ip link set`命令进行配置和激活。此外,文章还介绍了如何利用Firewalld和iptables实现网络流量控制和安全策略管理,为系统管理员提供了实用的操作指南。 ... [详细]
  • 兆芯X86 CPU架构的演进与现状(国产CPU系列)
    本文详细介绍了兆芯X86 CPU架构的发展历程,从公司成立背景到关键技术授权,再到具体芯片架构的演进,全面解析了兆芯在国产CPU领域的贡献与挑战。 ... [详细]
  • 为什么多数程序员难以成为架构师?
    探讨80%的程序员为何难以晋升为架构师,涉及技术深度、经验积累和综合能力等方面。本文将详细解析Tomcat的配置和服务组件,帮助读者理解其内部机制。 ... [详细]
  • 用阿里云的免费 SSL 证书让网站从 HTTP 换成 HTTPS
    HTTP协议是不加密传输数据的,也就是用户跟你的网站之间传递数据有可能在途中被截获,破解传递的真实内容,所以使用不加密的HTTP的网站是不 ... [详细]
  • Presto:高效即席查询引擎的深度解析与应用
    本文深入解析了Presto这一高效的即席查询引擎,详细探讨了其架构设计及其优缺点。Presto通过内存到内存的数据处理方式,显著提升了查询性能,相比传统的MapReduce查询,不仅减少了数据传输的延迟,还提高了查询的准确性和效率。然而,Presto在大规模数据处理和容错机制方面仍存在一定的局限性。本文还介绍了Presto在实际应用中的多种场景,展示了其在大数据分析领域的强大潜力。 ... [详细]
  • 如何利用Java 5 Executor框架高效构建和管理线程池
    Java 5 引入了 Executor 框架,为开发人员提供了一种高效管理和构建线程池的方法。该框架通过将任务提交与任务执行分离,简化了多线程编程的复杂性。利用 Executor 框架,开发人员可以更灵活地控制线程的创建、分配和管理,从而提高服务器端应用的性能和响应能力。此外,该框架还提供了多种线程池实现,如固定线程池、缓存线程池和单线程池,以适应不同的应用场景和需求。 ... [详细]
  • centos 7.0 lnmp成功安装过程(很乱)
    下载nginx[rootlocalhostsrc]#wgethttp:nginx.orgdownloadnginx-1.7.9.tar.gz--2015-01-2412:55:2 ... [详细]
  • 本文详细介绍了如何在 Linux 系统上安装 JDK 1.8、MySQL 和 Redis,并提供了相应的环境配置和验证步骤。 ... [详细]
  • Hadoop的文件操作位于包org.apache.hadoop.fs里面,能够进行新建、删除、修改等操作。比较重要的几个类:(1)Configurati ... [详细]
  • 本文详细介绍了在 CentOS 7 系统中配置 fstab 文件以实现开机自动挂载 NFS 共享目录的方法,并解决了常见的配置失败问题。 ... [详细]
  • 本文详细介绍了如何解决DNS服务器配置转发无法解析的问题,包括编辑主配置文件和重启域名服务的具体步骤。 ... [详细]
  • 本文是Java并发编程系列的开篇之作,将详细解析Java 1.5及以上版本中提供的并发工具。文章假设读者已经具备同步和易失性关键字的基本知识,重点介绍信号量机制的内部工作原理及其在实际开发中的应用。 ... [详细]
  • 深入解析Android 4.4中的Fence机制及其应用
    在Android 4.4中,Fence机制是处理缓冲区交换和同步问题的关键技术。该机制广泛应用于生产者-消费者模式中,确保了不同组件之间高效、安全的数据传输。通过深入解析Fence机制的工作原理和应用场景,本文探讨了其在系统性能优化和资源管理中的重要作用。 ... [详细]
  • 对于希望在未越狱的iOS设备上修改Hosts文件的苹果用户来说,了解文件的具体位置和操作步骤至关重要。本文将详细介绍如何通过安装最新版本的iTunes来实现这一目标,并提供实用的操作指南,帮助用户轻松完成Hosts文件的编辑。 ... [详细]
  • Kafka 是由 Apache 软件基金会开发的高性能分布式消息系统,支持高吞吐量的发布和订阅功能,主要使用 Scala 和 Java 编写。本文将深入解析 Kafka 的安装与配置过程,为程序员提供详尽的操作指南,涵盖从环境准备到集群搭建的每一个关键步骤。 ... [详细]
author-avatar
手机用户2502901591
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有