利用了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选举代码实现的更多相关文章

  1. 一个基于Consul的.NET Leader选举类库

    前段时间有传言说Consul将不能在我国继续使用,后被查明是因法律问题Vault企业版产品不能在国内销售.Valut和Consul都是HashiCorp公司的产品,并且都推出了开源版本,继续使用开源版 ...

  2. ZooKeeper集群与Leader选举

    说说你对ZooKeeper集群与Leader选举的理解?   ZooKeeper是一个开源分布式协调服务.分布式数据一致性解决方案.可基于ZooKeeper实现命名服务.集群管理.Master选举.分 ...

  3. Raft 为什么是更易理解的分布式一致性算法——(1)Leader在时,由Leader向Follower同步日志 (2)Leader挂掉了,选一个新Leader,Leader选举算法。

    转自:http://www.cnblogs.com/mindwind/p/5231986.html Raft 协议的易理解性描述 虽然 Raft 的论文比 Paxos 简单版论文还容易读了,但论文依然 ...

  4. Zookeeper——分布式一致性协议及Zookeeper Leader选举原理

    文章目录 一.引言 二.从ACID到CAP/BASE 三.分布式一致性协议 1. 2PC和3PC 2PC 发起事务请求 事务提交/回滚 3PC canCommit preCommit doCommit ...

  5. external-provisioner源码分析(2)-main方法与Leader选举分析

    更多ceph-csi其他源码分析,请查看下面这篇博文:kubernetes ceph-csi分析目录导航 external-provisioner源码分析(2)-main方法与Leader选举分析 本 ...

  6. 【分布式】Zookeeper的Leader选举

    一.前言 前面学习了Zookeeper服务端的相关细节,其中对于集群启动而言,很重要的一部分就是Leader选举,接着就开始深入学习Leader选举. 二.Leader选举 2.1 Leader选举概 ...

  7. Curator leader 选举(一)

    要想使用Leader选举功能,需要添加recipes包,可以在maven中添加如下依赖: <dependency> <groupId>org.apache.curator< ...

  8. ZOOKEEPER3.3.3源码分析(四)对LEADER选举过程分析的纠正

    很抱歉,之前分析的zookeeper leader选举算法有误,特此更正说明. 那里面最大的错误在于,leader选举其实不是在大多数节点通过就能选举上的,这一点与传统的paxos算法不同,因为如果这 ...

  9. 【Zookeeper】源码分析之Leader选举(二)

    一.前言 前面学习了Leader选举的总体框架,接着来学习Zookeeper中默认的选举策略,FastLeaderElection. 二.FastLeaderElection源码分析 2.1 类的继承 ...

随机推荐

  1. C# ToString常用技巧总结

    ToString是在开发中最常用的操作,其作用是将其它类型以字符串类型表示.例如: int i=2;i.ToString() //”2″Object o = new Object();o.ToStri ...

  2. C程序设计语言练习题1-16

    练习1-16 修改打印最长文本行的程序的主程序main,使之可以打印任意长度的输入行的长度,并尽可能多地打印文本. 代码如下: #include <stdio.h> // 包含标准库的信息 ...

  3. 《学习Opencv》第五章 习题6

    这是第五章 习题5.6的结合版,其中实现了摄像头抓拍功能,能够成功运行. #include "stdafx.h" #include "cv.h" #includ ...

  4. Apache虚拟站点配置

    简单虚拟站点配置: <VirtualHost 127.0.0.2:80> DocumentRoot E:/wamp/www/yue ServerName 127.0.0.2:80</ ...

  5. [BZOJ 2326] [HNOI2011] 数学作业 【矩阵乘法】

    题目链接:BZOJ - 2326 题目分析 数据范围达到了 10^18 ,显然需要矩阵乘法了! 可以发现,向数字尾部添加一个数字 x 的过程就是 Num = Num * 10^k + x .其中 k ...

  6. XML CDATA

    /* <![CDATA[ */var mv_dynamic_to_top = {"text":"To Top","version":& ...

  7. java的"=="与"equals"

    equals 方法是 java.lang.Object 类的方法. 有两种用法说明: (1)对于字符串变量来说,使用“==”和“equals()”方法比较字符串时,其比较方法不同. “==”比较两个变 ...

  8. java数组排序之冒泡排序

    上一篇文章说了,选择排序. 选择排序的原理就是,先确定第一个格子当中的数字是最小的,之后确定第二个格子是其他数字中最小的依次类推. 这一节当中我们来看下冒泡排序: 思路: 1.首先拿第一个数字跟第二个 ...

  9. Code (组合数)

    Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 7184   Accepted: 3353 Description Trans ...

  10. sed删除文本第一个匹配行

    源文本如下,要求删除第一个为happy-123456的行. ----------------------------- aaaaaaa happy- bbbbbb asdasawe happy- ds ...