初识Zookeeper
- Zookeeper是Apache Hadoop 项目下的一个子项目,是一个树形目录服务。
- Zookeeper翻译过来是 动物园管理员,它是用来管理Hadoop(🐘)、Hive(🐝)、Pig(🐖)的管理员。简称zk
- Zookeeper是一个开源的分布式协调服务。它是一个为分布式应用提供一致性服务的软件(用于管理分布式应用程序的)
- Zookeeper提供的主要功能包括:
* 配置管理
* 分布式锁
* 集群管理
配置管理
比如说A、B、C三个模块都需要配置数据库连接(相同的),
如果都在各自的配置文件中配置,修改的话,会很麻烦,可以在配置中心配置,用的话在配置中心拉取就可以
分布式锁
在单机的情况下,可以直接加🔒,一个线程对同步代码块进行操作时,其他线程不能进入同步代码块,进入阻塞状态。
不过在分布式的情况下,这种加锁方式就不适用了,需要加分布式🔒的方式进行操作。
注册中心
提供方先在注册中心注册地址,服务方如果想访问提供方,就会在注册中心中拉取地址,服务方最后通过RPC
Zookeeper命令操作
Zookeeper数据模型
- Zookeeper是一个树形目录服务,器数据模型和Unix的文件系统目录和类似,拥有一个层次化的结构
- 这里面的每一个节点都被称为:ZNode,每个节点上都会保存自己的数据和节点信息。
- 节点可以拥有子节点,同时也允许少量(1MB)数据存储在该节点之下
- 节点可以分为四大类
* PERSISTENT 持久化节点
* EPHEMERAL 临时节点 :-e
* PERSISTENT_SEQUENTIAL 持久化顺序节点:-s
* EPHEMERAL_SEQUENTIAL 临时顺序节点:-es
Zookeeper 服务端常用命令 - 启动Zookeeper服务: ./zkServer.sh start
- 查看Zookeeper服务状态:./zkServer.sh status
- 停止Zookeeper服务:./zkServer.sh stop
- 重启Zookeeper服务:./zkServer.sh restart
Zookeeper 客户端常用命令
- 连接Zookeeper服务端
./zkCli.sh -server ip:port
- 断开连接
quit
- 设置节点值
set /节点path value
- 查看命令帮助
help
- 删除单个节点
delete /节点path
- 显式指定目录下节点
ls 目录
- 删除带有子节点的节点
deleteall/节点path
- 创建节点
create /节点path value
- 获取节点值
get /节点path
- 创建临时节点
create -e /节点path value
- 创建顺序节点
create -s /节点path value
- 查询节点详细信息
ls -s / 节点path
Zookeeper JavaAPI操作
Curator介绍
- Curator是Apache Zookeeper 的Java客户端库
- 原生Java API
- zkClient
- Curator
- Curator项目的目标是简化Zookeeper客户端的使用。
- Curator最初是Netfix研发的,后来捐献了Apache基金会,目前是Apache的顶级项目
Curator API常用操作
- 建立连接
- 添加节点
- 删除节点
- 修改节点
- 查询节点
- Watch事件监听
Zookeeper 允许用户在指定节点上注册一些Watcher,并且在一些特定事件触发得时候,Zookeeper 服务端会将时间通知到感兴趣得客户端上去,该机制是Zookeeper 实现分布式协调服务的重要特性。- Zookeeper 中引入了Watcher机制来实现了发布/订阅功能,能够让多个订阅者同时监听某一个对象,当一个对象自身状态变化时,会通知所有订阅者
- Zookeeper 原生支持通过注册Wat cher来进行事件监听,但是其他使用并不是很方便,需要开发人员自己反复注册Watcher,比较繁琐
- Curator引入了Cache来实现对Zookeeper服务端事件得监听
- Zookeeper 提供了三种Watcher:
- NodeCache:只是监听某一个特定的节点
- PathChildrenCache:监控一个ZNode的子节点
- TreeCache:可以监控整个树上所有节点,类似于NodeCache和PathChildrenCache的组合
分布式锁实现
- 在我们进行单机应用开发,涉及并发同步的时候,我们往往采用synchronized或者Lock得方式来解决多线程间得代码同步问题,这是多线程的运行都是在同一个JVM之下,没有任何问题
- 但当我们得应用是分布式集群工作的情况下,属于多JVM下得工作环境,跨JVM已经无法通过多线程得锁解决同步问题。
- 那么就需要一种更加高级得锁机制,来处理种跨机器进程之间的数据同步问题------这就是分布式锁
Zookeeper分布式锁原理
- 核心思想:当客户端要获取锁,则创建节点,使用完锁,则删除该节点
1.客户端获取锁时,在lock节点下创建临时顺序节点。(如果是持久化节点,如果宕机,🔒不会被释放,节点不会被删除)
2.然后获取lock下面的所有子节点,客户端获取到所有的子节点之后,如果发现自己创建的
子节点序号最小,那么就认为该客户端获取到了锁。使用完锁后,将该节点删除
3.如果发现自己创建的节点并非lock所有子节点中最小的,说明自己还没有获取到锁,此时客户端需要找到比自己小的那个节点(一个),同时对其注册事件监听器,监听删除事件
4.如果发现比自己小的那个节点被删除,则客户端得Watcher会受到响应通知,此时再次判断自己创建的节点是否是lock子节点中序号最小的,如果是则获取到了锁,如果不是则重复以上步骤继续获取到比自己小的一个节点并注册监听