zookeeper选主测试
Zookeeper 会维护一个具有层次关系的数据结构,它非常类似于一个标准的文件系统
zookeeper基于目录监听机制来选主,多个客户端节点都可以来对zookeeper上某个目录节点进行监听和注册,但只有其中一个能够注册上,谁能注册上谁就是主节点,主节点会保持着和zookeeper目录节点的长连接,只要该连接不断,那么该客户端节点就一直是主节点,其他客户端节点都会监听者zookeeper的该目录节点,一旦主节点宕机,会立即从其他客户端节点中选出一个新的主节点,也就是说:如果当前master宕机,会立即选出一个新的master。
zookeeper的使用:
1、pom引入相关依赖
<!-- zookeeper 客户端 -->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>2.13.0</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>2.13.0</version>
</dependency>
其中:Curator 提供了LeaderSelector用来判断是否主节点
2、创建测试类SelectMasterTest
package com.cookie; /**
* @author cxq
* @version 1.0
* @date 2020/7/10 17:35
* @desc
*/ import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.framework.recipes.leader.LeaderSelector;
import org.apache.curator.framework.recipes.leader.LeaderSelectorListenerAdapter;
import org.apache.curator.retry.ExponentialBackoffRetry; import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit; public class SelectMasterTest { private String selectMasterZookeeper="192.168.200.129:2181"; //可以放很多节点
Map<String, Boolean> masterMap = new HashMap<String, Boolean>(); /**
* 选主
* @param leaderPath zookeeper目录节点
*/
public void selectMaster (String leaderPath) {
CuratorFramework client = CuratorFrameworkFactory.builder().
connectString(selectMasterZookeeper)
.sessionTimeoutMs(5000) //超时时间
.retryPolicy(new ExponentialBackoffRetry(1000, 3)) //连接不上重试三次
.build();
client.start(); //争抢注册节点
@SuppressWarnings("resource")
LeaderSelector selector = new LeaderSelector(client, leaderPath,
new LeaderSelectorListenerAdapter() { @Override
public void takeLeadership(CuratorFramework client) throws Exception {
//如果争抢到当前注册节点
masterMap.put(leaderPath, true);
while (true) {
//抢占当前节点
TimeUnit.SECONDS.sleep(3);
}
}
});
masterMap.put(leaderPath, false);
selector.autoRequeue();
selector.start();
} public boolean checkMaster (String leaderPath) {
Boolean isMaster = masterMap.get(leaderPath);
return isMaster == null ? false : isMaster;
} public static void main(String[] args) throws InterruptedException {
String leaderPath = "/master";
SelectMasterTest selectMaster = new SelectMasterTest();
selectMaster.selectMaster(leaderPath); TimeUnit.SECONDS.sleep(1); while(true) {
if(selectMaster.checkMaster(leaderPath)){
System.out.println(" 节点1 主节点 ");
}else {
System.out.println(" 节点1 从节点 ");
}
TimeUnit.SECONDS.sleep(6);
}
}
}
3、测试
3.1、启动三次main方法模拟三个客户端节点,查看每个节点的输出情况,预计只有一个能够注册为主节点,其他两个是从节点。
3.2、停掉主节点,查看控制台看剩余两个节点是否有新的主节点产生。
主节点
从节点
断开主节点,其他节点争抢注册主节点
zookeeper选主测试的更多相关文章
- kazoo python zookeeper 选主
本文讲述基于zookeeper选主与故障切换的方法.我们的例子使用的是python. 使用的库是kazoo,安装方式 pip install kazoo 应用场景: 多个实例部署,但不是" ...
- zookeeper curator选主(Leader)
在分布式系统设计中,选主是一个常见的场景.选主是一个这样的过程,通过选主,主节点被选择出来控制其他节点或者是分配任务. 选主算法要满足的几个特征: 1)各个节点均衡的获得成为主节点的权利,一旦主节点被 ...
- 聊聊Zookeeper应用场景、架构设计、选主机制
Zookeeper作为一个分布式协调系统提供了一项基本服务:分布式锁服务,分布式锁是分布式协调技术实现的核心内容.像配置管理.任务分发.组服务.分布式消息队列.分布式通知/协调等,这些应用实际上都是基 ...
- Zookeeper笔记之使用zk实现集群选主
一.需求 在主从结构的集群中,我们假设硬件机器是很脆弱的,随时可能会宕机,当master挂掉之后需要从slave中选出一个节点作为新的master,使用zookeeper可以很简单的实现集群选主功能. ...
- 简述 zookeeper 基于 Zab 协议实现选主及事务提交
Zab 协议:zookeeper 基于 Paxos 协议的改进协议 zookeeper atomic broadcast 原子广播协议. zookeeper 基于 Zab 协议实现选主及事务提交. 一 ...
- kafka分区选主机制
Kafka Partition Leader选主机制 https://blog.csdn.net/qq_27384769/article/details/80115392 kafka leader选举 ...
- Etcd 使用场景:通过分布式锁思路实现自动选主
分布式锁?选主? 分布式锁可以保证当有多台实例同时竞争一把锁时,只有一个人会成功,其他的都是失败.诸如共享资源修改.幂等.频控等场景都可以通过分布式锁来实现. 还有一种场景,也可以通过分布式锁来实现, ...
- 10. 选主算法、多版本兼容性及滚动升级 | 深入浅出MGR
GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. 目录 1. 选主算法 2. 多版本兼容性 3. MGR 5.7滚动升级至8.0 4. 小结 参考资料.文档 免责声明 文章 ...
- ES选主策略
ES版本5.6.3 1.整个流程的开始,实在node启动后触发的,Node.java中start()方法,通过调用ZenDiscovery.java中的doStart()方法,之后会调用startIn ...
- Nginx + Keeplived双主测试
Author: JinDate: 20130613Title: Nginx + Keeplived 双主测试 前言:一年多前做过一次测试,时间久了忘记了,现在又重新做一次 一.环境1.基本信息和规划p ...
随机推荐
- 二叉树神级遍历算法:morris遍历算法
morris遍历的实质 建立一种机制,对于没有左子树的节点只到达一次,对于有左子树的节点会到达两次 morris遍历的实现原则 记作当前节点为cur. 如果cur无左孩子,cur向右移动(cur=cu ...
- MongoDB:文章评论系统模拟
- 使用SOUI4中的STreeView控件
STreeView控件是一个基于虚表技术实现的高性能树形控件. 和STreeCtrl这种传统的树形控件将数据和控件固定在一起不同,STreeView数据和控件分离,使用一个adapter进行连接. 用 ...
- rbd常用的配置参数
本文分享自天翼云开发者社区<rbd常用的配置参数>,作者:l****n rbd的基本介绍 rbd的架构如下图所示: rbd采用CRUSH算法实现数据的随机分布.CRUSH算法,即Contr ...
- 云电脑:IO虚拟化实现的技术分析
本文分享自天翼云开发者社区<云电脑:IO虚拟化实现的技术分析>,作者:大利 云电脑是一种基于云计算技术的虚拟化电脑,它通过网络将物理硬件资源虚拟化成多个虚拟机,每个虚拟机都拥有独立的操作系 ...
- mybatis之日志配置
1.在mybatis-config.xml中配置 <!-- 指定 MyBatis 所用日志的具体实现,未指定时将自动查找. SLF4J | LOG4J | LOG4J2 | JDK_LOGGIN ...
- FreeSql学习笔记——10.贪婪加载
前言 FreeSql贪婪加载主要对应导航属性,将需要的数据一次加载出来,包括查询表的子表或者关联表的关联数据,用于一对一.一对多.多对一.多对多的关系数据查询,查询的时候一对一.多对一关系查询是可 ...
- 探秘Transformer系列之(4)--- 编码器 & 解码器
探秘Transformer系列之(4)--- 编码器 & 解码器 0x00 摘要 对于机器翻译,Transformer完整的前向计算过程如下图所示(与总体架构那章的流程图相比较,此处重点突出了 ...
- 2分钟学会 DeepSeek API,竟然比官方更好用!
大家好,我是程序员鱼皮.最近 DeepSeek AI 太火了,效果也很强,但致命问题是 不稳定, 经常给我返回 服务器繁忙,请稍后再试,甚至让我怀疑自己被杀熟了. 也有网友说,第一次使用成功率很高,第 ...
- 图解MySQL【日志】——Binlog
Binlog(Binary Log,归档日志) 为什么需要 Binlog? Binlog 是 MySQL 中的二进制日志,用于记录数据库的所有写操作(INSERT.UPDATE.DELETE 等) 1 ...