基于zookeeper leader选举方式一
一,基本介绍
Curator Framework是一个针对zookeeper做的搞层次的API,极大地简化了zookeeper的使用。它基于zookeeper构建了很多功能,处理复杂的链接管理,重试操作。下面是它的一些特点:
1,自动连接管理。
A),存在的潜在错误情况,需要ZooKeeper客户端创建连接和/或重试操作。Curator 自动和透明(主要)处理这些情况。
B),监视NodeDataChanged事件,并根据需要调用updateServerList()。
C),Watches 会被Curator recipes自动移除。
2,简洁的API
A),提供现代简洁的接口
B),简化了zookeeper原生的方法,事件等。
3,实现了很多功能
A),Leader选举
B),共享锁
C),队列
D),Barriers
E),Counters
F),Caches
G),Nodes
本文主要是讲解leader选举。
现在分布式系统,基本架构模型架构是master/slaves,
二,leader选举
分布式系统中,一般都是master/slaves结构,为了容灾一般都是希望启动多个master,一个Leader,若干Followers,Leader宕机有Followers选举一个再做Leader。之所以,多个Master之间需要选举出Leader,实际上是为了保证数据的强一致性。
Zookeeper就是我们做Leader选举和配置下发的好的一种框架。
CuratorFramework
该类实例是线程安全的,一个应用程序最好公用一个。可以通过CuratorFrameworkFactory创建实例。
LeaderLatch
Leader选举的主要类,两个构造
public LeaderLatch(CuratorFramework client,
String latchPath)
Parameters:
client - the client
latchPath - the path for this leadership group
public LeaderLatch(CuratorFramework client,
String latchPath,
String id)
Parameters:
client - the client
latchPath - the path for this leadership group
id - participant ID
构建了LeaderLatch对象后,需要对象调用start方法启动,我们然后就可以通过使用
public boolean hasLeadership() Return true if leadership is currently held by this instance
来判断当前实例是否是Leader。
本文采取的Leader选举的方案是spark的Master HA采用的方案<Spark源码之Standalone模式下master持久化引擎讲解>。也即是实现LeaderLatchListener进而通过它来监听动作master变化。
1,maven依赖
<properties>
<curator.version>3.2.1</curator.version>
</properties>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>${curator.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.curator/curator-recipes -->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>${curator.version}</version>
<exclusions>
<exclusion>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
</exclusion>
</exclusions>
</dependency>
2,LeaderLatchListenerImpl
public class LeaderLatchListenerImpl implements LeaderLatchListener {
@Override
public void isLeader() {
// TODO Auto-generated method stub
System.out.println("master");
}
@Override
public void notLeader() {
// TODO Auto-generated method stub
System.out.println("slave");
}
}
3,LeaderLatchListener
public class LeaderLatchMain {
private static final String PATH = "/examples/leader";
public static void main(String[] args) throws Exception {
CuratorFramework client = CuratorFrameworkFactory.newClient("106.75.13.87:2181", new ExponentialBackoffRetry(1000, 3));
client.start();
LeaderLatch leaderLatch = new LeaderLatch(client, PATH,args[0]);
leaderLatch.addListener(new LeaderLatchListenerImpl());
try {
leaderLatch.start();
Thread.sleep(10000);
System.out.println(leaderLatch.getLeader());
Thread.sleep(Integer.MAX_VALUE);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
leaderLatch.close();
client.close();
}
}
}
三,总结
本demo中participant ID是启动的时候当参数传递进去。
启动指令:
java -jar LeaderLatchMain.jar 1
java -jar LeaderLatchMain.jar 2
第一次启动的时候leader
杀死Leader后
这种方式实际上就是spark Standalone模式下 HA,master进行leader选举采用的方式。具体请参考文章<Spark源码之Standalone模式下master持久化引擎讲解>
- mmc如何管理本机上的(数字/x.509)证书
- Jquery $.extend的重载方法详述
- Jquery ajax调用后台aspx后台文件方法(不是ashx)
- [原创]x.509证书在WCF中的应用(CS篇)
- tomcat
- 快速入门系列--WebAPI--01基础
- 分析程序员到底是不是吃青春饭
- Jquery dom搜索之siblings()方法
- 汽车黑科技!想想以后不是我们亲自驾驶汽车还是蛮开心的
- 快速入门系列--CLR--02多线程
- JavaScript之将JS代码放在什么位置最合适
- 快速入门系列--TSQL-01基础概念
- 初识javascript
- [原创]x.509证书在WCF中的应用(Web/IIS篇)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Mybatis高级查询(二):多表联合查询
- Maven配置多仓库无效?来看看这篇文章
- Spring Boot启动slf4j提示找不到weblogic.xml日志异常
- Angular 应用的DevDependencies
- 轻量级服务网格 - osm
- 漫画:设计模式之 “外观模式”
- 使用 Zotero 在 Markdown 中优雅处理参考文献
- Mybatis plus自动生成业务代码
- 功能强大的CD工具 - flagger
- Swift defer
- MySQL 最佳实践:CPU 100%,MySQL 到底在干什么
- 【译】Flutter 1.20 发布
- 算法面试题:一个List,要求删除里面的男生,不用Linq和Lamda,求各种解,并说明优缺点!
- Angular CLI创建的项目文件用途一栏
- [888]python内置函数vars()|dir()|locals()