Zookeeper简介及源码环境搭建
源码环境下载地址:https://github.com/apache/zookeeper
提示:本文使用zookeeper3.5.8版本
前言
什么是分布式系统:通常单个物理机节点很容易达到性能、计算或者容量瓶颈,所以这个时候就需要多个物理节点来共同完成任务。通俗的讲分布式系统的本质就是分布在不同网络或者机器上的程序组件(也可以理解成服务),通过消息传递进行协同工作的系统,而zookeeper是一个分布式应用协调框架。
一、什么是zookeeper
zookeeper是一个分布式协调框架,是Apache Hadoop的子项目,主要是用来解决分布式系统中数据管理问题,如:统一命名服务、状态同步、集群管理、分布式应用配置项管理。
二、zookeeper核心
1.文件系统数据结构
zookeeper维护了一个类似文件系统(文件目录)的数据结构:每个子目录都被称为**目录节点(znode)**可自由的增加和删除节点,常用的有4种类型的节点。
- 持久化目录节点(PERSISTENT):客户端与zookeeper断开连接后,节点依然存在,需要手动删除;
- 持久化顺序编号目录节点(PERSISTENT_SEQUENTIAL):客户端与zookeeper断开连接后,节点依然存在,新增时会对节点名称进行顺序编号;
- 临时目录节点(EPHEMERAL):客户端与zookeeper断开连接后,节点被删除;
- 临时顺序编号目录节点(EPHEMERAL_SEQUENTIAL):客户端与zookeeper断开连接后,节点被删除,新增时会对节点名称进行顺序编号;
- 容器节点(Container):3.5.3 版本新增,如果Container节点下面没有子节点,则Container节点在未来会被Zookeeper自动清除,定时任务默认60s 检查一次;
- TTL 节点:指定过期时间的节点,过了指定时间被服务器删除。默认禁用,只能通过系统配置 zookeeper.extendedTypesEnabled=true 开启,不稳定;
2.监听机制
客户端监听它所关心的任意节点,或者目录节点及递归子目录节点;
- 如果注册的是监听某个节点,则该节点被删除或者被修改时通知对应客户端。
- 如果注册的是监听某个目录,则在该目录下创建、或删除子节点时通知对应客户端
- 如果注册的是监听某个目录的递归子节点,则这个目录下面任意一个子节点目录结构有变化(子节点创建、删除)或节点数据变化时通知对应客户端。
注意:所有的监听事件是一次性的,无论是节点还是目录,一旦触发对应的监听事件会被清除。递归子节点监听,是对所有子节点进行监听,所以每个子节点下面的事件同样只会被触发一次。
应用场景:
- 分布式配置中心
- 分布式注册中心
- 分布式锁
- 分布式队列
- 发布/订阅
- 分布式屏障
// 监听样例(命令形式)
// 1、节点监听
get ‐w /path // 注册监听的同时获取数据
stat ‐w /path // 对节点进行监听,且获取元数据信息
// 2、针对目录监听
ls ‐w /path
// 针对递归子节点监听
ls ‐R ‐w /path : ‐R //区分大小写,一定用大写
源码环境搭建的(idea)
源码下载地址:https://github.com/apache/zookeeper.git 选择分支3.5.8
1.导入源码至idea:3.5.8版本org.apache.zookeeper.Version会报错,此时需要手动添加一个Info类(辅助类);
包路径:zookeeper-server下org.apache.zookeeper.version包
package org.apache.zookeeper.version;
/**
* @description:
* @author: xiaqing
* @createDate:2021/3/20
* @Time: 18:19
* To change this template use File | Settings | File Templates.
*/
public interface Info {
int MAJOR = 1;
int MINOR = 0;
int MICRO = 0;
String QUALIFIER = null;
int REVISION = -1;
String REVISION_HASH = "1";
String BUILD_DATE = "2021‐03‐20";
}
2、在根目录下编译执行(目录栏输入cmd),也可以直接使用idea编译:
mvn clean install ‐DskipTests
3、寻找入口类,开源项目一般都是从启动脚本寻找启动类-org.apache.zookeeper.server.quorum.QuorumPeerMain(服务端启动类),zookeeper在bin目录下有个zkServer.sh脚本:
4、直接启动会报错,需要将conf文件夹里的zoo_sample.cfg文件复制一份改名为zoo.cfg,将zoo.cfg文件位置配置到启动参数里;
错误提示如下:
解决办法如下:
5、启动之前需要先将zookeeper-server项目里pom.xml文件里全部依赖包(除了jline)中的scope为provided这一行注释掉,否则可能会在启动客户端时出现NoClassDefFoundError错误。
解决办法:
6、将conf文件夹里的log4j.properties文件复制一份到zookeeper-server项目的 \target\classes 目录下,这样项目启动时才会打印日志
7、从源码里运行客户端(org.apache.zookeeper.ZooKeeperMain),注意需要加入启动参数:
8、运行源码
服务端:
客户端:
更多内容关注个人微信公众号: