window和linux环境安装zooker3.6.2,集群搭建、Java连接zk基本操作

zookeeper-root-server-master135.outwindow10 zookeeper

1、下载地址:

https://downloads.apache.org/zookeeper/zookeeper-3.6.2/

window和linux环境安装zooker3.6.2,集群搭建、Java连接zk基本操作

 

记住一定要下载 带 bin的,

亲测 下载了 不带bin的,运行zkServer.sh start 是 出现 类找不到的情况。

2、调整配置文件

1、在bin同级下新建data、logs目录

为了存放zk产生的data数据以及log日志。

2、新增配置文件zoo.cfg

记住配置文件必须是zoo.cfg

拷贝 zoo_sample.cfg cp zoo_sample.cfg zoo.cfg

新增:

 dataDir=/home/workspace/zookeeper/apache-zk3.6.2/data
 dataLogDir=/home/workspace/zookeeper/apache-zk3.6.2/logs
 其他参数 可根据需求进行调整
 ​
 window 下的:
 dataDir=D:\\养成日记\\笔记\\框架\\zk\\apache-zookeeper-3.6.2-bin\\data
 dataLogDir=D:\\养成日记\\笔记\\框架\\zk\\apache-zookeeper-3.6.2-bin\\logs
 可不使用\\ , 切记一定要有zoo.cfg文件

参数说明:

tickTime:这个时间是作为 Zookeeper 服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个 tickTime 时间就会发送一个心跳。 initLimit:这个配置项是用来配置 Zookeeper 接受客户端(这里所说的客户端不是用户连接 Zookeeper 服务器的客户端,而是 Zookeeper 服务器集群中连接到 Leader 的 Follower 服务器)初始化连接时最长能忍受多少个心跳时间间隔数。当已经超过 10 个心跳的时间(也就是 tickTime)长度后 Zookeeper 服务器还没有收到客户端的返回信息,那么表明这个客户端连接失败。总的时间长度就是 52000=10 秒 syncLimit:这个配置项标识 Leader 与 Follower 之间发送消息,请求和应答时间长度,最长不能超过多少个 tickTime 的时间长度,总的时间长度就是 22000=4 秒 dataDir:顾名思义就是 Zookeeper 保存数据的目录,默认情况下,Zookeeper 将写数据的日志文件也保存在这个目录里。 clientPort:这个端口就是客户端连接 Zookeeper 服务器的端口,Zookeeper 会监听这个端口,接受客户端的访问请求。

3、启动和验证

启动方式:

 window10 :
 bin 目录下,启动 zkServer.cmd即可,
 如果出现一闪而过,那就是你的配置文件出现问题了,因为你没有zoo.cfg。  亲自经历
 ​
 linux:
 bin目录下:./zkServer.sh start 
 ./zkServer.sh -h 可以查看可用命令 
 ​
 [root@master135 apache-zk3.6.2]# bin/zkServer.sh -h
 /usr/bin/java
 ZooKeeper JMX enabled by default
 Using config: /home/workspace/zookeeper/apache-zk3.6.2/bin/../conf/zoo.cfg
 Usage: bin/zkServer.sh [--config <conf-dir>] {start|start-foreground|stop|version|restart|status|print-cmd}
 [root@master135 apache-zk3.6.2]# 
 ​

验证是否可用

 1、 可以查看 logs下的 日志文件
 例如: zookeeper-root-server-master135.out 文件 ,里面有报错信息
 错误信息 可以见下图,
 实时监听:
 tail -f zookeeper-root-server-master135.out
 ​
 2、查看运行状态
 ./zkServer.sh status
 ​
 3、连接访问zk
 bin目录下:
 ./zkCli.sh -h 默认 会访问本地
 指定地址。
 ./zkCli.sh -server localhost:2181
 ​
 [root@master135 bin]# zkCli.sh -h
 bash: zkCli.sh: command not found...
 [root@master135 bin]# ./zkCli.sh -h
 /usr/bin/java
 Connecting to localhost:2181
 2021-03-18 02:15:36,001 [myid:] - INFO  [main:Environment@98] - Client environment:zookeeper.version=3.6.2--803c7f1a12f85978cb049af5e4ef23bd8b688715, built on 09/04/2020 12:44 GMT
 2021-03-18 02:15:36,008 [myid:] - INFO  [main:Environment@98] - Client environment:host.name=master135
 ​

