基于库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 类的继承 ...
随机推荐
- nginx 一般配置实例 静态页面
# 使用的用户和组 user www www; # 指定工作衍生进程数(一般等于CPU的总核数或总核数的两倍,例如两个四核CPU,则总核数为8) worker_processes 8; # 指定错误日 ...
- 使用Raphael 画图(四) 路径(一) (javascript)
这章介绍路径,本人觉得这是比较难和精髓的一部分. 先介绍基本知识: 可以参考: http://www.chinasvg.com/support/svg-tutorial/svg-path-direct ...
- delphi 2010 动态链接库DLL断点调试
DELPHI 2010 动态链接库DLL断点调试 马根峰 (广东联合电子服务股份有限公司,广州 510300) 摘要:本文详细介绍了Delphi 2010中的动态链接库DLL断点调试技术 关键词:DE ...
- jquery获取元素的所有宽高(包括内边距和外边距)
width() - 返回元素的宽度.height() - 返回元素的高度.innerWidth() 方法返回元素的宽度(包括内边距). innerHeight() ...
- .NET 元数据
1. 安装 ILDASM 工具 VS -- 外部工具 -- 添加 -- 命令行为:C:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\bin\NET ...
- 使用CSS3改变选中元素背景色
CSS3代码如下: /* SELECTION ----------------- */ ::-moz-selection { background: #f00533; color: white; te ...
- js/jquery/插件表单验证
媳妇要学js,就收集一些资料给她. 1.js 表单验证 : http://hi.baidu.com/yanchao0901/item/161f563fb84ea5433075a1eb 2.jquery ...
- 【转】SharePoint 2013 stand alone服务器安装
原文地址:http://www.cnblogs.com/jianyus/archive/2013/02/01/2889653.html 介绍:文章就是SharePoint2013安装过程的图解,包括 ...
- 人在江湖飘,哪能不挨刀。CENTOS之后,UBUNTU,FEDORA都要安装起来作测试啊
还好,我们有VIRTUAL BOX.
- Netty4.0学习笔记系列之一:Server与Client的通讯
http://blog.csdn.net/u013252773/article/details/21046697 本文是学习Netty的第一篇文章,主要对Netty的Server和Client间的通讯 ...