zookeeper-root-server-master135.outwindow10 zookeeper
1、下载地址:
https://downloads.apache.org/zookeeper/zookeeper-3.6.2/
记住一定要下载 带 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
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等免费资源!!!一起挑战大厂