利用了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. [jQuery编程挑战]004 针对选择框词典式排序

    <!DOCTYPE html> <html lang="zh"> <head> <meta charset="utf-8&quo ...

  2. 那些年被我坑过的Python——牵一发动全身 第十一章MySQL、ORM

    #!/usr/bin/env python # -*- coding:utf-8 -*- __Author__ = "Zhang Xuyao" from sqlalchemy im ...

  3. JSP HTML区别

    1.最简单的区别就是,HTML能直接打开,jsp只能发布到Tomact等服务器上才能打开2.定义上HTML页面是静态页面可以直接运行,JSP页面是动态页它运行时需要转换成servlet.3.他们的表头 ...

  4. BZOJ 1009 GT考试

    Description 阿申准备报名参加GT考试,准考证号为N位数X1X2....Xn(0<=Xi<=9),他不希望准考证号上出现不吉利的数字.他的不吉利数学A1A2...Am(0< ...

  5. ios开发学习--歌词处理--解析lrc文件

    我觉得要想解析lrc 首先大家应该了解一下lrc文件的结构,大家可以去看一下**百科 我这里粗略的写一下: ■ 时间标签(Time-tag) 形式为"[mm:ss]"(分钟数:秒数 ...

  6. mysql 监控长事务

    mysql> desc information_schema.innodb_trx -> ; +----------------------------+----------------- ...

  7. 图论(二分图,KM算法):HDU 3488 Tour

    Tour Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)Total Submis ...

  8. 调用系统api修改系统时间

    一:截图 二:代码 using System; using System.Collections.Generic; using System.ComponentModel; using System. ...

  9. [转载][HTML] 普通的DIV分层以及版透明效果

    来源忘记哪的了,我稍微做了点修改,想了想还是挂了转载的标签,嗯嗯: <html> <head> <title>EXAMPLE</title> </ ...

  10. 最小生成树 10.1.5.253 1505 poj 1258 http://poj.org/problem?id=1258

    #include <iostream>// poj 1258 10.1.5.253 1505 using namespace std; #define N 105 // 顶点的最大个数 ( ...