介绍
1、何为Zookeeper?
ZooKeeper 是 一个分布式协调服务,提供了诸如数据发布/订阅、负载均衡、命名服务、分布式协调/通知和分布式锁等分布式基础服务。(分布式协调服务:就是说zookeeper是专门用来协调和解决分布式的一些问题的)
2、它可以用来做什么?
配置中心
分布式锁
集群管理 等等…
3、Zookeeper数据模型
ZooKeeper 是一个树形目录服务(就是说zookeeper它的存储形式是一个目录的形式),其数据模型和Unix的文件系 统目录树很类似,拥有一个层次化结构。
这里面的每一个节点都被称为:ZNode,每个节点上都会保存自己的数据和节点信息。
节点可以拥有子节点,同时也允许少量(1MB)数据存储在该节点之下。
节点可以分为四大类:
•PERSISTENT 持久化节点
•EPHEMERAL 临时节点:-e
•PERSISTENT_SEQUENTIAL 持久化顺序节点:-s
•EPHEMERAL_SEQUENTIAL 临时顺序节点:-es
4、操作方式
4.1、ZooKeeper 命令操作
答:简而言之就是通过命令行的方式对zookeeper进行操作…
zookeeper又分为服务端和客户端…
4.2、ZooKeeper Java Api操作
1、Curator介绍
Curator 是 Apache ZooKeeper 的Java客户端库,就是说它对zookeeper的底层接口进行了进一步的封装,更方便我们通过api的方式对zookeeper进行操作。
常见的ZooKeeper Java API :
1、原生Java API
2、ZkClient
3、Curator
2、CuratorAPI 常用操作(Java方式操作zookeeper常用操作)(重点)
•建立连接
•添加节点
•删除节点
•修改节点
•查询节点
•Watch事件监听
•分布式锁实现
3、Curator实现分布式锁API
•在Curator中有五种锁方案:
•InterProcessSemaphoreMutex:分布式排它锁(非可重入锁)
•InterProcessMutex:分布式可重入排它锁
•InterProcessReadWriteLock:分布式读写锁
•InterProcessMultiLock:将多个锁作为单个实体管理的容器
•InterProcessSemaphoreV2:共享信号量
5、应用场景实现介绍
5.1、配置中心
5.1.1、介绍
在分布式系统中,许多的服务被切分成了许多的模块(微服务)来独立运行,如果每次配置文件发生了变化,就需要把每个节点上的配置文件都修改一次,这是非常麻烦、不可忍受的。
于是,我们把配置文件统一放在一个地方,配置文件修改了之后,能够及时通知所有节点重新加载。这样即使再多的节点,也只需要修改一次配置文件。这个管理统一配置的系统就是统一配置中心。
常见的配置中心
spring-cloud-config
apollo
zookeeper
统一配置中心的核心功能之一就是配置变化后,及时通知所有的节点。zookeeper的watch机制正好可以满足这样的需求,所以可以通过利用zookeeper的watch机制来实现配置中心。
5.1.2、具体实现思路
1、连接zookeeper服务器;
2、客户端创建watch监听器(实现watch接口),监听各个节点数据的变化(增删查改),从而做出对应的操作;
(如果zookeeper是集群模式,leader节点还会将更改后的配置数据,先同步更新到其他flowwer节点上)
3、当zookeeper中的配置信息发生变化时,通过watcher的回调方法捕获变换的配置数据,然后获取到本地,然后更新本地的配置信息;
5.2、分布式锁
5.2.1、什么是分布式锁?
看个场景:两个用户同时去抢购秒杀商品,当秒杀服务同时收到秒杀请求时,都去进行库存扣减,此时在没有做任何处理的情况下,就会导致库存数量变成负数从而导致超卖现象。
答:这种情况下如果是单体项目,我们一般会选择加锁的方式来避免并发的问题。但是在分布式场景中,采用传统的锁并不能解决跨进程并发的问题,所以需要引入一个分布式锁,来解决多个节点之间的访问控制。
5.2.2、Zookeeper如何实现分布式锁?(两种方式)
1、通过 唯一节点特性 实现分布式锁(谁先创建一个节点,谁就获得锁)
2、通过 有序节点 实现分布式锁(在指定节点下创建一个临时有序节点,创建越早的节点的顺序编号越小,最先获得锁)
6、ZooKeeper 集群搭建
1、Zookeeper集群角色
在ZooKeeper集群服中务中有三个角色:
Leader 领导者
处理事务请求
集群内部各服务器的调度者
Follower 跟随者
处理客户端非事务请求,转发事务请求给Leader服务器
参与Leader选举投票
Observer 观察者:
处理客户端非事务请求,转发事务请求给Leader服务器