以示例形式说明 zk 食谱。

假定有 4 个客户端,分别执行 create -s -e /lock/read xx 或 create -s -e /lock/write 获取锁。

一、获取读锁的情况:
/lock/write001
/lock/write002
/lock/read003
/lock/read004

客户端 3 获取读锁:
1. 创建 /lock/read003
2. 获取 /lock 的孩子
3. 发现 writexxx 的最小序号 1 比 3 小
4. 发现 /lock/write002 存在
5. watch /lock/write002 节点,获得通知后,再进入步骤 2

/lock/write001
/lock/read002
/lock/read003
/lock/read004

客户端 2 获取读锁:
1. 创建 /lock/read002
2. 获取 /lock 的孩子
3. 发现 writexxx 的最小序号 1 比 2 小
4. 发现 /lock/write002 不存在
5. 进入步骤 2

/lock/read001
/lock/write002
/lock/read003
/lock/read004

客户端 1 获取读锁:
1. 创建 /lock/read001
2. 获取 /lock 的孩子
3. 发现 writexxx 的最小序号 2 比 1 大,则获得锁

二、获取写锁的情况:
/lock/write001
/lock/read002
/lock/read003
/lock/read004

客户端 1 获得写锁:
1. 创建 /lock/write001 节点
2. 获得 /lock 孩子
3. 发现最小的序号是 001,就是自己,则获得锁

/lock/write001
/lock/read002
/lock/write003
/lock/read004

客户端 3 获得写锁:
1. 创建 /lock/write003 节点
2. 获得 /lock 孩子
3. 发现 001 是最小的序号
4. 发现 xx002 存在
5. watch xx002,等待通知进入步骤 2

/lock/write001
/lock/write002
/lock/read003
/lock/read004

客户端 2 获得写锁:
1. 创建 /lock/write002 节点
2. 获得 /lock 孩子
3. 发现最小的序号是 001
4. 发现 xx002 不存在,因为自己就是
5. 进入步骤 2

三、leader 选举
创建顺序、瞬时节点:create -s -e /election/n- xx

假定 4 个客户端,分别创建如下节点:
/election/n-001
/election/n-002
/election/n-003
/election/n-004

则:
/election/n-001 是 leader

为了避免出现羊群效应,不让所有的客户端 watch 同一个节点。
/election/n-002 watch /election/n-001
/election/n-003 watch /election/n-002
/election/n-004 watch /election/n-003

zookeeper 食谱的更多相关文章

  1. ZooKeeper食谱(八)

    使用ZooKeeper构造高级别应用的指南 在这个文章中,你将会发现使用ZooKeeper来实现高级别功能的指南.所有的它们在客户端上被实现而不需要ZooKeeper特别的支持.希望社区将注意到这些约 ...

  2. ZooKeeper之service discovery

    Zookeeper整体介绍 ZooKeeper is a centralized service for maintaining configuration information, naming, ...

  3. ZooKeeper文档(二)

    ZooKeeper:因为协调的分布式系统是一个动物园 ZooKeeper对分布式应用来说是一个高性能的协调服务.它暴露通常的服务-比如命名,配置管理,同步,和组服务-用一种简单的接口,所以你不用从头开 ...

  4. Zookeeper客户端Curator使用详解

    Zookeeper客户端Curator使用详解 前提 最近刚好用到了zookeeper,做了一个基于SpringBoot.Curator.Bootstrap写了一个可视化的Web应用: zookeep ...

  5. ZooKeeper动态配置(十四)

    概述 在3.5.0发行之前,ZK的全体成员和所有其它的配置参数是静态加载的在启动的时候并且在运行的时候不可变.操作员诉诸于"滚动重启" - 一个手动密集和改变配置文件容易出错的方法 ...

  6. zookeeper(六):Zookeeper客户端Curator的API使用详解

    简介 Curator是Netflix公司开源的一套zookeeper客户端框架,解决了很多Zookeeper客户端非常底层的细节开发工作,包括连接重连.反复注册Watcher和NodeExistsEx ...

  7. 转:Zookeeper客户端Curator使用详解

    原文:https://www.jianshu.com/p/70151fc0ef5d Zookeeper客户端Curator使用详解 前提 最近刚好用到了zookeeper,做了一个基于SpringBo ...

  8. 架构设计:远程调用服务架构设计及zookeeper技术详解(下篇)

    一.下篇开头的废话 终于开写下篇了,这也是我写远程调用框架的第三篇文章,前两篇都被博客园作为[编辑推荐]的文章,很兴奋哦,嘿嘿~~~~,本人是个很臭美的人,一定得要截图为证: 今天是2014年的第一天 ...

  9. [译]ZOOKEEPER RECIPES-Leader Election

    选主 使用ZooKeeper选主的一个简单方法是,在创建znode时使用Sequence和Ephemeral标志.主要思想是,使用一个znode,比如"/election",每个客 ...

随机推荐

  1. android获取屏幕宽度和高度

    1. WindowManager wm = (WindowManager) getContext() .getSystemService(Context.WINDOW_SERVICE); int wi ...

  2. 【Python】【socket】

    [server.py] """#练习1import socketimport threading sock = socket.socket()sock.bind(('12 ...

  3. IDEA @Autowired 出现红色下划线 报红

    例如: 解决方法:

  4. python 定时器

    2s启动一个定时器: import threading import time def hello(name): print "hello %s\n" % name global ...

  5. centos7 (ifconfig不能使用) -bash: ifconfig: command not found

    [root@localhost ~]# ifconfig -bash: ifconfig: command not found 输入ip addr 确认IP地址是否设置正常,设置好如下所示,如果没有获 ...

  6. STL_头文件

    #include <string> #include <vector> #include <deque> #include <queue> #inclu ...

  7. NativeWindow_01_CreateWindow(Ex)_VC6

    1. #include <windows.h> LRESULT CALLBACK ProcWindow(HWND hwnd, UINT uMsg, WPARAM wParam, LPARA ...

  8. 让DOM从页面中消失的方法

    1. 在隐藏的方法中,display取none值这种方法一般是不可取的!因为display:none是直接不显示,也就是不渲染此元素,如果它所作用的元素排版在页面较前,先渲染,就容易引起回流(refl ...

  9. include

    1. 自己写的文件都用:include "....." 2. 如果A类include了B,那么在主函数中,只用include A类,就可以使用B类了,但是此时不能再include ...

  10. jGrid + echart 后台管理

    用来初始化表的大小: $(select_dom).jqGrid( 'setGridWidth', parent_column.width() ); 表的大小随着页面的宽度变化: $(window).o ...