基于库zkclient 的leader选举代码实现
利用了zookeeper临时节点,在当连接或session断掉时被删除这一特性来做选举。(简单简单互斥锁)
查了下网上的做法。
大致流程:
<1>判定是否存在/wzgtest路径
<2>如果不存在,那么试图创建一个节点znode(Ephemeral Path)(path = /wzgtest,data=client id)
<2.1>创建成功,标识自己是leader。
<2.2>创建不成功(包括异常)标识自己是slave。
<3>监听/wzgtest节点的数据变化。节点移除(zookeeper连接断开,session超时)时,重走<1>重新进行选举。
具体代码详见附件。
该代码只是实现,并未进行包装优化。
import java.net.InetAddress;
import java.net.UnknownHostException; import org.I0Itec.zkclient.IZkDataListener;
import org.I0Itec.zkclient.ZkClient; /**
* @author 作者 王志刚
* @version 创建时间:2016年8月18日 下午7:13:49
* @Description: zkleader选举
*/
public class ZKLeaderElect { public boolean isLeader = false;
private ZkClient zkClient = null;
private String path = "XXXXX";
private String hostInfo = "initString"; public void initZKLeaderElect(String zkServers, String path, String s) {
zkClient = new ZkClient(zkServers, 10000, 10000);
this.path = path;
try {
hostInfo = InetAddress.getLocalHost().toString();
} catch (UnknownHostException e) {
}
hostInfo = s;
} /**
* 选举leader
*
*/
public void tryLeader() {
if (!zkClient.exists(path)) {
try {
zkClient.createEphemeral(path, hostInfo);
isLeader = true;
System.out.println(hostInfo + " 成为leader了");
} catch (Exception e) {
System.out.println(hostInfo+"成为leader失败");
e.printStackTrace();
isLeader = false;
}
}
} /**
* 监听指定节点的数据变化
*
*/
public void testListener() throws InterruptedException {
// 监听指定节点的数据变化
zkClient.subscribeDataChanges(path, new IZkDataListener() {
public void handleDataChange(String s, Object o) throws Exception {
// System.out.println(hostInfo+"说:");
// System.out.println("node data changed!");
// System.out.println("node=>" + s);
// System.out.println("data=>" + o);
// System.out.println("--------------");
// tryLeader();
} public void handleDataDeleted(String s) throws Exception {
System.out.println(hostInfo+"说:");
System.out.println("node data deleted!");
System.out.println("s=>" + s);
System.out.println("--------------");
tryLeader();
}
}); System.out.println(hostInfo + " ----- ready!"); } public static void main(String[] args) throws InterruptedException {
ZKLeaderElect zk1 = new ZKLeaderElect();
zk1.initZKLeaderElect("10.1.51.221:7605", "/wzgtest","1"); ZKLeaderElect zk2 = new ZKLeaderElect();
zk2.initZKLeaderElect("10.1.51.221:7605", "/wzgtest","2"); ZKLeaderElect zk3 = new ZKLeaderElect();
zk3.initZKLeaderElect("10.1.51.221:7605", "/wzgtest","3"); zk1.tryLeader();
zk2.tryLeader();
zk3.tryLeader();
zk1.testListener();
zk2.testListener();
zk3.testListener();
int i = 0;
// junit测试时,防止线程退出
while (true) {
Thread.sleep(1000);
i++;
if(i % 5 == 0){
if(zk1.isLeader){
zk1.zkClient.close();
System.out.println("1 关闭了");
zk1.isLeader = false;
}
if(zk2.isLeader){
zk2.zkClient.close();
System.out.println("2 关闭了");
zk2.isLeader = false;
}
if(zk3.isLeader){
zk3.zkClient.close();
System.out.println("3 关闭了");
zk3.isLeader = false;
}
}
System.out.println("1"+zk1.isLeader+" 2:"+zk2.isLeader+" 3:"+zk3.isLeader); }
}
}
基于库zkclient 的leader选举代码实现的更多相关文章
- 一个基于Consul的.NET Leader选举类库
前段时间有传言说Consul将不能在我国继续使用,后被查明是因法律问题Vault企业版产品不能在国内销售.Valut和Consul都是HashiCorp公司的产品,并且都推出了开源版本,继续使用开源版 ...
- ZooKeeper集群与Leader选举
说说你对ZooKeeper集群与Leader选举的理解? ZooKeeper是一个开源分布式协调服务.分布式数据一致性解决方案.可基于ZooKeeper实现命名服务.集群管理.Master选举.分 ...
- Raft 为什么是更易理解的分布式一致性算法——(1)Leader在时,由Leader向Follower同步日志 (2)Leader挂掉了,选一个新Leader,Leader选举算法。
转自:http://www.cnblogs.com/mindwind/p/5231986.html Raft 协议的易理解性描述 虽然 Raft 的论文比 Paxos 简单版论文还容易读了,但论文依然 ...
- Zookeeper——分布式一致性协议及Zookeeper Leader选举原理
文章目录 一.引言 二.从ACID到CAP/BASE 三.分布式一致性协议 1. 2PC和3PC 2PC 发起事务请求 事务提交/回滚 3PC canCommit preCommit doCommit ...
- external-provisioner源码分析(2)-main方法与Leader选举分析
更多ceph-csi其他源码分析,请查看下面这篇博文:kubernetes ceph-csi分析目录导航 external-provisioner源码分析(2)-main方法与Leader选举分析 本 ...
- 【分布式】Zookeeper的Leader选举
一.前言 前面学习了Zookeeper服务端的相关细节,其中对于集群启动而言,很重要的一部分就是Leader选举,接着就开始深入学习Leader选举. 二.Leader选举 2.1 Leader选举概 ...
- Curator leader 选举(一)
要想使用Leader选举功能,需要添加recipes包,可以在maven中添加如下依赖: <dependency> <groupId>org.apache.curator< ...
- ZOOKEEPER3.3.3源码分析(四)对LEADER选举过程分析的纠正
很抱歉,之前分析的zookeeper leader选举算法有误,特此更正说明. 那里面最大的错误在于,leader选举其实不是在大多数节点通过就能选举上的,这一点与传统的paxos算法不同,因为如果这 ...
- 【Zookeeper】源码分析之Leader选举(二)
一.前言 前面学习了Leader选举的总体框架,接着来学习Zookeeper中默认的选举策略,FastLeaderElection. 二.FastLeaderElection源码分析 2.1 类的继承 ...
随机推荐
- C#遍历所有的Textbox控件并赋值为String.Empty
foreach (Control control in this.Controls) { if (control.GetType().Name.Equals("TextBox")) ...
- IOS开发备忘
1. ios 真机调试时出现CopyPngFile error解决方法 说是读取的时候没有找到这张图片,检查了一下图片路径,没有问题,于是google之,找到两种解决方法 : 方法一:在build s ...
- 定制linux中的Gtk theme<一>如何设置窗口按钮的多态效果
GTK主题之个人理解: GTK 主题引擎(包含代码所需的图形元素) + 主题配置文件(gtkrc文件)+ 数据资源文件(如图片等) 三者所呈现给用户的视觉风格效果 GTK拥有一套大量的widg ...
- C语言-01基础语法
1) 总结常见文件的拓展名 .c 是C语言源文件,在编写代码的时候创建 .o 是目标文件,在编译成功的时候产生 .out 是可执行文件,在链接成功的时候产生 2) 总结 ...
- [POJ 2774] Long Long Message 【后缀数组】
题目链接:POJ - 2774 题目分析 题目要求求出两个字符串的最长公共子串,使用后缀数组求解会十分容易. 将两个字符串用特殊字符隔开再连接到一起,求出后缀数组. 可以看出,最长公共子串就是两个字符 ...
- java 动态代理学习(Proxy,InvocationHandler)
前几天看到java的动态代理机制,不知道是啥玩意,然后看了看.死活不知道 invoke(Object proxy, Method m, Object[] args)种的proxy是个什么东西,放在这里 ...
- 执行计划中常见index访问方式(转)
近期有朋友对于单个表上的index各种情况比较模糊,这里对于单个表上,单个index出现的大多数情况进行了总结性测试,给出了测试结果,至于为什么出现这样的试验结果未做过多解释,给读者留下思考的空间.本 ...
- 14.5.3 Locks Set by Different SQL Statements in InnoDB
14.5.3 Locks Set by Different SQL Statements in InnoDB 通过不同的SQL语句设置的锁 在InnoDB中 一个锁定读, 一个UPDATE 或者一个D ...
- bzoj1135
POI阴影又发作了但这道题挺好的,比较涨知识裸的想法是裸的每次二分图匹配,但显然会TLE这里就要引入Hall定理:二分图G中的两部分顶点组成的集合分别为X, Y, X={X1, X2, X3,X4,. ...
- 【Animations】
这个比较高端了!CSS3动画帧数科学计算法 基于css的3d和动画 基于css的3d和动画(2) 如何使用JavaScript控制CSS Animations(动画)和Transitions(过渡) ...