下载

http://zookeeper.apache.org/releases.html

解压

tar –zxvf zookeeper-3.4.6.tar.gz

解压文件到"/usr/local/zookeeper-3.4.6".

复制conf目录下的zoo_sample.cfg,并命名为zoo.cfg

修改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=/datatmp/zookeeper/data
dataLogDir=/datatmp/zookeeper/logs
# 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


#2888,3888 are election port
server.1=192.168.93.121:2888:38888

 

配置详解

1.2888端口号是zookeeper服务之间通信的端口

2.888端口是zookeeper与其他应用程序通信的端口

3.initLimit:这个配置项是用来配置Zookeeper接受客户端(这里所说的客户端不是用户连接Zookeeper服务器的客户端,而是Zookeeper服务器集群中连接到 Leader 的 Follower 服务器)初始化连接时最长能忍受多少个心跳时间间隔数。当已经超过 10 个心跳的时间(也就是 tickTime)长度后 Zookeeper 服务器还没有收到客户端的返回信息,那么表明这个客户端连接失败。总的时间长度就是 5*2000=10 秒。

4.syncLimit:这个配置项标识 Leader 与 Follower 之间发送消息,请求和应答时间长度,最长不能超过多少个 tickTime 的时间长度,总的时间长度就是 2*2000=4 秒。

5.server.A=B:C:D:其中 A 是一个数字,表示这个是第几号服务器;B 是这个服务器的 ip 地址;C 表示的是这个服务器与集群中的 Leader 服务器交换信息的端口;D 表示的是万一集群中的 Leader 服务器挂了,需要一个端口来重新进行选举,选出一个新的 Leader,而这个端口就是用来执行选举时服务器相互通信的端口。如果是伪集群的配置方式,由于 B 都是一样,所以不同的 Zookeeper 实例通信端口号不能一样,所以要给它们分配不同的端口号。

 

创建dataDir参数指定的目录

配置文件zoo.cfg里的dataDir,我这里指的是“ /datatmp/zookeeper/data”,并在目录下创建文件,命名为“myid”。

编辑“myid”文件

在对应的IP的机器上输入对应的编号。如在zookeeper上,“myid”文件内容就是1。由于本次只在单点上进行安装配置,所以只有一个server.1。若还有其他服务器,比如地址为192.168.1.102,则在zoo.cfg文件中还需加入server.2=192.168.1.102:2888:3888。那么myid文件在192.168.1.102服务器上的内容就是2。至此,如果是多服务器配置,就需要将zookeeper-3.4.3目录拷贝到其他服务器,然后按照上述的方法修改myid。

 

在/etc/profile文件中设置PATH

修改profile文件:

sudo vi /etc/profile
export ZOOKEEPER_HOME=/home/hadooptest/zookeeper-3.4.3
export PATH=$ZOOKEEPER_HOME/bin:$PATH
source /etc/profile

 

在防火墙中打开要用到的端口2181 2888 3888

sudo chkconfig iptables on
service iptables start

编辑 /etc/sysconfig/iptables

vi /etc/sysconfig/iptables

增加以下内容:

-A INPUT -m state --state NEW -m tcp -p tcp --dport 2181 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 2888 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 3888 -j ACCEPT

重启防火墙

service iptables restart

检查防火墙状态

service iptables status

OH YEAH!!! 安装完毕!

这个有可能报错,

Job for iptables.service failed because the control process exited with error cod

参考此处: https://blog.csdn.net/sinat_29821865/article/details/80982250

https://blog.csdn.net/qq_37246351/article/details/88313418

 https://www.cnblogs.com/yrjns/p/12490809.html

 

启动

进入bin目录

./zkServer.sh start

sh zkServer.sh start

输入jps命令查看进程

1573 QuorumPeerMain
1654 Jps

其中,QuorumPeerMain是zookeeper进程,启动正常。

 

 

 

查看状态

还是bin目录下

./zkServer.sh status

sh zkServer.sh status
-
JMX enabled by default
Using config: /usr/local/zookeeper-3.4.6/bin/../conf/zoo.cfg
Mode: standalone

4、启动客户端脚本:

zookeeper-3.4.3/bin/zkCli.sh    -server   zookeeper:2181


zookeeper-3.4.3/bin/zkCli.sh    -server   127.0.0.1:2181

-- 超时   -r  表示只读
zookeeper-3.4.3/bin/zkCli.sh  -timeout 5000  -r  -server   127.0.0.1:2181

 

5、停止zookeeper进程:

