Windows安装Zookeeper
Zookeeper下载:http://archive.apache.org/dist/zookeeper/
我下载的是:zookeeper-3.4.13
一、单节点
# 解压到常用的安装目录
# 将conf目录下的zoo_sample.cfg文件,复制一份,重命名为zoo.cfg。
# 修改zoo.cfg配置文件,将dataDir=/tmp/zookeeper修改成zookeeper安装目录所在的data文件夹(需要在安装目录下面新建一个空的zkdata文件夹和zklog文件夹),再添加一条添加数据日志的配置,如下图:
参数说明:
tickTime:这个时间是作为 Zookeeper 服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个 tickTime 时间就会发送一个心跳。
initLimit:这个配置项是用来配置 Zookeeper 接受客户端(这里所说的客户端不是用户连接 Zookeeper 服务器的客户端,而是 Zookeeper 服务器集群中连接到 Leader 的 Follower 服务器)初始化连接时最长能忍受多少个心跳时间间隔数。当已经超过 10 个心跳的时间(也就是 tickTime)长度后 Zookeeper 服务器还没有收到客户端的返回信息,那么表明这个客户端连接失败。总的时间长度就是 5*2000=10 秒
syncLimit:这个配置项标识 Leader 与 Follower 之间发送消息,请求和应答时间长度,最长不能超过多少个 tickTime 的时间长度,总的时间长度就是 2*2000=4 秒
dataDir:顾名思义就是 Zookeeper 保存数据的目录,默认情况下,Zookeeper 将写数据的日志文件也保存在这个目录里。
clientPort:这个端口就是客户端连接 Zookeeper 服务器的端口,Zookeeper 会监听这个端口,接受客户端的访问请求。
# 启动程序
验证是否安装成功,双击zkCli.cmd:
出现如图欢迎字样则安装成功!
二、伪集群
# 复制三份安装目录
# 将conf目录下的zoo_sample.cfg文件重命名为zoo.cfg,并且按照下面的方式简单配置:
zookeeper-1的zoo.cfg配置
tickTime=2000 initLimit=10 syncLimit=5 dataDir=C:\\install\\zkCluster\\zookeeper-1\\data dataDirLog=C:\\install\\zkCluster\\zookeeper-1\\logs clientPort=2181 server.1=127.0.0.1:2888:3888 server.2=127.0.0.1:2889:3889 server.3=127.0.0.1:2890:3890
zookeeper-2的zoo.cfg配置
tickTime=2000 initLimit=10 syncLimit=5 dataDir=C:\\install\\zkCluster\\zookeeper-2\\data dataDirLog=C:\\install\\zkCluster\\zookeeper-2\\logs clientPort=2182 server.1=127.0.0.1:2888:3888 server.2=127.0.0.1:2889:3889 server.3=127.0.0.1:2890:3890
zookeeper-3的zoo.cfg配置
tickTime=2000 initLimit=10 syncLimit=5 dataDir=C:\\install\\zkCluster\\zookeeper-3\\data dataDirLog=C:\\install\\zkCluster\\zookeeper-3\\logs clientPort=2183 server.1=127.0.0.1:2888:3888 server.2=127.0.0.1:2889:3889 server.3=127.0.0.1:2890:3890
关于zoo.cfg的配置进行说明:
① 在集群模式下,集群中每台机器都需要感知到整个集群是由哪几台机器组成的,在配置文件中,可以按照这样的格式进行配置,每一行都代表一个机器配置:server.id=host:port:port。其中,id被称为 Server ID,用来标识该机器在集群中的机器序列号。同时,在每台Zookeeper机器上,我们都需要在数据目录(即dataDir参数指定的那个目录)下创建一个myid文件,该文件只有一行内容,并且是一个数字,即对应于每台机器的Server ID 数字。
第一个port用于指定follower与leader进行通信和数据同步所使用的tcp端口;第二个port指定leader选举中投票通信的tcp端口。
② 在Zk的设计中,集群中所有机器上的zoo.cfg文件的内容都应该是一致的。因此最好使用svn或是git把此文件管理起来,确保每个机器都能共享到一份相同的配置。
③ myid文件中只有一个数字,即一个Server ID。例如,server.1的myid文件内容就是"1"。注意,清确保每个服务器的myid文件中的数字不同,并且和自己所在机器的zoo.cfg中server.id=houst:port:port的id一致。另外,id的范围是1~255。
④ 参数的作用说明:
1) tickTime:默认值为3000,单位是毫秒(ms),可以不配置。参数tickTime用于配置Zookeeper中最小时间单元的长度,很多运行时的时间间隔都是使用tickTime的倍数来表示的。例如,Zk中会话的最小超时时间默认是2*tickTime。
2) dataDir:该参数无默认值,必须配置。参数dataDir用于配置Zookeeper服务器存储快照文件的目录。
3) clientPort:参数clientPort用于配置当前服务器对外的服务端口,客户端会通过该端口和Zk服务器创建连接,一般设置为2181。
4) initLimit:该参数默认值:10,表示是参数tickTime值的10倍,必须配置,且为正整数。该参数用于配置Leader服务器等待Follower启动,并完成数据同步的时间。Follower服务器在启动过程中,会与Leader建立连接并完成对数据的同步,从而确定自己对外提高服务的起始状态。leader服务器允许Follower在initLimit时间内完成这个工作。
5) syncLimit:该参数默认值:5,表示是参数tickTime值的5倍,必须配置,且为正整数。该参数用于配置Leader服务器和Follower之间进行心跳检测的最大延时时间。在Zk集群运行的过程中,Leader服务器会与所有的Follower进行心跳检测来确定该服务器是否存活。如果Leader服务器在syncLimit时间内无法获取到Follower的心跳检测响应,那么Leader就会认为该Follower已经脱离了和自己的同步。
6) server.id:该参数无默认值,在单机模式下可以不配置。该参数用于配置组成Zk集群的机器列表,其中id即为Server ID,与每台服务器myid文件中的数字相对应。同时,在该参数中,会配置两个端口:第一个端口用于指定Follower服务器与Leader进行运行时通信和数据同步时所使用的端口,第二个端口测专门用于进行Leader选举过程中的投票通信。
# 创建myid文件
在dataDir所配置的目录下,创建一个名为myid的文件,在该文件的第一行写上一个数字,和zoo.cfg中当前机器的编号对应上。即:
在C:\\install\\zkCluster\\zookeeper-1\\data下创建值为"1"的myid文件。
在C:\\install\\zkCluster\\zookeeper-2\\data下创建值为"1"的myid文件。
在C:\\install\\zkCluster\\zookeeper-3\\data下创建值为"1"的myid文件。
# 启动zk
至此,所有Zk都已经基本配置完毕,可以使用 bin 目录下的zkServer.cmd脚本进行服务器的启动了。
刚启动第一个Zk时会不断报错,这是正常的,因为集群中其它的Zk还未起来,Zk集群之间的心跳检测未检测到其它Zk,等集群中所有的Zk都启动后,就不会报错了。
可以使用bin下的zkCli.cmd -server 127.0.0.1:2181连接到zk1这个实例了,当然2182,2183也是可以使用任意客户端连接上。
# 查看节点
因为zk的单一视图,我们可以在zk1查看zk2创建的节点。
三、Zookeeper的操作
退出客户端
[zk: localhost:2181(CONNECTED) 6] quit
ls查看
默认只有zookeeper一个节点
stat 获得节点的更新信息
get 获取节点数据和更新信息
cZxid :创建节点的id
ctime : 节点的创建时间
mZxid :修改节点的id
mtime :修改节点的时间
pZxid :子节点的id
cversion : 子节点的版本
dataVersion : 当前节点数据的版本
aclVersion :权限的版本
ephemeralOwner :判断是否是临时节点
dataLength : 数据的长度
numChildren :子节点的数量
ls2 是ls命令和stat命令的整合
创建节点
create [-s] [-e] path data acl 可以注意一下各个版本的变化
create -e 创建临时节点
断开重连之后,临时节点自动消失(注:可能立即查时,因为心跳机制,临时节点还存在的情况,)
create -s 创建顺序节点 自动累加
set path data [version] 修改节点
delete path [version] 删除节点
watcher通知机制
当每个节点发生变化,都会触发watcher事件,类似于mysql的触发器。zk中 watcher是一次性的,触发后立即销毁。
stat path [watch] 设置watch事件
get path [watch]设置watch事件
子节点创建和删除时触发watch事件,子节点修改不会触发该事件。
# stat path [watch] 设置watch事件
# get path [watch] 设置watch事件
#使用get命令添加watch事件 [zk: localhost:2181(CONNECTED) 20] get /longfei watch test cZxid = 0x20000000e ctime = Sat Jun 02 14:43:15 UTC 2018 mZxid = 0x20000000e mtime = Sat Jun 02 14:43:15 UTC 2018 pZxid = 0x20000000e cversion = 0 dataVersion = 0 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 4 numChildren = 0 #修改节点触发watcher事件 [zk: localhost:2181(CONNECTED) 21] set /longfei new_test WATCHER:: WatchedEvent state:SyncConnected type:NodeDataChanged path:/longfei cZxid = 0x20000000e ctime = Sat Jun 02 14:43:15 UTC 2018 mZxid = 0x20000000f mtime = Sat Jun 02 14:45:06 UTC 2018 pZxid = 0x20000000e cversion = 0 dataVersion = 1 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 8 numChildren = 0 [zk: localhost:2181(CONNECTED) 22] #删除触发watcher事件 [zk: localhost:2181(CONNECTED) 23] get /longfei watch new_test cZxid = 0x20000000e ctime = Sat Jun 02 14:43:15 UTC 2018 mZxid = 0x20000000f mtime = Sat Jun 02 14:45:06 UTC 2018 pZxid = 0x20000000e cversion = 0 dataVersion = 1 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 8 numChildren = 0 [zk: localhost:2181(CONNECTED) 24] delete /longfei WATCHER:: WatchedEvent state:SyncConnected type:NodeDeleted path:/longfei [zk: localhost:2181(CONNECTED) 25]
ACL权限控制
ZK的节点有5种操作权限:CREATE、READ、WRITE、DELETE、ADMIN 也就是 增、删、改、查、管理权限,这5种权限简写为crwda(即:每个单词的首字符缩写)。
注:这5种权限中,delete是指对子节点的删除权限,其它4种权限指对自身节点的操作权限。
身份的认证有4种方式:
- world:默认方式,相当于全世界都能访问
- auth:代表已经认证通过的用户(cli中可以通过addauth digest user:pwd 来添加当前上下文中的授权用户)
- digest:即用户名:密码这种方式认证,这也是业务系统中最常用的
- ip:使用Ip地址认证
# getAcl:获取某个节点的acl权限信息
#获取节点权限信息默认为 world:cdrwa任何人都可以访问 [zk: localhost:2181(CONNECTED) 34] getAcl /merryyou 'world,'anyone : cdrwa [zk: localhost:2181(CONNECTED) 35]
# setAcl 设置权限
[zk: localhost:2181(CONNECTED) 35] create /merryyou/test test Created /merryyou/test [zk: localhost:2181(CONNECTED) 36] getAcl /merryyou/test 'world,'anyone : cdrwa #设置节点权限 crwa 不允许删除 [zk: localhost:2181(CONNECTED) 37] setAcl /merryyou/test world:anyone:crwa cZxid = 0x200000018 ctime = Sat Jun 02 16:18:18 UTC 2018 mZxid = 0x200000018 mtime = Sat Jun 02 16:18:18 UTC 2018 pZxid = 0x200000018 cversion = 0 dataVersion = 0 aclVersion = 1 ephemeralOwner = 0x0 dataLength = 4 numChildren = 0 #查询刚才设置的acl权限信息 crwa 没有删除权限 [zk: localhost:2181(CONNECTED) 38] getAcl /merryyou/test 'world,'anyone : crwa [zk: localhost:2181(CONNECTED) 39] [zk: localhost:2181(CONNECTED) 39] create /merryyou/test/abc abc Created /merryyou/test/abc #删除子节点的时候提交权限不足 [zk: localhost:2181(CONNECTED) 40] delete /merryyou/test/abc Authentication is not valid : /merryyou/test/abc #设置节点的权限信息为rda [zk: localhost:2181(CONNECTED) 41] setAcl /merryyou/test world:anyone:rda cZxid = 0x200000018 ctime = Sat Jun 02 16:18:18 UTC 2018 mZxid = 0x200000018 mtime = Sat Jun 02 16:18:18 UTC 2018 pZxid = 0x20000001a cversion = 1 dataVersion = 0 aclVersion = 2 ephemeralOwner = 0x0 dataLength = 4 numChildren = 1 [zk: localhost:2181(CONNECTED) 42] getAcl /merryyou/test 'world,'anyone : dra #可以成功删除 [zk: localhost:2181(CONNECTED) 43] delete /merryyou/test/abc [zk: localhost:2181(CONNECTED) 46] ls /merryyou/test [] [zk: localhost:2181(CONNECTED) 47] #设置节点信息为a admin [zk: localhost:2181(CONNECTED) 47] setAcl /merryyou/test world:anyone:a cZxid = 0x200000018 ctime = Sat Jun 02 16:18:18 UTC 2018 mZxid = 0x200000018 mtime = Sat Jun 02 16:18:18 UTC 2018 pZxid = 0x20000001d cversion = 2 dataVersion = 0 aclVersion = 3 ephemeralOwner = 0x0 dataLength = 4 numChildren = 0 #获取 设置都提示权限不足 [zk: localhost:2181(CONNECTED) 49] get /merryyou/test Authentication is not valid : /merryyou/test [zk: localhost:2181(CONNECTED) 50] set /merryyou/test 123 Authentication is not valid : /merryyou/test [zk: localhost:2181(CONNECTED) 51]
# acl Auth 密码明文设置
[zk: localhost:2181(CONNECTED) 53] create /niocoder/merryyou merryyou Created /niocoder/merryyou #查询默认节点权限信息 [zk: localhost:2181(CONNECTED) 54] getAcl /niocoder/merryyou 'world,'anyone : cdrwa [zk: localhost:2181(CONNECTED) 55] #使用auth设置节点权限信息 [zk: localhost:2181(CONNECTED) 2] setAcl /niocoder/merryyou auth:test:test:cdrwa Acl is not valid : /niocoder/merryyou # 注册test:test 账号密码 [zk: localhost:2181(CONNECTED) 3] addauth digest test:test [zk: localhost:2181(CONNECTED) 4] setAcl /niocoder/merryyou auth:test:test:cdrwa cZxid = 0x200000020 ctime = Sat Jun 02 16:32:08 UTC 2018 mZxid = 0x200000020 mtime = Sat Jun 02 16:32:08 UTC 2018 pZxid = 0x200000020 cversion = 0 dataVersion = 0 aclVersion = 1 ephemeralOwner = 0x0 dataLength = 8 numChildren = 0 #查询节点权限信息 密码为密文格式 [zk: localhost:2181(CONNECTED) 5] getAcl /niocoder/merryyou 'digest,'test:V28q/NynI4JI3Rk54h0r8O5kMug= : cdrwa [zk: localhost:2181(CONNECTED) 6]
# acl digest 密码密文设置
[zk: localhost:2181(CONNECTED) 13] create /names test Created /names [zk: localhost:2181(CONNECTED) 14] getAcl /names 'world,'anyone : cdrwa #使用digest设置节点的权限信息 密码为test密文 [zk: localhost:2181(CONNECTED) 15] setAcl /names digest:test:V28q/NynI4JI3Rk54h0r8O5kMug=:cdra cZxid = 0x400000006 ctime = Sun Jun 03 01:01:17 UTC 2018 mZxid = 0x400000006 mtime = Sun Jun 03 01:01:17 UTC 2018 pZxid = 0x400000006 cversion = 0 dataVersion = 0 aclVersion = 1 ephemeralOwner = 0x0 dataLength = 4 numChildren = 0 #查询节点权限信息 [zk: localhost:2181(CONNECTED) 16] getAcl /names 'digest,'test:V28q/NynI4JI3Rk54h0r8O5kMug= : cdra #获取节点信息提示权限不足 [zk: localhost:2181(CONNECTED) 5] get /names Authentication is not valid : /names # 注册账户 [zk: localhost:2181(CONNECTED) 4] addauth digest test:test # 可以正常获取 [zk: localhost:2181(CONNECTED) 17] get /names test cZxid = 0x400000006 ctime = Sun Jun 03 01:01:17 UTC 2018 mZxid = 0x400000006 mtime = Sun Jun 03 01:01:17 UTC 2018 pZxid = 0x400000006 cversion = 0 dataVersion = 0 aclVersion = 1 ephemeralOwner = 0x0 dataLength = 4 numChildren = 0 #由于没有设置写权限不能修改节点 w [zk: localhost:2181(CONNECTED) 18] set /names 111 Authentication is not valid : /names [zk: localhost:2181(CONNECTED) 19] delete /names [zk: localhost:2181(CONNECTED) 20]
# acl ip 控制客户端
[zk: localhost:2181(CONNECTED) 22] create /niocoder/ip aa Created /niocoder/ip [zk: localhost:2181(CONNECTED) 23] get /niocoder/ip aa cZxid = 0x40000000a ctime = Sun Jun 03 01:06:47 UTC 2018 mZxid = 0x40000000a mtime = Sun Jun 03 01:06:47 UTC 2018 pZxid = 0x40000000a cversion = 0 dataVersion = 0 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 2 numChildren = 0 # 添加ip控制的权限信息 [zk: localhost:2181(CONNECTED) 24] setAcl /niocoder/ip ip:192.168.0.68:cdrwa cZxid = 0x40000000a ctime = Sun Jun 03 01:06:47 UTC 2018 mZxid = 0x40000000a mtime = Sun Jun 03 01:06:47 UTC 2018 pZxid = 0x40000000a cversion = 0 dataVersion = 0 aclVersion = 1 ephemeralOwner = 0x0 dataLength = 2 numChildren = 0 [zk: localhost:2181(CONNECTED) 25] getAcl /niocoder/ip 'ip,'192.168.0.68 : cdrwa [zk: localhost:2181(CONNECTED) 26]
三、可视化工具ZooInspector
下载地址: https://issues.apache.org/jira/secure/attachment/12436620/ZooInspector.zip
用法: 下载后解压,然后进入目录ZooInspector\build, 执行java -jar zookeeper-dev-ZooInspector.jar,然后会弹出操作窗口