一、安装部署
1.1、安装前准备
- 下载zookeeper : https://zookeeper.apache.org/
-
拷贝Zookeeper安装包到Linux系统下
-
解压到指定目录
[root@jdy develop_tools]# tar -zxvf zookeeper-3.4.14.tar.gz -C /usr/local/ [root@jdy local]# mv zookeeper-3.4.14/ zookeeper
1.2、配置修改
-
将/usr/local/jdy/zookeeper/conf这个路径下的zoo_sample.cfg修改为zoo.cfg;
#备份&改名 [root@jdy conf]# cp zoo_sample.cfg zoo.cfg
-
打开zoo.cfg文件,修改dataDir路径:
[root@jdy zookeeper]# mkdir -p /opt/zookeeper/data [root@jdy zookeeper]# mkdir -p /opt/zookeeper/logs [root@jdy zookeeper]# vim conf/zoo.cfg # 修改数据存放目录 dataDir=/opt/zookeeper/data #修改日志存放目录 dataLogDir=/opt/zookeeper/logs
1.3、操作Zookeeper
-
启动Zookeeper
[root@jdy zookeeper]# bin/zkServer.sh start ZooKeeper JMX enabled by default Using config: /usr/local/jdy/zookeeper/bin/../conf/zoo.cfg Starting zookeeper ... STARTED
-
查看进程是否启动
[root@jdy zookeeper]# jps 26453 Jps 26423 QuorumPeerMai
-
查看状态:
[root@jdy zookeeper]# bin/zkServer.sh status ZooKeeper JMX enabled by default Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg Mode: standalone
-
启动客户端:
[root@jdy zookeeper]# bin/zkCli.sh
-
退出客户端:
[zk: localhost:2181(CONNECTED) 2] quit
-
停止Zookeeper
[root@jdy zookeeper]# bin/zkServer.sh stop ZooKeeper JMX enabled by default Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg Stopping zookeeper ... STOPPED
-
配置环境变量
[root@m zookeeper]# vim /etc/profile #将下面路径写入profile文件 export ZOOKEEPER_HOME=/usr/local/zookeeper export PATH=$PATH:$ZOOKEEPER_HOME/bin#让配置生效 [root@m zookeeper]# source /etc/profile#可以在任意路径下启动Zookeeper zkServer.sh start
1.4、设置开机自启
(1)、方式一
- 修改vim /etc/rc.d/rc.local文件
export JAVA_HOME=/usr/local/jdk8
/data/zookeeper-3.4.11/bin/zkServer.sh start
- 添加执行权
chmod +x /etc/rc.d/rc.local
重启后生效
不生效查看:https://www.cnblogs.com/kevingrace/p/8387827.html
(2)、方式二
建立zookeeper服务
- 进入到/etc/rc.d/init.d目录下,新建一个zookeeper脚本
cd /etc/init.d
vim zookeeper
#!/bin/bash #chkconfig:2345 20 90 #description:zookeeper #processname:zookeeper export JAVA_HOME=/usr/local/jdk8 case $1 in start) su root /usr/local/zookeeper/bin/zkServer.sh start;; stop) su root /usr/local/zookeeper/bin/zkServer.sh stop;; status) su root /usr/local/zookeeper/bin/zkServer.sh status;; restart) su root /usr/local/zookeeper/bin/zkServer.sh restart;; *) echo "require start|stop|status|restart" ;; esac
- 添加执行权限
chmod +x zookeeper
- service zookeeper start/stop/status命令启动、停止或查看状态
- 添加到开机自启
chkconfig --add zookeeper
chkconfig --list #查看是否添加成功
集群启动报错解决方法:https://www.cnblogs.com/yangxianyang/p/13675616.html
二、配置参数解读
Zookeeper中的配置文件zoo.cfg中参数含义解读如下:
tickTime =2000
:-
通信心跳数,Zookeeper服务器与客户端心跳时间,单位毫秒
-
Zookeeper使用的基本时间,服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个tickTime时间就会发送一个心跳,时间单位为毫秒。
-
它用于心跳机制,并且设置最小的session超时时间为两倍心跳时间。(session的最小超时时间是2*tickTime)
-
initLimit =10
:LF初始通信时限-
集群中的Follower跟随者服务器与Leader领导者服务器之间初始连接时能容忍的最多心跳数(tickTime的数量),用它来限定集群中的Zookeeper服务器连接到Leader的时限。
-
syncLimit =
5:LF同步通信时限-
集群中Leader与Follower之间的最大心跳数心跳数,假如响应超过syncLimit * tickTime,Leader认为Follwer死掉,从服务器列表中删除Follwer。
-
dataDir
:-
数据文件目录+数据持久化路径
-
主要用于保存Zookeeper中的数据。
-
clientPort =2181
:客户端连接端口-
监听客户端连接的端口。
-
- 修改zookeeper配置文件。
#服务器对应端口号 clientPort=2181 #数据快照文件所在路径 dataDir=/home/zookeeper/zookeeper2181/data #集群配置信息 #server.A=B:C:D #A:是一个数字,表示这个是服务器的编号 #B:是这个服务器的ip地址 #C:Zookeeper服务器之间的通信端口 #D:Leader选举的端口
server.0=192.168.126.140:2888:3888
server.1=192.168.126.141:2888:3888
server.2=192.168.126.142:2888:3888
- 在上一步 dataDir 指定的目录下,创建 myid 文件,然后在该文件添加上一步server 配置的对应 A 数字。
#zookeeper2181对应的数字为1 #/home/zookeeper/zookeeper2181/data目录下执行命令 echo "1" > myid
一台机器搭建好后,克隆服务器。修改myid中的数字
ZooKeeper(String connectionString, int sessionTimeout, Watcher watcher)
-
-
sessionTimeout:会话超时(以毫秒为单位)。
-
public class ZookeeperConnection { public static void main(String[] args) { try { // 计数器对象 CountDownLatch countDownLatch=new CountDownLatch(1); // arg1:服务器的ip和端口 // arg2:客户端与服务器之间的会话超时时间 以毫秒为单位的 // arg3:监视器对象 ZooKeeper zooKeeper=new ZooKeeper("192.168.60.130:2181,192.168.60.130:2182,192.168.60.130:2183", 5000, new Watcher() { @Override public void process(WatchedEvent event) { if(event.getState()==Event.KeeperState.SyncConnected) { System.out.println("连接创建成功!"); countDownLatch.countDown(); } } }); // 主线程阻塞等待连接对象的创建成功 countDownLatch.await(); // 会话编号 System.out.println(zooKeeper.getSessionId()); zooKeeper.close(); } catch (Exception ex) { ex.printStackTrace(); } } }