3.8下载地址:
https://www.apache.org/dyn/closer.lua/zookeeper/zookeeper-3.8.0/apache-zookeeper-3.8.0-bin.tar.gz
其他本地址:
https://archive.apache.org/dist/zookeeper/
创建并移动到指定文件夹
cd /usr/local
mkdir zookeeper
cd /root
mv apache-zookeeper-3.8.0-bin.tar.gz /usr/local/zookeeper/
执行解压安装包
cd /usr/local/zookeeper/
tar -zxvf /usr/local/zookeeper/apache-zookeeper-3.8.0-bin.tar.gz
进入到解压好的目录中创建 data 和 logs 文件夹
cd /usr/local/zookeeper/apache-zookeeper-3.8.0-bin
mkdir data
进入 conf 文件夹,拷贝一份配置文件并进行修改
cd /usr/local/zookeeper/apache-zookeeper-3.8.0-bin/conf/
# 复制文件
cp zoo_sample.cfg zoo.cfg
修改配置文件,单节点只需要修改文件存储位置就可以了
vim zoo.cfg
dataDir=/usr/local/zookeeper/apache-zookeeper-3.8.0-bin/data
集群配置:在data文件下创建一个myid,myid需要唯一
# 进入数据目录
cd /usr/local/zookeeper/apache-zookeeper-3.8.0-bin/data
#节点1 myid=1
touch myid && echo 1 > myid
#节点2 myid=2
touch myid && echo 2 > myid
#节点3 myid=2
touch myid && echo 3 > myid
cd /usr/local/zookeeper/apache-zookeeper-3.8.0-bin/conf/
vim zoo.cfg
# 节点配置,server后面的id编号和各节点下的myid保持一致
server.1=192.168.158.158:2888:3888
server.2=192.168.158.159:2888:3888
server.3=192.168.158.160:2888:3888
server.myid.服务器地址.服务器通信端口号.leader选取的通信地址
执行命令使 profile 文件生效
source /etc/profile
防火墙添加 zookeeper 访问端口
firewall-cmd --zone=public --add-port=2181/tcp --permanent
firewall-cmd --zone=public --add-port=2888/tcp --permanent
firewall-cmd --zone=public --add-port=3888/tcp --permanent
重启防火墙
firewall-cmd --reload
启动服务端,在集群模式下,启动的服务器不超过半数,无法提供服务
/usr/local/zookeeper/apache-zookeeper-3.8.0-bin/bin/zkServer.sh start
查看启动状态
/usr/local/zookeeper/apache-zookeeper-3.8.0-bin/bin/zkServer.sh status
查看zookeeper是否启动,可以使用 jps是jdk提供的一个查看当前java进程的小工具
jps
jps –l 输出主类或者jar的完全路径名
jps –v 输出jvm参数
jps –q 仅仅显示java进程号
jps -mlv 10.134.68.173
配置文件解释
心跳时间:毫秒
tickTime=2000
初始连接,通信时限,这里是5次心跳(5*2000),超时连接失败
initLimit=5
首次建立连接之后,通信时限,这里是2次心跳(2*2000)
syncLimit=2
数据存放位置
dataDir=/usr/local/zookeeper/apache-zookeeper-3.8.0-bin/data
客户端通信端口
clientPort=2181
启动异常。可以删除data文件夹下文件
cd /usr/local/zookeeper/apache-zookeeper-3.8.0-bin/data
rm -rf version-2/
rm -rf zookeeper_server.pid
启动客户端
/usr/local/zookeeper/apache-zookeeper-3.8.0-bin/bin/zkCli.sh
或者
/usr/local/zookeeper/apache-zookeeper-3.8.0-bin/bin/zkCli.sh -server 192.168.158.158:2181
推出客户端
quit
客户端节点类型
节点相关的Shell操作:
1.永久节点(不带序号:不能创建名称相同的节点)
创建节点:create /节点名 "节点描述"
获取节点信息:get -s /节点名
2.永久节点(带序号:可以创建名称相同的节点,序号自动增加)
创建节点:create -s /一级节点名/二级节点名 "节点描述"
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LtaGVMqB-1668950884621)(C:\Users\IsTrueLove\AppData\Roaming\Typora\typora-user-images\image-20221119175746858.png)]
3.临时节点(不带序号)
创建节点:create -e /一级节点名/二级节点名 "节点描述"
4.临时节点(带序号)
创建节点:create -e -s /一级节点名/二级节点名 "节点描述"
5.修改节点数值:
set /一级节点名/二级节点名 "节点描述"
6.查看节点状态:
stat /节点名
7.节点删除:
删除单个节点:delete /一级节点名/二级节点名
删除整个节点:deleteall /一级节点名
/**
* 连接地址
*/
private String connectString = "192.168.158.158:2181,192.168.158.159:2181,192.168.158.160:2181";
/**
* 毫秒
*/
private Integer sessionTimeout = 2000;
@GetMapping("/test")
public Object test(String path, String data) {
ZooKeeper zooKeeper = null;
try {
//创建连接
zooKeeper = new ZooKeeper(connectString, sessionTimeout, new Watcher() {
@Override
public void process(WatchedEvent watchedEvent) {
}
});
//判断节点是否存在
Stat exists = zooKeeper.exists(path, false);
if (exists != null) {
return "节点以存在";
}
//创建节点
zooKeeper.create(path, data.getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
//监听节点变化,第一个参数为路径,第二个参数是监听,如果为true就会使用创建连接时的监听器,返回的是节点名
List<String> children = zooKeeper.getChildren("/", true);
children.forEach(a -> System.out.println(a));
} catch (Exception e) {
throw new RuntimeException(e);
}
return "zooKeeper";
}
特点
zookeeper数据模型与Uinx文件系统很相似,整体可以看作是一棵树,每个节点 默认能够存储1MB数据,每个节点都可以通过文件路径来唯一标识
leader选举
第一次启动
非第一次启动
有两种情况会产生leader选举
所以发生leader选举时会有两种情况
监听器原理
再一个mian线程里,创建zookeeper客户端,会有两个线程,一个负责网络通信,一个负责监听
通过通信的线程将注册的监听事件发送给zookeeper ,再zookeeper的注册监听列表中将注册的监听事件添加到列表中
zookeeper监听到数据或者路径有变化时,就会将这个消息发送给监听线程
zookeeper写原理
首先zookeepe创建一个永久节点
服务器操作:创建服务器连接,将自己注册到zookeeper集群(也就是创建对应的节点,上线一台服务器就创建一个节点,下线节点就消失)
客户端操作:监听服务器的变化,也就是监听指定的节点变化