二、Zookeeper安装

一、安装部署

1.1、安装前准备 

[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 集群搭建

  zookeeper的集群一般是奇数台,本次3台服务器,

  • 修改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中的数字

  • zookeeperAPI连接集群
ZooKeeper(String connectionString, int sessionTimeout, Watcher watcher)
  • connectionString:zooKeeper集合主机。

  • sessionTimeout:会话超时(以毫秒为单位)。

  • watcher:实现“监视器”界面的对象。ZooKeeper集合通过监视器对象返回连接状态。

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();
        }
    }
}
原文地址:https://www.cnblogs.com/jdy1022/p/13846761.html