下载
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