五、zookeeper(1)基础回顾

一、zookeeper是什么

zookeeper是一个开源的 分布式应用程序协调服务。

他可以为分布式应用提供 同步服务、配置维护、命名服务等。

二、zookeeper能做什么

1.注册中心:

如作为Dubbo框架的注册中心, 服务提供者和消费者都向zookeeper注册自己的url, 消费者拿到提供者注册的url, 通过url去调用服务, 如果提供者的url发生了变化, zookeeper会更新变动并通知消费者进行更新。

2. 分布式锁:

利用zookeeper的一致性文件系统来实现:

①独占锁: 将zookeeper上的一个znode看做一把锁,所有客户端都去创建同一节点 /lock, 最终只有一个客户端能成功创建, 相当于获取了锁, 释放锁即删除此节点, 如果拥有锁的客户端宕机, 如果使用临时目录节点, 客户端与zookeeper的连接断掉, zookeeper会自动删除此节点。 

②控制时序: 预先创建/lock 节点, 所有客户端要获取锁, 都来此节点下创建临时顺序编号目录节点, 编号最小的获得锁, 用完删除, 依次执行。

分布式锁实现流程

五、zookeeper(1)基础回顾

在获取分布式锁的时候在locker节点下创建临时顺序节点,释放锁的时候删除该临时节点。客户端调用createNode方法在locker下创建临时顺序节点,
然后调用getChildren(“locker”)来获取locker下面的所有子节点,注意此时不用设置任何Watcher。客户端获取到所有的子节点path之后,如果发现自己创建的节点在所有创建的子节点序号最小,那么就认为该客户端获取到了锁。如果发现自己创建的节点并非locker所有子节点中最小的,说明自己还没有获取到锁,此时客户端需要找到比自己小的那个节点,然后对其调用exist()方法,同时对其注册事件监听器。之后,让这个被关注的节点删除,则客户端的Watcher会收到相应通知,此时再次判断自己创建的节点是否是locker子节点中序号最小的,如果是则获取到了锁,如果不是则重复以上步骤继续获取到比自己小的一个节点并注册监听。当前这个过程中还需要许多的逻辑判断。

五、zookeeper(1)基础回顾

 

3.队列管理:

两种类型的队列:
① 同步队列,当一个队列的成员都聚齐时,这个队列才可用,否则一直等待所有成员到达:

在约定目录下创建临时目录节点,监听节点数目是否是我们要求的数目。

② 队列按照 FIFO 方式进行入队和出队操作:

和分布式锁服务中的控制时序场景基本原理一致,入列有编号,出列按编号。在特定的目录下创建PERSISTENT_SEQUENTIAL节点,创建成功时Watcher通知等待的队列,队列删除***最小的节点用以消费。此场景下Zookeeper的znode用于消息存储,znode存储的数据就是消息队列中的消息内容,SEQUENTIAL***就是消息的编号,按序取出即可。由于创建的节点是持久化的,所以不必担心队列消息的丢失问题

三、zookeeper功能

1.文件系统

zookeeper提供一个多层级的节点命名空间(节点称为znode)。与文件系统不同的是, 这些节点都可以设置关联的数据, 而文件系统中只有文件节点才可以存储数据而目录节点不能存储数据。zookeeper为了保证高吞吐和低延迟, 在内存中维护了一个树状目录结构, 这种特性使得zookeeper不能用于存放大量的数据, 每个节点的存放数据上限为1M。

五、zookeeper(1)基础回顾

四种类型的znode

①PERSISTENT-持久化目录节点 

客户端与zookeeper断开连接后,该节点依旧存在 

PERSISTENT_SEQUENTIAL-持久化顺序编号目录节点

客户端与zookeeper断开连接后,该节点依旧存在,只是Zookeeper给该节点名称进行顺序编号 

EPHEMERAL-临时目录节点

客户端与zookeeper断开连接后,该节点被删除 

EPHEMERAL_SEQUENTIAL-临时顺序编号目录节点

客户端与zookeeper断开连接后,该节点被删除,只是Zookeeper给该节点名称进行顺序编号

2.通知机制

client端会对某个znode建立一个watcher事件,当该znode发生变化时,这些client会收到zk的通知,然后client可以根据znode变化来做出业务上的改变等。

 

参考文章:

https://segmentfault.com/a/1190000014479433#articleHeader10