事务
在Zookeeper中
节点类型
-
持久节点(PERSISTENT)
该数据节点被创建后 就会一直存在于Zookeeper服务器上, 直到有删除操作来主动清楚这个节点, -
持久顺序节点(PERSISTENT_SEQUENTIAL)
持久顺序节点的基本特性和持久节点是一致的 额外的特性表现在顺序性上, 在Zookeeper中。 每个父节点都会为它的第一级子节点维护一份顺序, 。 -
临时节点(EPHEMERAL)
和持久节点不同的是 临时节点的生命周期和客户端的会话绑定在一起, 如果客户端会话失效, 那么这个节点就会被自动清理掉, 。 -
临时顺序节点(EPHEMERAL_SEQUENTIAL)
临时顺序节点的基本特性和临时节点是一致的,只是在此基础上添加了顺序特性。
Watcher----数据变更的通知
Zookeeper提供了分布式数据的发布/订阅功能
应用场景
1. 数据发布/订阅
客户端服务端注册自己需要关注的节点
如果将配置信息存放到ZooKeeper上进行集中管理
2. 服务发现与注册
服务端通过暴露服务接口和IP地址的绑定
My implementation: zookeeper registry & discovery
3. 分布式全局唯一ID
在单数据库场景下
4. Master选举
Master 选举是一个在分布式系统中非常常见的应用场景
在分布式系统中
在Zookeeper中
5. 分布式锁
分布式锁是控制分布式系统之间同步访问共享资源的一种方式
-
排他锁
通过调用客户端create接口 在, /exclusive_lock
节点下创建临时子节点/exclusive_lock/lock
因为Zookeeper会保证在所有客户端中。 最终只有一个客户端能够创建成功, , 对于其他没有获取到锁的客户端就可以在, /exclusive_lock
下注册一个子节点变更的Watcher 当有变更时, 进行抢占获取锁资源, 。 - 当获取锁的客户端完成处理
则可以通过删除该临时节点来释放锁, - 如果获取锁的客户端发生宕机
那么临时节点也会被移除, 达到释放锁的效果,
- 当获取锁的客户端完成处理
-
读写锁
在获取共享锁时 所有客户端会到/shared_lock这个节点下面创建一个临时顺序节点, 如果是读请求, 会创建/shared_lock/R-001的节点, 如果是写请求, 则创建/shared_lock/R-002,
- 判断读写顺序
不同的事务都可以同时对同一个数据对象进行读取操作 而更新操作必须在当前没有任何事务进行读写操作的情况下进行, 步骤如下。 : - 创建完节点后
获取shared lock 节点下的所有子节点, 并对该节点注册子节点变更的Watcher监听, - 确定自己的节点序号在所有子节点中的顺序
- 对于读请求
如果没有比自己序号小的子节点 或是所有比自己序号小的子节点都是读请求, 那么表明自己已经成功获取到了共享锁, 同时开始执行读取逻辑, 如果比自己序号小的子节点中有写请求。 那么就需要进人等待, 。 - 对于写请求
如果自己不是序号最小的子节点 那么就需要进人等待, 。 - 接收到 Watcher 通知后
重复步骤, - 释放锁的过程和排他锁是一致的
- 判断读写顺序
-
羊群效应
如果每个节点都去监听最小的节点是否有变动 当出现大量节点等待最小的写节点释放锁, 那么靠后的节点会被激活, 拉取新的节点列表, 但是发现还没有轮到自己, 于是继续等待, 所以最小节点的变动除了对下一节点有影响外, 对余下的其他节点没有任何作用, 。 - 改进
- 读请求
向比自己序号小的最后一个写请求节点注册Watcher监听 - 写请求
向比自己序号小的最后一个节点注册Watcher监听
- 读请求
- 改进