[译]ZOOKEEPER RECIPES-Leader Election
2017-01-07 10:48
281 查看
选主
使用ZooKeeper选主的一个简单方法是,在创建znode时使用Sequence和Ephemeral标志。主要思想是,使用一个znode,比如"/election",每个客户端创建一个子节点"/election/guid-n_",并同时使用Sequence和Ephemeral标志。使用sequence标志后ZooKeeper会自动递增序列号。拥有最小编号的节点就是主节点。这还不是全部,同时还需要watch主节点的失效,在当前主节点失效后,会产生新的主节点。一般情况是所有节点都监视着最小的那个节点,并在主节点失效时检查自己是否成为新的主节点(由于使用了ephemeral,节点失效就会删除对应znode)。但是这会造成羊群效应,当前主节点失效,所有其他进程都会收到通知,并运行getChildren来获得当前所有存活的节点。如果节点数量很大,就会导致ZooKeeper的工作量激增。为了避免羊群效应,可以只监视比自己小的那个节点。如果一个客户端收到一个watch通知,它就成为新的主节点。这样就避免所有节点监视一个节点导致的羊群效应。
伪代码
假设ELECTION是用于选主的路径。为了竞选主节点:1.创建znode z路径为"ELECTION/guid-n_"并同时使用SEQUENCE和EPHEMERAL
2.假设C是"ELECTION"的子节点集,i是z的序列号
3.监视"ELECTION/guid-n_j",j是仅次于自己的序列号。j<i且在C中存在n_j节点
在被监视节点删除后收到通知:
1.假设C是ELECTION最新的子节点集
2.如果z是C中最小的节点,则进行主节点的工作
3.不然监视"ELECTION/guid-n_j",j是仅次于自己的序列号。j<i且在C中存在n_j节点
注意
如果一个znode是最小的节点,并不代表它知道自己是主节点,所以可以通过在一个不同的目录创建节点来标识已经完成主节点的操作。guid的使用可以参考可恢复错误和GUID
Curator实现
Leader Latch
public LeaderLatch(CuratorFramework client, String latchPath) /** client 客户端实例 latchPath 选举路径 **/ leaderLatch.start(); //开启选举 leaderLatch.heasLeadership() //返回是否为主节点 leaderLatch.await(); //等待直到成为主节点 leaderLatch.close(); //关闭
Leader Election
public LeaderSelector(CuratorFramework client, String mutexPath, LeaderSelectorListener listener) /** client 客户端实例 mutexPath 选举路径 listener 被选中后的监听器 **/ leaderSelector.start(); //开启选举 leaderSelector.close(); //关闭选举
相关文章推荐
- (一)剑指Offer之二维数组中的查找
- python构造字典的dict()函数理解
- 【Codeforces 754 B Ilya and tic-tac-toe game】
- 我最近用Python写了一个算法,不需要写任何规则就能自动识别一个网页的内容
- Softmax输出层损失函数及偏导数
- 77. Combinations 难度:medium
- 使用XHR2或Jsonp实现跨域以及实现原理
- windows10安装Scrapy
- Yii框架弹出窗口组件CJuiDialog用法分析
- Fedora 25U盘启动盘的制作
- JIT与JVM的三种执行模式:解释模式、编译模式、混合模式
- MySQL
- Statement对象的executeUpdate返回信息
- Android 滑动
- 抓包工具Fiddler的使用教程(五): 修改response的数据
- 希表之bkdrhash算法解析及扩展
- Effective Java : 方法
- 回调函数(CALLBACK)学习总结
- LeetCode OJ-49.Group Anagrams
- 安卓各版本主要的特性