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本身提供的常见服务如下(先看看,以后会用起来的) :
Zookeeper使用了类似文件系统的数据模型,它的命名空间中的每个节点拥有它自己或者自己子节点相关的数据,ZK中必须使用绝对路径“/”开头。如图所示:
ZooKeeper树中,每一个节点被称为znode,和文件系统一样,我们能够自由的添加、删除znode,唯一的不同在于znode是可以存储数据的。有两种类型的znode:
即使在创建该特定znode的客户端断开连接后,持久节点仍然存在。默认情况下所有znode节点都是持久的。
客户端活跃时,临时节点就是有效的。当客户端与ZooKeeper集合断开连接时,临时节点会自动删除。临时节点不允许有子节点。\
顺序节点可以是持久的或临时的。当一个新的znode被创建为一个顺序节点时,ZooKeeper通过将10位的序列号附加到原始名称来设置znode的路径。例如,如果将具有路径 /db的znode创建为顺序节点,则ZooKeeper会将路径更改为 /db0000000001 ,并将下一个序列号设置为0000000002。如果两个顺序节点是同时创建的,那么ZooKeeper不会对每个znode使用相同的数字。
ZooKeeper服务器是用Java创建的,它在JVM上运行,安装zookeeper之前要先安装JVM(此步骤略过)。
ZooKeeper可以运行在多种系统平台上面,下表展示了ZooKeeper支持的系统平台。
系统 | 开发环境 | 生产环境 |
---|---|---|
linux | 支持 | 支持 |
windows | 支持 | 不支持 |
MacOS | 支持 | 不支持 |
FreeBSD | 支持 | 支持 |
Solaris | 支持 | 支持 |
可以到官网下载,也可以点击百度云下载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
了解一下这些配置参数的意思:
时长单位为毫秒,是zk使用的基本时间度量单位。默认值为2000毫秒。
指定了启动zookeeper时,zookeeper实例中的随从实例同步到领导实例的初始化连接时间限制,超出时间限制则连接失败(以tickTime为时间单位);
指定了zookeeper正常运行时,主从节点之间同步数据的时间限制,若超过这个时间限制,那么随从实例将会被丢弃;
客户端连接使用端口,默认2181端口;
必须配置,用于配置存储快照文件。如果没有配置dataLogDir,那么事务日志也会存储在此目录。
添加日志存储路径,保存;进入bin目录下。执行 ./zkServer.sh start
启动zookeeper,显示如图信息,zookeeper启动成功;
启动zookeeper 客户端,连接到服务端,成功安装并开启!
对于集群模式下的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即可,完成集群式部署;
通过命令./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、时间戳等数据结构,又像目录一样可以作为路径标识的一部分。
在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。
欢迎各位留言交流。