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

一、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/data

dataLogDir=/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=<NA>
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 = 30000

WATCHER::

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 args
	stat path [watch]
	set path data [version]
	ls path [watch]
	delquota [-n|-b] path
	ls2 path [watch]
	setAcl path acl
	setquota -n|-b val path
	history 
	redo cmdno
	printwatches on|off
	delete path [version]
	sync path
	listquota path
	rmr path
	get path [watch]
	create [-s] [-e] path data acl
	addauth scheme auth
	quit 
	getAcl path
	close 
	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 子节点个数最大为5

setquota –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形式的authentication

ip: 它对应的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。

欢迎各位留言交流。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值