Zookeeper原理

1.zookeeper简介

image-20230411142826464

image-20230411142931181

1.1 Zookeeper诞生的背景

  • 为了解决单点故障问题,应运而生。

1.2 单点故障

  • 一旦这台服务器宕机,整个分布式系统将无法正常运行。

image-20230411143234778

1.3 总结与思考⭐

1)ZK分布式协调服务,主要解决单点故障,分布式集群的系统一致性

2)本质是分布式的小文件存储系统;通过目录树对节点状态信息进行存储,通过监控这些状态信息,完成对集群的管理

3)ZK常用功能:统一命名服务,分布式配置管理,分布式消息队列,分布式锁,分布式协调

2.Zookeeper的特性

image-20230411143435586

image-20230411143458027

image-20230411143545278

2.1 总结与思考⭐

1)ZK特性:全局一致性,可靠性,顺序性,数据更新原子性,实时性


3.Zookeeper集群角色

image-20230411143707629

image-20230411143830831

image-20230411143859438

  • Leader可以接受事务性请求(写)和非事务性请求

  • Follower 和 Observer 都负责集群的非事物请求,但是Follower可以参与投票,Observer不参与投票,Follower会将客户端发过来的事务性请求转发到leader


3.1 总结与思考⭐

1)Leader:集群核心,事务性(写操作)的唯一调度和处理者,保证集群事务处理顺序性,同时负责投票的发起和决议,以及更新系统状态

2)Follower:负责非事务(读操作)请求,会将(写请求)转发给leader,在Leader选举中投票

3)Observer:访问量较大的ZK集群,可新增Observer,监控ZK集群的最新状态,并将状态进行同步;也可处理非事务性请求,转发事务性请求给Leader


4.Zookeeper的数据模型

image-20230411144409903

image-20230411144830691

4.1 Znode

1)Znode简介

  • Zookeeper是由节点组成的树,树中的每个节点被称为---Znode。

2)Znode子节点

  • 每个节点都可以拥有子节点。每个Znode默认都能够存储1MB的数据,每个Znode都可以通过其路径唯一标识,如上图中第三层第一个Znode,它的路径是/app1/p_1。

3)Znode的组成

  • Znode由三部分组成:stat(状态信息,描述该Znode的版本,权限信息等)/ data(与该Znode关联的数据) / children(该Znode下的子节点)

4)Znode的类型

image-20230411145113259

  • 临时节点:该生命周期依赖于创建它们的会话,一旦会话结束,临时节点将会被自动删除,当然也可以手动删除。虽然每个临时的Znode都会绑定一个客户端,但它们对所有的客户端还是可见的。另外,临时节点不允许拥有子节点。

  • 永久节点:该生命周期不依赖于会话,并且是在客户端显示执行删除操作的时候,才能被删除。

  • 不管是临时节点还是永久节点都具备序列化特性

image-20230411145535423

5)Znode属性

image-20230411145607960

image-20230411145646346

4.2 总结与思考⭐

1)ZK数据模型

image-20230519105513691

2)以上目录树的每个节点称作Znode

  • Znode由三部分组成:stat(状态信息,描述该Znode的版本,权限信息等)/ data(与该Znode关联的数据) / children(该Znode下的子节点)
  • Znode类型:临时节点(生命周期到会话结束),永久节点;不管是临时节点还是永久节点都具备序列化特性

3)ZK的节点属性

image-20230519105932488

5. Zookeeper Watch机制

5.1 Watch机制简介

image-20230411145850752

5.2 Watch机制的特点

image-20230411145950586

  • 先注册再触发,Zookeeper中的Watch机制,必须由客户端先去服务端注册监听,这样才会触发事件的监听,并通知给客户端

5.3 Watch机制的通知状态和事件类型

image-20230411150343490

image-20230411150416332

image-20230411150452257

5.4 总结与思考⭐

1)Watch机制,通过发布/订阅的关系,客户端向服务端注册Watch,服务端监听的信息发生改变,则通知给订阅的服务端

2)Watch特点

  • 一次触发:同样的事情只触发一次
  • 事件封装:用WatchedEvent对事件进行封装并传递,每个事件有keeperState,EventType,path三种属性
  • 异步发送
  • 先注册再触发

3)ZK事件类型

image-20230519110955418


6. Zookeeper的选举机制

6.1 选举机制的简介

image-20230411150645292

  • 为了保证各个节点协同工作,需要选举一个Leader
  • 采用FastLeaderElection算法
  • 投票数大于半数胜出机制

image-20230411150817602

image-20230411150952104

image-20230411151012030