./zkServer.sh stop


sh zkServer.sh stop

 

集群搭建

和单机的区别不大,就是配置文件zoo.cfg里把所有的机器都加上

server.1=192.168.93.121:2888:38888
server.2=192.168.93.122:2888:38888
server.3=192.168.93.123:2888:38888

但是,记得集群里的server总数最好是单数,不要是双数

 

然后就是不要忘记各个Server的dataDir目录里的myid文件的数字也要对应上。

最后分别启动各个server就OK了。

 

连接zookeeper 服务器

 

yum install telnet

 

 使用命令操作zookeeper

查看帮助

[zk: 127.0.0.1:2181(CONNECTED) 0] h
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   -- 配额节点 ,-n  限制子节点个数   -b  限制长度 
    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

列出某个节点下的所有节点,其中 zookeeper 是自带的节点

[zk: 127.0.0.1:2181(CONNECTED) 1] ls /
[node_5, zookeeper, node_10000000000]

 

[zk: 127.0.0.1:2181(CONNECTED) 3] stat /
cZxid = 0x0    -- 每次对数据节点的写操作意味着一次事务,这个表示事务id
ctime = Thu Jan 01 08:00:00 CST 1970  -- 创建时间
mZxid = 0x0    -- 最后一次更新时的事务id
mtime = Thu Jan 01 08:00:00 CST 1970  -- 修改时间
pZxid = 0x3    -- 子节点列表最后一次修改事务id,也就是对子节点的操作
cversion = 1   -- 子节点的版本号
dataVersion = 0   -- 数据版本号
aclVersion = 0     -- 权限版本号
ephemeralOwner = 0x0   -- 创建临时节点的事务id
dataLength = 0     --  数据长度
numChildren = 3     -- 当前节点的子节点个数
[zk: 127.0.0.1:2181(CONNECTED) 5] stat /node_5
cZxid = 0x3
ctime = Thu Mar 12 17:09:53 CST 2020
mZxid = 0x3
mtime = Thu Mar 12 17:09:53 CST 2020
pZxid = 0x3
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 2
numChildren = 0

得到 节点的数据

[zk: 127.0.0.1:2181(CONNECTED) 6] get /node_5
55
cZxid = 0x3
ctime = Thu Mar 12 17:09:53 CST 2020
mZxid = 0x3
mtime = Thu Mar 12 17:09:53 CST 2020
pZxid = 0x3
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 2
numChildren = 0

 

设置节点,不带版本号时,每次设置版本号 + 1  ,带版本号时,必须 设置的版本和当前节点的数据版本号一致,否则设置不成功。

[zk: 127.0.0.1:2181(CONNECTED) 14] get /node_5  
1
cZxid = 0x3
ctime = Thu Mar 12 17:09:53 CST 2020
mZxid = 0x8
mtime = Thu Mar 12 22:36:46 CST 2020
pZxid = 0x3
cversion = 0
dataVersion = 3     -- 当前数据版本 为 3
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 1
numChildren = 0
[zk: 127.0.0.1:2181(CONNECTED) 15] set /node_5 54 2  -- 设置数据版本为 2 
version No is not valid : /node_5  -- 失败
[zk: 127.0.0.1:2181(CONNECTED) 16] set /node_5 54 3  -- 设置数据版本为 3
cZxid = 0x3
ctime = Thu Mar 12 17:09:53 CST 2020
mZxid = 0xa
mtime = Thu Mar 12 22:37:23 CST 2020
pZxid = 0x3
cversion = 0
dataVersion = 4     -- 设置成功,并且版本 + 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 2
numChildren = 0
[zk: 127.0.0.1:2181(CONNECTED) 17] set /node_5 55 6   -- 设置数据版本号为 6 ,失败
version No is not valid : /node_5
[zk: 127.0.0.1:2181(CONNECTED) 18] set /node_5 55 5   -- 设置数据版本号为 5 ,失败
version No is not valid : /node_5
[zk: 127.0.0.1:2181(CONNECTED) 19] set /node_5 55 4   --  设置数据版本号为 4 ,成功
cZxid = 0x3
ctime = Thu Mar 12 17:09:53 CST 2020
mZxid = 0xd
mtime = Thu Mar 12 22:38:09 CST 2020
pZxid = 0x3
cversion = 0
dataVersion = 5
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 2
numChildren = 0
[zk: 127.0.0.1:2181(CONNECTED) 20] 

 

 

 

参考:  https://www.cnblogs.com/shamo89/p/9689639.html