模拟使用zookeeper实现master选举
- 模拟选举机器类
package com.karat.cn.zookeeperAchieveLock.zkclient; import java.io.Serializable; /**
* 选举的机器
*/
public class UserCenter implements Serializable{ private static final long serialVersionUID = -1776114173857775665L;
private int id; //机器信息 private String name;//机器名称 public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} @Override
public String toString() {
return "UserCenter [id=" + id + ", name=" + name + "]";
} }
- 选举服务
package com.karat.cn.zookeeperAchieveLock.zkclient; import org.I0Itec.zkclient.IZkDataListener;
import org.I0Itec.zkclient.ZkClient;
import org.I0Itec.zkclient.exception.ZkNodeExistsException; import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit; /**
* 选举的服务
*/
public class MasterSelector { private ZkClient zkClient; private final static String MASTER_PATH="/master"; //需要争抢的节点 private IZkDataListener dataListener; //注册节点内容变化 private UserCenter server; //其他服务器 private UserCenter master; //master节点 private boolean isRunning=false; ScheduledExecutorService scheduledExecutorService= Executors.newScheduledThreadPool(1);//定时任务 public MasterSelector(UserCenter server,ZkClient zkClient) {
System.out.println("["+server+"] 去争抢master权限");
this.server = server;
this.zkClient=zkClient; this.dataListener= new IZkDataListener() {
@Override
public void handleDataChange(String s, Object o) throws Exception { } @Override
public void handleDataDeleted(String s) throws Exception {
//节点如果被删除, 发起选主操作
chooseMaster();
}
};
} public void start(){
//开始选举
if(!isRunning){
isRunning=true;
zkClient.subscribeDataChanges(MASTER_PATH,dataListener); //注册节点事件
chooseMaster();
}
} public void stop(){
//停止
if(isRunning){
isRunning=false;
scheduledExecutorService.shutdown();
zkClient.unsubscribeDataChanges(MASTER_PATH,dataListener);
releaseMaster();
}
} //具体选master的实现逻辑
private void chooseMaster(){
if(!isRunning){
System.out.println("当前服务没有启动");
return ;
}
try {
zkClient.createEphemeral(MASTER_PATH, server);//创建一个临时节点
master=server; //把server节点赋值给master
System.out.println(master+"->我现在已经是master,你们要听我的"); //定时器
//master释放(master 出现故障),没2秒钟释放一次
scheduledExecutorService.schedule(()->{
releaseMaster();//释放锁
},2, TimeUnit.SECONDS);
}catch (ZkNodeExistsException e){
//创建一个临时节点抛出异常
//表示master已经存在
UserCenter userCenter=zkClient.readData(MASTER_PATH,true);
if(userCenter==null) {
System.out.println("启动操作:");
chooseMaster(); //再次获取master
}else{
master=userCenter;
}
}
} private void releaseMaster(){
//释放锁(故障模拟过程)
//判断当前是不是master,只有master才需要释放
if(checkIsMaster()){
zkClient.delete(MASTER_PATH); //删除
}
} private boolean checkIsMaster(){
//判断当前的server是不是master
UserCenter userCenter=zkClient.readData(MASTER_PATH);
if(userCenter.getName().equals(server.getName())){
master=userCenter;
return true;
}
return false;
} }
- 选举测试
package com.karat.cn.zookeeperAchieveLock.zkclient; import org.I0Itec.zkclient.ZkClient;
import org.I0Itec.zkclient.serialize.SerializableSerializer; import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit; /**
* master选举测试
*/
public class MasterChooseTest { private final static String CONNECTSTRING="47.107.121.215:2181"; public static void main(String[] args) throws IOException {
List<MasterSelector> selectorLists=new ArrayList<>();
try {
for(int i=0;i<10;i++) {
ZkClient zkClient = new ZkClient(CONNECTSTRING, 5000,
5000,
new SerializableSerializer());
UserCenter userCenter = new UserCenter();
userCenter.setId(i);
userCenter.setName("客户端:" + i); MasterSelector selector = new MasterSelector(userCenter,zkClient);
selectorLists.add(selector);
selector.start();//触发选举操作
TimeUnit.SECONDS.sleep(1);
}
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
for(MasterSelector selector:selectorLists){
selector.stop();
}
}
}
}
通过zookeeper进行master选举,就是利用zookeeper的节点特性,通过是否能够创建临时节点来判断是否选举成功,如果不能创建临时节点,则表明已有线程创建成功,那么创建成功的线程就为选举的master,当网络发生故障或其它问题导致该线程挂掉,那么zookeeper中的该临时节点也会删除,通过监听节点是否有过删除动作,重新选举新的master。
模拟使用zookeeper实现master选举的更多相关文章
- Zookeeper实现master选举
使用场景 有一个向外提供的服务,服务必须7*24小时提供服务,不能有单点故障.所以采用集群的方式,采用master.slave的结构.一台主机多台备机.主机向外提供服务,备机负责监听主 ...
- Zookeeper实现Master选举(哨兵机制)
master选举使用场景及结构 现在很多时候我们的服务需要7*24小时工作,假如一台机器挂了,我们希望能有其它机器顶替它继续工作.此类问题现在多采用master-salve模式,也就是常说的主从模式, ...
- (原)3.1 Zookeeper应用 - Master选举
本文为原创文章,转载请注明出处,谢谢 Master 选举 1.原理 服务器争抢创建标志为Master的临时节点 服务器监听标志为Master的临时节点,当监测到节点删除事件后展开新的一轮争抢 某个服务 ...
- zookeeper典型应用场景之一:master选举
对于zookeeper这种东西,仅仅知道怎么安装是远远不够的,至少要对其几个典型的应用场景进行了解,才能比较全面的知道zk究竟能干啥,怎么玩儿,以后的日子里才能知道这货如何能为我所用.于是,有了如下的 ...
- Zookeeper系列五:Master选举、ZK高级特性:基本模型
一.Master选举 1. master选举原理: 有多个master,每次只能有一个master负责主要的工作,其他的master作为备份,同时对负责工作的master进行监听,一旦负责工作的mas ...
- zookeeper【4】master选举
考虑7*24小时向外提供服务的系统,不能有单点故障,于是我们使用集群,采用的是Master+Slave.集群中有一台主机和多台备机,由主机向外提 供服务,备机监听主机状态,一旦主机宕机,备机必需迅速接 ...
- ZooKeeper 典型应用场景-Master选举
master选举 1.使用场景及结构 现在很多时候我们的服务需要7*24小时工作,假如一台机器挂了,我们希望能有其它机器顶替它继续工作.此类问题现在多采用master-salve模式,也就是常说的主从 ...
- 使用zookeeper实现分布式master选举(c 接口版本)
zookeeper,已经被很多人所熟知,主要应用场景有(数据订阅/发布 ,负载均衡, 命名服务, 分布式协调/通知,集群管理,Master选举,分布式锁,分布式队列). C接口的描述 主要参考 Ha ...
- ZooKeeper场景实践:(6)集群监控和Master选举
1. 集群机器监控 这通经常使用于那种对集群中机器状态,机器在线率有较高要求的场景,可以高速对集群中机器变化作出响应.这种场景中,往往有一个监控系统,实时检測集群机器是否存活. 利用ZooKeeper ...
随机推荐
- The connection to adb is down and a sever error has occured的解决
1. 打开任务管理器,关掉豌豆夹等手机助手 2. 打开命令行,切换到adb所在目录,如:C:\Users\Jubincn\Downloads\adt-bundle-windows-x86_64-201 ...
- leetcode479
public class Solution { public int LargestPalindrome(int n) { ) ; , n) - ; ; v > max / ; v--) { S ...
- [mpm_winnt:error] [pid 28120:tid 15980] (OS 10038)在一个非套接字上尝试了一个操作。 : AH00332: winnt_accept: getsockname error on listening socket, is IPv6 available?
解决办法一: 可能是安装了某些程序修改了Winsock,使用netsh winsock reset 命令修复Winsock重启计算机即可! 解决办法二: 在httpd.conf文件中添加 Win32D ...
- Android APP使用系统签名
Android M平台在写APP测试使用MediaRecoder通过AudioSource.VOICE_CALL来录制通话上下行音的时候,需要权限 <uses-permission androi ...
- 常见地图服务(WMS、WFS、WCS、TMS、WMTS
1.网络地图服务(WMS) 网络地图服务(WMS)利用具有地理空间位置信息的数据制作地图.其中将地图定义为地理数据可视的表现.能够根据用户的请求返回相应的地图(包括PNG,GIF,JPEG等栅格形式或 ...
- Codeforces 1107E (Vasya and Binary String) (记忆化,DP + DP)
题意:给你一个长度为n的01串,和一个数组a,你可以每次选择消除一段数字相同的01串,假设消除的长度为len,那么收益为a[len],问最大的收益是多少? 思路:前两天刚做了POJ 1390,和此题很 ...
- mongodb 降序
降序排序 db.mycol.find({},{,_id:}).sort({})// 1用于升序排列,而-1用于降序. 示例代码: var user = await Kitten.find({ type ...
- JS Number类型数字位数及IEEE754标准
JS的基础类型Number,遵循 IEEE 754 规范,采用双精度存储(double precision),占用 64 bit.如图 意义 1位用来表示符号位 11位用来表示指数 52位表示尾数 浮 ...
- 05 HTML字符串转换成jQuery对象、绑定数据到元素上
1 要求 将一段 HTML脚本 封装成一个字符串,将这个字符串转换成一个jQuery对象:然后将这个jQuery对象添加到指定的元素中去 2 步骤 定义字符串 var str = '<div i ...
- 面试题:struts 值栈 有用
一. 核心部分 1. [核心试题]完成当天课堂练习 2. [多选题] 阅读如下代码中,下列哪种方式可以在页面正确迭代获取集合中的数据 (ABC) public String add(){ ValueS ...