6.2 选举机制的类型

image-20230411151243249

1)全新集群选举

  • 第一次选举

image-20230411151310516

image-20230411151448692

2)非全新集群选举

image-20230411151700509

image-20230411151818040

3)优中选优

保证leader是整个集群中数据最准确/最可靠的机器


6.3 总结与思考⭐

1)为了保证集群协同工作,必须选举一个leader,选举时采用FastLeaderElection算法,投票数大于半数胜出机制

2)选举机制分为:全新集群选举和非全新集群选举


7. Zookeeper分布式集群的部署

7.1 Zookeeper解压

image-20230411152034615

image-20230411152240425

7.2 Zookeeper相关配置

image-20230411152336061

image-20230411152440683

image-20230411152557295

image-20230411152638782

image-20230411152656869

image-20230411152749705

image-20230411152919938

image-20230411152959962

image-20230411153159244

7.3 总结与思考⭐

1)解压

2)配置文件+环境变量生效

8.Zookeeper服务的启动和关闭

image-20230411153245006

8.1 启动Zookeeper服务

image-20230411153430874

image-20230411153511893

image-20230411153356482

8.2 关闭Zookeeper服务

image-20230411153542235

image-20230411153616131

8.3 总结与思考⭐

1)ZK启动,状态查看,停止:zkServer.sh start;zkServer.sh status;zkServer.sh stop


9.Zookeeper的shell操作

9.1 Zookeeper Shell介绍

image-20230411153746763

9.2 通过shell命令操作Zookeeper

1)显示所有操作命令

help ## 显示所有操作命令

image-20230411153923418

image-20230411153946419

## 启动客户端
zkCli.sh -server localhost:2181

image-20230411154128739

  • 进入zookeeper终端

image-20230411154200231

2)查看当前Zookeeper包含的内容

ls / ## 查看根节点,所有包含的内容

3)查看当前节点数据

ls2 / ## 查看当前节点数据

image-20230411154543567

4)创建节点

image-20230411154640394

create -s /testnode test ## 创建序列化永久节点
create -e /testnode-temp testtemp  ## 创建临时节点
create /testnode-p testp  ## 创建永久节点
## 临时节点会随会话结束消失

image-20230411154956909

image-20230411155023765

5)获取节点

image-20230411155112675

image-20230411155143165

6)修改节点

image-20230411155836021

image-20230411155909788

7)监听节点

image-20230411155945766

image-20230411160107874

image-20230411160138420

image-20230411160210737

8)删除节点

image-20230411160247476

image-20230411160326090

9.3 总结与思考⭐

1)Shell常用命令

image-20230519134919883

10.Zookeeper的JAVA API操作

image-20230411160418482

image-20230411160440279

10.1 添加依赖

image-20230411161123723

image-20230411161009984

10.2 操作Zookeeper

image-20230411161229022

image-20230411161351135

image-20230411161631795

image-20230411161645914

image-20230411161821721

image-20230411161848312

image-20230411162409118

image-20230411162004123

image-20230411162155205

image-20230411162329282

11. Zookeeper典型的应用场景

11.1 数据发布与订阅

  • 全局配置中心
发布者将需要全局统一管理的数据发布到Zookeeper节点上,供订阅者动态获取数据,实现配置信息的集中式管理和动态更新

image-20230411162633351

image-20230411162648687

image-20230411163646450

image-20230411163744955

1) 应用的配置信息放到Zookeeper进行集中管理。在启动时主动获取一次配置,同时在节点上注册一个Watcher,这样一来,以后每次配置有更新的时候,都会实时通知订阅的客户端,来获取最新配置信息。

2)分布式搜索服务,索引的元信息和服务器集群集群的节点状态放在Zookeeper的一些指定节点,供各个客户端订阅使用。

3)分布式日志收集系统。收集器通常是按照应用来分配收集任务单元,因此需要在Zookeeper上创建一个以应用名作为path的节点P,并将这个应用的所有机器ip,以子节点的形式注册到节点P上,这样一来就能实现机器变动的时候,实时通知到收集器调整任务分配。

11.2 统一命名服务

image-20230411163843395

image-20230411163933416

11.3 分布式锁

image-20230411164046594

11.4 总结与思考⭐

1)数据发布与订阅:利用watch观察者机制,实现;场景数据量小,更新快;具体场景:分布式搜索服务/分布式日志收集

2)统一命名:具体实体提供唯一Path作为他的名称

3)分布式锁:把Znode看作一把锁

image-20230519135839986

posted @ 2023-06-28 16:19  付十一。  阅读(33)  评论(0)    收藏  举报