window和linux环境安装zooker3.6.2,集群搭建、Java连接zk基本操作

 

4、启动搭建

集群搭建十分的简单。类似es,重在修改配置文件,然后启动多个实例,zk、es自动会互相通信并且搭建集群。

所以很明显: zk、es 他们都需要一个内部通信的端口。此端口在一台电脑(实例)端口不能重复。

配置文件增加一条配置即可:

 server.1=127.0.0.1:2888:3888

释义:server.服务号=服务地址:服务端口:通信端口

例如:

 伪集群,单机环境下: 
 调整不同zk的端口即可。通信端口也不能一样,注意修改data、log存放的位置。
 server.1=127.0.0.1:2888:3888
 server.2=127.0.0.1:2889:3889
 server.3=127.0.0.1:2890:3890
 ​
 多台电脑下:
 server.1=127.0.0.2:2181:3888
 server.2=127.0.0.3:2181:3888
 server.3=127.0.0.4:2181:3888

按个启动zk即可。

服务号:为每个节点分配对应的id 服务地址:服务所在地址,因为现在用的是单机所以地址都是本地 服务端口:和clientPort端口是不同的 在设置过程中服务端口和通信端口应该不同,每个节点的服务端口和通信端口也不同,以防止端口冲突。 其他文件节点zoo.cfg配置基本一样,不同的在于dataDir,dataLogDir和clientPort

集群验证和单节点操作一致:按个 检查状态 即可。

Java程序连接集群:

基本都是逗号隔开就行,跟es一样!

例如 :dubbo 连接:

 Zookeeper 集群配置:
 <dubbo:registry address="zookeeper://10.20.153.10:2181?backup=10.20.153.11:2181,10.20.153.12:2181" />
 or:
 <dubbo:registry protocol="zookeeper" address="10.20.153.10:2181,10.20.153.11:2181,10.20.153.12:2181" />
 ​
 同一 Zookeeper,分成多组注册中心:
 <dubbo:registry id="chinaRegistry" protocol="zookeeper" address="10.20.153.10:2181" group="china" />
 <dubbo:registry id="intlRegistry" protocol="zookeeper" address="10.20.153.10:2181" group="intl" />
 其他dubbo、zk可参考官方文档:https://dubbo.apache.org/zh/docs/v2.7/user/references/registry/zookeeper/

常见问题

1、程序not connection

部署的zk运行在本机,或者服务器,或者虚拟机上(特别是你,很慢)

存在时间延迟问题,程序中增大 连接 等待时间

2、运行出现 not find class QuorumPe

Error: Could not find or load main class org.apache.zookeeper.server.quorum.QuorumPe

调整zk的安装即可。调整为带bin的压缩包即可。

3、not start 不能启动

注意你的配置文件zoo.cfg 是否存在。配合日志进行调整

4、其他

  • JDK没有安装好就启动了zookeeper服务

  • 配置文件zoo.cfg 中的路径写错了,与具体文件没对应上

  • 每个节点的clientPort 设置相同了

  • 每个节点的myid文件的内容是否和对应节点id一样

  • zoo.cfg 的服务端口和通信端口设置是否正确,端口是否被占用

扩展、Java连接zookeeper

Java连接zk,进行测试连接时间

pom依赖:

         <dependency>
             <groupId>org.apache.zookeeper</groupId>
             <artifactId>zookeeper</artifactId>
             <version>3.6.2</version>
         </dependency>
         <dependency>
             <groupId>org.apache.commons</groupId>
             <artifactId>commons-lang3</artifactId>
             <version>3.11</version>
         </dependency>

