Zookeeper原理
1.zookeeper简介
1.1 Zookeeper诞生的背景
- 为了解决单点故障问题,应运而生。
1.2 单点故障
- 一旦这台服务器宕机,整个分布式系统将无法正常运行。
1.3 总结与思考⭐
1)ZK分布式协调服务,主要解决单点故障,分布式集群的系统一致性
2)本质是分布式的小文件存储系统;通过目录树对节点状态信息进行存储,通过监控这些状态信息,完成对集群的管理
3)ZK常用功能:统一命名服务,分布式配置管理,分布式消息队列,分布式锁,分布式协调
2.Zookeeper的特性
2.1 总结与思考⭐
1)ZK特性:全局一致性,可靠性,顺序性,数据更新原子性,实时性
3.Zookeeper集群角色
-
Leader可以接受事务性请求(写)和非事务性请求
-
Follower 和 Observer 都负责集群的非事物请求,但是Follower可以参与投票,Observer不参与投票,Follower会将客户端发过来的事务性请求转发到leader
3.1 总结与思考⭐
1)Leader:集群核心,事务性(写操作)的唯一调度和处理者,保证集群事务处理顺序性,同时负责投票的发起和决议,以及更新系统状态
2)Follower:负责非事务(读操作)请求,会将(写请求)转发给leader,在Leader选举中投票
3)Observer:访问量较大的ZK集群,可新增Observer,监控ZK集群的最新状态,并将状态进行同步;也可处理非事务性请求,转发事务性请求给Leader
4.Zookeeper的数据模型
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的类型
-
临时节点:该生命周期依赖于创建它们的会话,一旦会话结束,临时节点将会被自动删除,当然也可以手动删除。虽然每个临时的Znode都会绑定一个客户端,但它们对所有的客户端还是可见的。另外,临时节点不允许拥有子节点。
-
永久节点:该生命周期不依赖于会话,并且是在客户端显示执行删除操作的时候,才能被删除。
-
不管是临时节点还是永久节点都具备序列化特性
5)Znode属性
4.2 总结与思考⭐
1)ZK数据模型
2)以上目录树的每个节点称作Znode
- Znode由三部分组成:stat(状态信息,描述该Znode的版本,权限信息等)/ data(与该Znode关联的数据) / children(该Znode下的子节点)
- Znode类型:临时节点(生命周期到会话结束),永久节点;不管是临时节点还是永久节点都具备序列化特性
3)ZK的节点属性
5. Zookeeper Watch机制
5.1 Watch机制简介
5.2 Watch机制的特点
- 先注册再触发,Zookeeper中的Watch机制,必须由客户端先去服务端注册监听,这样才会触发事件的监听,并通知给客户端
5.3 Watch机制的通知状态和事件类型
5.4 总结与思考⭐
1)Watch机制,通过发布/订阅的关系,客户端向服务端注册Watch,服务端监听的信息发生改变,则通知给订阅的服务端
2)Watch特点
- 一次触发:同样的事情只触发一次
- 事件封装:用WatchedEvent对事件进行封装并传递,每个事件有keeperState,EventType,path三种属性
- 异步发送
- 先注册再触发
3)ZK事件类型
6. Zookeeper的选举机制
6.1 选举机制的简介
- 为了保证各个节点协同工作,需要选举一个Leader
- 采用FastLeaderElection算法
- 投票数大于半数胜出机制
6.2 选举机制的类型
1)全新集群选举
- 第一次选举
2)非全新集群选举
3)优中选优
保证leader是整个集群中数据最准确/最可靠的机器
6.3 总结与思考⭐
1)为了保证集群协同工作,必须选举一个leader,选举时采用FastLeaderElection算法,投票数大于半数胜出机制
2)选举机制分为:全新集群选举和非全新集群选举
7. Zookeeper分布式集群的部署
7.1 Zookeeper解压
7.2 Zookeeper相关配置
7.3 总结与思考⭐
1)解压
2)配置文件+环境变量生效
8.Zookeeper服务的启动和关闭
8.1 启动Zookeeper服务
8.2 关闭Zookeeper服务
8.3 总结与思考⭐
1)ZK启动,状态查看,停止:zkServer.sh start;zkServer.sh status;zkServer.sh stop
9.Zookeeper的shell操作
9.1 Zookeeper Shell介绍
9.2 通过shell命令操作Zookeeper
1)显示所有操作命令
help ## 显示所有操作命令
## 启动客户端
zkCli.sh -server localhost:2181
- 进入zookeeper终端
2)查看当前Zookeeper包含的内容
ls / ## 查看根节点,所有包含的内容
3)查看当前节点数据
ls2 / ## 查看当前节点数据
4)创建节点
create -s /testnode test ## 创建序列化永久节点
create -e /testnode-temp testtemp ## 创建临时节点
create /testnode-p testp ## 创建永久节点
## 临时节点会随会话结束消失
5)获取节点
6)修改节点
7)监听节点
8)删除节点
9.3 总结与思考⭐
1)Shell常用命令
10.Zookeeper的JAVA API操作
10.1 添加依赖
10.2 操作Zookeeper
11. Zookeeper典型的应用场景
11.1 数据发布与订阅
- 全局配置中心
发布者将需要全局统一管理的数据发布到Zookeeper节点上,供订阅者动态获取数据,实现配置信息的集中式管理和动态更新
1) 应用的配置信息放到Zookeeper进行集中管理。在启动时主动获取一次配置,同时在节点上注册一个Watcher,这样一来,以后每次配置有更新的时候,都会实时通知订阅的客户端,来获取最新配置信息。
2)分布式搜索服务,索引的元信息和服务器集群集群的节点状态放在Zookeeper的一些指定节点,供各个客户端订阅使用。
3)分布式日志收集系统。收集器通常是按照应用来分配收集任务单元,因此需要在Zookeeper上创建一个以应用名作为path的节点P,并将这个应用的所有机器ip,以子节点的形式注册到节点P上,这样一来就能实现机器变动的时候,实时通知到收集器调整任务分配。
11.2 统一命名服务
11.3 分布式锁
11.4 总结与思考⭐
1)数据发布与订阅:利用watch观察者机制,实现;场景数据量小,更新快;具体场景:分布式搜索服务/分布式日志收集
2)统一命名:具体实体提供唯一Path作为他的名称
3)分布式锁:把Znode看作一把锁