环境搭建
-
Zookeeper的安装依赖JDK1.7以上环境
- 使用版本:3.6
-
部署计划:
node-1部署1个;node-2部署2个
node-1
#创建ins目录,上传到该目录 [root@node-1 usr]# mkdir ins #创建zook目录, [root@node-1 usr]# mkdir zook #解压到zook目录 [root@node-1 ins]# tar -zxvf apache-zookeeper-3.6.0-bin.tar.gz -C /usr/zook/ #定位到zook目录后,修改文件名 [root@node-1 zook]# mv apache-zookeeper-3.6.0-bin/ zk-standalone-model [root@node-1 zook]# ls zk-standalone-model #创建软链接 [root@node-1 zook]# ln -s zk-standalone-model zookeeper3.6 #进入zookeeper根目录的conf文件夹 [root@node-1 zookeeper3.6]# cd conf/ [root@node-1 conf]# ls configuration.xsl log4j.properties zoo_sample.cfg #把默认配置文件修改为配置文件--启用默认配置 [root@node-1 conf]# mv zoo_sample.cfg zoo.cfg #修改配置文件 [root@node-1 zook]# vim ./zookeeper3.6/conf/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/zook/zookeeper3.6/zk/data1 dataLogDir=/usr/zook/zookeeper3.6/zk/log1 # the port at which the clients will connect clientPort=2182 # the maximum number of client connections. # increase this if you need to handle more clients #maxClientCnxns=60 server.1=node-1:2287:3387 server.2=node-2:2288:3388 server.3=node-2:2289:3389 #创建备份目录 [root@node-1 zookeeper3.6]# mkdir zk [root@node-1 zookeeper3.6]# cd zk [root@node-1 zk]# mkdir data1 [root@node-1 zk]# mkdir log1 #在data文件夹中增加myid文件 #myid写服务器名称,即zoo.cf中服务器server.后面的名称 [root@node-1 zk]# echo 1 > data1/myid #添加环境变量 ## zookeeper export ZOOKEEPER_HOME=/usr/zook/zookeeper3.6 export PATH=$PATH:$ZOOKEEPER_HOME/bin
node-2
#创建ins目录,上传到该目录 [root@node-1 usr]# mkdir ins #创建zook目录, [root@node-1 usr]# mkdir zook #解压到zook目录 [root@node-1 ins]# tar -zxvf apache-zookeeper-3.6.0-bin.tar.gz -C /usr/zook/ #定位到zook目录后,修改文件名 [root@node-2 zook]# mv apache-zookeeper-3.6.0-bin/ zk-pseudo-distributed #创建软链接 [root@node-1 zook]# ln -s zk-pseudo-distributed zookeeper3.6 #进入zookeeper根目录的conf文件夹 [root@node-2 zookeeper3.6]# cd conf #把默认配置文件修改为zoo2配置文件 [root@node-2 conf]# cp zoo_sample.cfg zoo2.cfg #修改配置文件 [root@node-2 conf]# vim zoo2.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/zook/zookeeper3.6/zk/data2 dataLogDir=/usr/zook/zookeeper3.6/zk/log2 # the port at which the clients will connect clientPort=2182 # the maximum number of client connections. # increase this if you need to handle more clients #maxClientCnxns=60 server.1=node-1:2287:3387 server.2=node-2:2288:3388 server.3=node-2:2289:3389 #复制为zoo3 [root@node-2 conf]# cp zoo2.cfg zoo3.cfg #修改zoo3文件,只需要修改以下内容 [root@node-2 conf]# vim zoo3.cfg dataDir=/usr/zook/zookeeper3.6/zk/data3 dataLogDir=/usr/zook/zookeeper3.6/zk/log3 # the port at which the clients will connect clientPort=2183 #创建zookeeper备份文件目录 [root@node-2 zookeeper3.6]# mkdir zk [root@node-2 zookeeper3.6]# cd zk/ [root@node-2 zk]# mkdir data2 [root@node-2 zk]# mkdir data3 [root@node-2 zk]# mkdir log2 [root@node-2 zk]# mkdir log3 #在data文件夹中增加myid文件 #myid写服务器名称,即zoo2.cf中服务器server.后面的名称 [root@node-2 zk]# echo 2 > data2/myid [root@node-2 zk]# cat data2/myid 2 [root@node-2 zk]# echo 3 > data3/myid [root@node-2 zk]# cat data3/myid 3 #添加环境变量 ## zookeeper export ZOOKEEPER_HOME=/usr/zook/zookeeper3.6 export PATH=$PATH:$ZOOKEEPER_HOME/bin #生效环境变量即可
测试
node-1
#启动zookeeper [root@node-1 zk]# zkServer.sh start ZooKeeper JMX enabled by default Using config: /usr/zook/zookeeper3.6/bin/../conf/zoo.cfg Starting zookeeper ... STARTED #查看进程 [root@node-1 zk]# jps #QuorumPeerMain就是Zookeeper的进程 79719 QuorumPeerMain 79734 Jps 1656 TFAMain
node-2
[root@node-2 conf]# zkServer.sh start zoo2.cfg ZooKeeper JMX enabled by default Using config: /usr/zook/zookeeper3.6/bin/../conf/zoo2.cfg Starting zookeeper ... STARTED [root@node-2 conf]# zkServer.sh start zoo3.cfg ZooKeeper JMX enabled by default Using config: /usr/zook/zookeeper3.6/bin/../conf/zoo3.cfg Starting zookeeper ... STARTED [root@node-2 conf]# jps 79797 QuorumPeerMain 1668 TFAMain 79819 Jps 79759 QuorumPeerMain
#该命令可以查看zookeeper启动状态,注意一定要全部启动以后再查看,会有个选举的行为。
[root@node-1 conf]# zkServer.sh status zoo.cfg
ZooKeeper JMX enabled by default
Using config: /usr/zook/zookeeper3.6/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost.
Mode: leader
[root@node-2 conf]# zkServer.sh status zoo2.cfg
ZooKeeper JMX enabled by default
Using config: /usr/zook/zookeeper3.6/bin/../conf/zoo2.cfg
Client port found: 2182. Client address: localhost.
Mode: follower
[root@node-2 conf]# zkServer.sh status zoo3.cfg
ZooKeeper JMX enabled by default
Using config: /usr/zook/zookeeper3.6/bin/../conf/zoo3.cfg
Client port found: 2183. Client address: localhost.
Mode: follower
#Zookeeper停止进程
[root@node-1 bin]# ./zkServer.sh stop
ZooKeeper JMX enabled by default
Using config: /usr/zook/zookeeper3.6/bin/../conf/zoo.cfg
Stopping zookeeper ... STOPPED
配置文件参数说明
# zk中的基本时间单元(以毫秒为单位),很多时间参数都会参考该值 tickTime=2000 # 集群初始化时候,机器初始化时间过期值(tickTime的倍数) initLimit=10 # 服务器和客户端之间请求和应答的时间间隔(tickTime的倍数) syncLimit=5 #zk的数据保存目录,以及myid和pid的保存目录。默认为/tmp/zookeeper,一般都需要修改 dataDir=/usr/zook/zookeeper3.6/zk/data2 #zk操作日志保存目录,默认就是dataDir,一般设置为不一样的。 dataLogDir=/usr/zook/zookeeper3.6/zk/log2 # 客户端和zk集群交互的端口号,默认为2181 clientPort=2182 # 每个客户端IP的最大连接数,默认不限制(不设置或者设置为0)。当设置后,会限制单个客户端(IP)的最大并发连接数。 #maxClientCnxns=10 # 最小会话过期时间,默认为2*tickTime。 #minSessionTimeout=60 #最大会话过期时间,默认为20*tickTime。会话过期时间是在创建客户端连接的时候指定的。 #maxSessionTimeout #server.A=B:C:D; A是一个数字,表示是第几号服务器,配置在dataDir文件夹中的myid文件中;B是对应服务器的IP地址;C是服务器与集群中的leader交换信息的端口;D是用来执行leader选举时服务器的通信端口。 server.1=node-1:2287:3387 server.2=node-2:2288:3388 server.3=node-2:2289:3389
Zookeeper Shell命令
Zookeeper的命令主要由bin目录下的zkServer.sh(zkServer.cmd)和zkCli.sh(zkCli.cmd)构成.
-
zkServer命令是进行集群管理/zk服务管理.
-
集群zk服务的启动、停止、状态查看
-
-
zkCli命令是zookeeper提供的shell客户端。
-
进行zookeeper客户端操作,进行诸如创建、删除、查看等操作。
-
zkServer命令
-
命令格式为: zkServer.sh command [parameters] [config]
-
command支持start, start-foreground, stop, status, restart, upgrade和print-cmd。最常用命令是start, stop和status这三个命令
-
parameters是给定config额外的信息,该值给定的信息会覆盖config文件中定义的配置信息,一般不给定,直接在config里配置好就可以了。比如zkServer.sh start -server ip:port [config]
-
config是给定启动该命令对应的cfg配置文件的路径地址信息,默认为$ZOOKEEPER_HOME/conf/zoo.cfg。
-
zkCli命令
-
命令格式为: zkCli.sh [parameters]
-
parameters指定需要连接的zk服务器相关信息,包括服务器ip地址、端口号、会话过期时间、是否只读等信息。列如:zkCli.sh -server ip:port -timeout xxx -r。
-
直接输入zkCli.sh,不携带任何参数即可连接上zk服务器(本地),当看到下列结果的时候表示连接成功:
-
WATCHER:: WatchedEvent state:SyncConnected type:None path:null [zk: localhost:2181(CONNECTED) 0]
也可以指定服务器连接:
[root@node-1 conf]# zkCli.sh -server node-2:2182 Connecting to node-2:2182 #...... WATCHER:: WatchedEvent state:SyncConnected type:None path:null #这样就可以连接上客户端了 [zk: node-2:2182(CONNECTED) 0]
zkCli shell命令
-
进入zkCli shell以后
1.help命令
获取帮助文档,常用命令注释见下文
[zk: node-2:2182(CONNECTED) 0] help ZooKeeper -server host:port cmd args addWatch [-m mode] path # optional mode is one of [PERSISTENT, PERSISTENT_RECURSIVE] - default is PERSISTENT_RECURSIVE addauth scheme auth #关闭当前连接。 close config [-c] [-w] [-s] #修改连接节点 connect host:port #创建znode create [-s] [-e] [-c] [-t ttl] path [data] [acl] #删除节点(要先删除子节点) delete [-v version] path deleteall path [-b batch size] delquota [-n|-b] path # 获取节点信息 get [-s] [-w] path getAcl [-s] path getAllChildrenNumber path getEphemerals path #显示执行了多少命令,并给出每个历史命令的编号。redo命令可以根据历史命令的编号重新调用这些命令 history listquota path ls [-s] [-w] [-R] path #是否打印信息 printwatches on|off #退出ZooKeeper的交互式命令行。 quit reconfig [-s] [-v version] [[-file path] | [-members serverID=host:port1:port2;port3[,...]*]] | [-add serverId=host:port1:port2;port3[,...]]* [-remove serverId[,...]*] redo cmdno removewatches path [-c|-d|-a] [-l] set [-s] [-v version] path data setAcl [-s] [-v version] [-R] path acl setquota -n|-b val path # 获取节点状态信息 stat [-w] path sync path version
2.connect命令
修改连接节点
[zk: node-2:2182(CONNECTED) 1] connect node-2:2183 WATCHER:: WatchedEvent state:SyncConnected type:None path:null [zk: node-2:2183(CONNECTED) 2]
3.ls
显示path下的znode名称列表。
-
命令格式为: ls path [watch] 或者 ls [-w] path
-
watch 如果为true,那么表示进行watch监控,会对下一次得添加和删除操作做一个监控并输出结果(见下create命令的测试)。
-
和Hadoop一样,没有cd操作,只能使用绝对路径查看
[zk: node-2:2183(CONNECTED) 2] ls / [zookeeper] [zk: node-2:2183(CONNECTED) 3] ls /zookeeper [config, quota] [zk: node-2:2183(CONNECTED) 4] ls /zookeeper/quota [] #'ls path [watch]'旧版本使用,笔者使用3.6,已经修改为ls [-w] path [zk: node-2:2183(CONNECTED) 8] ls / true 'ls path [watch]' has been deprecated. Please use 'ls [-w] path' instead. [test, zookeeper] [zk: node-2:2183(CONNECTED) 9] ls -w / [test, zookeeper]
4.create
在zk服务器中创建znode,默认创建为永久节点。
-
命令格式为:create [-s] [-e] path data acl
-
其中-s创建一个顺序节点,-e创建一个临时节点。
-
path节点的路径,data节点数据(字符串),acl节点的权限列表(可不给定)。
#开启该路径的监控 [zk: node-2:2183(CONNECTED) 9] ls -w / [test, zookeeper] #创建文件夹t,有watch结果 [zk: node-2:2183(CONNECTED) 10] create /t "" WATCHER:: WatchedEvent state:SyncConnected type:NodeChildrenChanged path:/ Created /t #创建文件夹tt,没有watch结果 [zk: node-2:2183(CONNECTED) 11] create /tt "" Created /tt
创建顺序节点
-
顺序节点其实就是zk在创建节点时,自动在给定的节点名称后面加一个流水号
#当前节点已经有tt [zk: node-2:2183(CONNECTED) 12] ls / [t, test, tt, zookeeper] #再创建tt是无法执行的 [zk: node-2:2183(CONNECTED) 14] create /tt "" Node already exists: /tt #这时候可以创建顺序节点 [zk: node-2:2183(CONNECTED) 15] create -s /tt "" Created /tt0000000003 [zk: node-2:2183(CONNECTED) 17] create -s /tt "" Created /tt0000000004 [zk: node-2:2183(CONNECTED) 18] create -s /tt "" Created /tt0000000005 #zk就会创建节点并自动添加流水号 [zk: node-2:2183(CONNECTED) 19] ls / [t, test, tt, tt0000000003, tt0000000004, tt0000000005, zookeeper]
创建临时节点
#创建临时节点 [zk: node-2:2183(CONNECTED) 20] create -e /testtmp "tmp" Created /testtmp #创建顺序临时节点 [zk: node-2:2183(CONNECTED) 22] create -s -e /testtmp "tmp" Created /testtmp0000000007 [zk: node-2:2183(CONNECTED) 24] ls / [t, test, testtmp, testtmp0000000007, tt, tt0000000003, tt0000000004, tt0000000005, zookeeper] #临时节点无法创建子节点 [zk: node-2:2183(CONNECTED) 25] create -e /testtmp/t Ephemerals cannot have children: /testtmp/t #重新登录后临时节点就没了 [zk: node-2:2182(CONNECTED) 0] ls / [t, test, tt, tt0000000003, tt0000000004, tt0000000005, zookeeper]
5.get/set
获取/设置节点得数据
-
get命令是获取节点数据,set是设置节点数据。
-
get命令格式为: get [-s] [-w] path
-
-w 表示监控节点的删除和更新操作
-
-s 表示显示所有状态信息
-
-
set命令格式为: set path data
-
data数据为字符串类型。
-
get
[zk: node-2:2182(CONNECTED) 0] get /test [zk: node-2:2182(CONNECTED) 1] get -s /test cZxid = 0x400000006 ctime = Mon Apr 13 20:12:00 PDT 2020 mZxid = 0x400000006 mtime = Mon Apr 13 20:12:00 PDT 2020 pZxid = 0x400000006 cversion = 0 dataVersion = 0 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 0 numChildren = 0
set
[zk: node-2:2182(CONNECTED) 2] set /test "new value" [zk: node-2:2182(CONNECTED) 3] get /test new value
6.delete
删除节点
#删除空节点 [zk: node-2:2182(CONNECTED) 11] delete /test Node not empty: /test #删除非空节点 [zk: node-2:2182(CONNECTED) 12] deleteall /test
问题解决
1.8080端口被占用
zookeeper最近的版本中有个内嵌的管理控制台是通过jetty启动,也会占用8080 端口。
修改在zoo.cfg中修改AdminServer的端口:
admin.serverPort=``8888