Java 程序测试类

 package com.alibaba;
 ​
 import java.util.Date;
 import java.util.List;
 import java.util.concurrent.CountDownLatch;
 ​
 import org.apache.commons.lang3.time.DateFormatUtils;
 import org.apache.zookeeper.CreateMode;
 import org.apache.zookeeper.KeeperException;
 import org.apache.zookeeper.WatchedEvent;
 import org.apache.zookeeper.Watcher;
 import org.apache.zookeeper.Watcher.Event.KeeperState;
 import org.apache.zookeeper.ZooDefs.Ids;
 import org.apache.zookeeper.ZooKeeper;
 import org.apache.zookeeper.data.Stat;
 ​
 /**
  * TODO Java 连接zk 基本操作
  *
  * @author 发哥讲Java
  * @version 1.0
  * @date 2021-03-18 11:04
  */
 public class BaseZookeeper implements Watcher {
 ​
     private ZooKeeper zookeeper;
     /**
      * 超时时间
      */
     private static final int SESSION_TIME_OUT = 2000;
     private CountDownLatch countDownLatch = new CountDownLatch(1);
 ​
     @Override
     public void process(WatchedEvent event) {
         if (event.getState() == KeeperState.SyncConnected) {
             System.out.println("Watch received event");
             countDownLatch.countDown();
         }
     }
 ​
 ​
     /**
      * 连接zookeeper
      *
      * @param host
      * @throws Exception
      */
     public void connectZookeeper(String host) throws Exception {
         zookeeper = new ZooKeeper(host, SESSION_TIME_OUT, this);
         System.out.println("connectZookeeper 获取zk时间 = " + DateFormatUtils.format(new Date(), "hh:mm:ss"));
         countDownLatch.await();
         System.out.println("connectZookeeper await 时间 = " + DateFormatUtils.format(new Date(), "hh:mm:ss"));
         System.out.println("zookeeper connection success");
     }
 ​
     /**
      * 创建节点
      *
      * @param path
      * @param data
      * @throws Exception
      */
     public String createNode(String path, String data) throws Exception {
         return this.zookeeper.create(path, data.getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
     }
 ​
     /**
      * 获取路径下所有子节点
      *
      * @param path
      * @return
      * @throws KeeperException
      * @throws InterruptedException
      */
     public List<String> getChildren(String path) throws KeeperException, InterruptedException {
         List<String> children = zookeeper.getChildren(path, false);
         return children;
     }
 ​
     /**
      * 获取节点上面的数据
      *
      * @param path 路径
      * @return
      * @throws KeeperException
      * @throws InterruptedException
      */
     public String getData(String path) throws KeeperException, InterruptedException {
         byte[] data = zookeeper.getData(path, false, null);
         if (data == null) {
             return "";
         }
         return new String(data);
     }
 ​
     /**
      * 设置节点信息
      *
      * @param path 路径
      * @param data 数据
      * @return
      * @throws KeeperException
      * @throws InterruptedException
      */
     public Stat setData(String path, String data) throws KeeperException, InterruptedException {
         Stat stat = zookeeper.setData(path, data.getBytes(), -1);
         return stat;
     }
 ​
     /**
      * 删除节点
      *
      * @param path
      * @throws InterruptedException
      * @throws KeeperException
      */
     public void deleteNode(String path) throws InterruptedException, KeeperException {
         zookeeper.delete(path, -1);
     }
 ​
     /**
      * 获取创建时间
      *
      * @param path
      * @return
      * @throws KeeperException
      * @throws InterruptedException
      */
     public String getCTime(String path) throws KeeperException, InterruptedException {
         Stat stat = zookeeper.exists(path, false);
         return String.valueOf(stat.getCtime());
     }
 ​
     /**
      * 获取某个路径下孩子的数量
      *
      * @param path
      * @return
      * @throws KeeperException
      * @throws InterruptedException
      */
     public Integer getChildrenNum(String path) throws KeeperException, InterruptedException {
         int childenNum = zookeeper.getChildren(path, false).size();
         return childenNum;
     }
 ​
     /**
      * 关闭连接
      *
      * @throws InterruptedException
      */
     public void closeConnection() throws InterruptedException {
         if (zookeeper != null) {
             zookeeper.close();
         }
     }
 ​
     public static void main(String[] args) throws Exception {
         System.out.println("开始时间 = " + DateFormatUtils.format(new Date(), "hh:mm:ss"));
         final BaseZookeeper zookeeper = new BaseZookeeper();
         zookeeper.connectZookeeper("192.168.71.130:2181");
         System.out.println("获取连接时刻 = " + DateFormatUtils.format(new Date(), "hh:mm:ss"));
         List<String> children = zookeeper.getChildren("/");
         System.out.println(children);
         System.out.println("结束时间 = " + DateFormatUtils.format(new Date(), "hh:mm:ss"));
     }
 }
  

喜欢小编的可以关注公众号,点击关于我,加入QQ群,群文件有大量大厂Java面试pdf等免费资源!!!一起挑战大厂

window和linux环境安装zooker3.6.2,集群搭建、Java连接zk基本操作

 

上一篇:程序员深度学习!高端java培训课程


下一篇:2021年互联网大厂Java面试清单:ZK+Redis+MySQL+Java基础+架构