利用了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. string.Format 日期格式化

    String.Format日期的格式化例子: DateTime dt = DateTime.Now;//2010年10月4日 17点05分 string str = ""; //s ...

  2. PPI是什么?如何计算?

    PPI,英文全称:pixels per inch,即像素每英寸,也叫像素密度,它是描述在水平的和垂直的方向上,每英寸距离的图像包含的像素(pixel)数目.因此PPI数值越高,即代表显示屏能够以越高的 ...

  3. 1027. Colors in Mars (20) PAT

    题目:http://pat.zju.edu.cn/contests/pat-a-practise/1027 简单题,考察十进制数和n进制数的转换和输出格式的控制. People in Mars rep ...

  4. bzoj3668

    noi水题,直接推出来每一位上取什么值才能取1直接搞就可以了 ..] of longint; x,n,i,j,k,t,m,ans:longint; fl:boolean; s:string; ch:c ...

  5. Linux下如何查看高CPU占用率线程 LINUX CPU利用率计算

    目录(?)[-] proc文件系统 proccpuinfo文件 procstat文件 procpidstat文件 procpidtasktidstat文件 系统中有关进程cpu使用率的常用命令 ps ...

  6. linux(ubuntu)下分区和格式化sd卡

    我的手机sd卡需要分成两个分区,在windowxp下面死活搞不成.主要的问题是,window只认识sd卡的第一个分区.有人用修改驱动程序,让windows把sd卡认成日立的microdisk,分区和格 ...

  7. CodeForces 591B

    题目链接: http://codeforces.com/problemset/problem/591/B 题意: 给你一串字符串,字符串里的字符全是a-z的小写字母,下面的m行,是字符串的交换方式, ...

  8. 浅谈层次化的AI架构

    原文地址:http://www.aisharing.com/archives/86/comment-page-1 记得在以前的一篇文章中谈到了一种类似于双缓冲的AI结构,最近在整理一些东西的时候,发现 ...

  9. MySQL客户端执行外部sql文件命令

    客户端 source d:\bbs.sql 或者 \.  d:\bbs.sql

  10. LeetCode (85): Maximal Rectangle [含84题分析]

    链接: https://leetcode.com/problems/maximal-rectangle/ [描述] Given a 2D binary matrix filled with '0's ...