Zookeeper(二):环境搭建和Shell使用

环境搭建

  • 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
​

 

Zookeeper(二):环境搭建和Shell使用

 

 

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
上一篇:DP中环形处理 +(POJ 1179 题解)


下一篇:20-取石子动态规则(hdu2516 斐波那契博弈)