1. 了解zookeeper的概述和架构
2. 掌握集群中各个角色的作用
3. 熟悉zookeeper集群的搭建
4. 掌握内部原理
5. 企业面试真题
zookeeper是什么?
1, Zookeeper是一个分布式协调服务的开源概架,主要用来解决分布式集群中应用系统的一致性问题。
2 ,ZooKeeper本质上是一个分布式的小文件存储系统,提供基于类似于文件系统的目录树方式的数据存储,并且可以对树中的节点进行有效管理,从而用来维护和监控你存储的数据的状态变化,通过监控这些数据状态的变化,从而可以达到基于数据的集群管理,诸如:统一命名服务、分布式配置管理、负载均衡、分布式锁、分布式协调等功能。
( 详见官网:https://zookeeper.apache.org/)
zookeeper的几大特性分别是什么?
Zookeeper:是由一个领导者(Leader),多个跟随者(Follower)组成的集群。
集群中只要有半数以上的节点存活下来,Zookeeper集群就能正常服务。
全局数据一致:每个Server保存一份相同的数据副本,Client无论连接那个Server,数据都是一致的。
可靠性:如果消息被其中的一台服务器接收,那么就被所有的服务器接收。
顺序性:更新请求顺序进行,来自同一个Client的更新请求按照发送顺序依次执行。
数据更新原子性:一次数据更新要么成功,要么失败,不存在其他状态。
实时性:Zookeeper保证客户端在一定事件间隔范围内获取服务器的更新(或失效)的信息。
集群中半数以上机器存活,集群可用。所以Zookeeper适合安装奇数台服务器。
各个角色代表着什么?
Zookeeper 集群工作的核心
事务请求 (写操作) 的唯一调度和处理者,保证集群事务处理的顺序性
集群内部各个服务器的调度者。
对于 create, setData, delete 等有写操作的请求,则需要统一转发给leader 处理.leader 需要决定编号、执行操作,这个过程称为一个事务。
处理客户端非事务(读操作)请求,转发事务请求给 Leader
参与集群Leader 选举投票。
观察者角色,观察Zookeeper集群的最新状态变化并将这些状态同步过来,对于非事务请求可以进行独立处理,对于事务请求,则会转发给 Leader服务器进行处理。
不会参与任何形式的投票只提供非事务服务,通常用于在不影响集群事务处理能力的前提下提升集群的非事务处理能力。
Zookeeper数据模型的结构与Unix文件系统相似,呈树状图分布,每个节点称为一个ZNode,每个与ZNode默认只能存储1M的数据,每个ZNode都可以通过路径使标识唯一。
junit
junit
RELEASE
org.apache.logging.log4j
log4j-core
2.8.2
org.apache.zookeeper
zookeeper
3.4.10
log4j.rootLogger=INFO, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n
log4j.appender.logfile=org.apache.log4j.FileAppender
log4j.appender.logfile.File=target/spring.log
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n
private static String connectString =
"hadoop102:2181,hadoop103:2181,hadoop104:2181";
private static int sessionTimeout = 2000;
private ZooKeeper zkClient = null;
@Before
public void init() throws Exception {
zkClient = new ZooKeeper(connectString, sessionTimeout, new Watcher() {
@Override
public void process(WatchedEvent event) {
// 收到事件通知后的回调函数(用户的业务逻辑)
System.out.println(event.getType() + "--" + event.getPath());
// 再次启动监听
try {
zkClient.getChildren("/", true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
// 创建子节点
@Test
public void create() throws Exception {
// 参数1:要创建的节点的路径; 参数2:节点数据 ; 参数3:节点权限 ;参数4:节点的类型
String nodeCreated = zkClient.create("/jinghang", "jinlian".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
}
// 获取子节点
@Test
public void getChildren() throws Exception {
List children = zkClient.getChildren("/", true);
for (String child : children) {
System.out.println(child);
}
// 延时阻塞
Thread.sleep(Long.MAX_VALUE);
// 判断znode是否存在
@Test
public void exist() throws Exception {
Stat stat = zkClient.exists("/eclipse", false);
System.out.println(stat == null ? "not exist" : "exist");
}
Stat 结构体相关参数,须知:
1) 旧集群选举:
数据ID、服务器ID和逻辑时钟含义说明:
数据ID:数据新的version就大,数据每次更新都会更新version。
服务器ID:就是我们配置的myid中的值,每个机器一个。
逻辑时钟:这个值从0开始递增,每次选举对应一个值。 如果在同一次选举中,这个值是一致的。
选举的标准为:
2) 全新集群选举:
参考:https://blog.csdn.net/m0_51113511/article/details/112412308