基于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持久化引擎讲解>

原文发布于微信公众号 - Spark学习技巧(bigdatatip)

原文发表时间:2017-08-21

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏linux驱动个人学习

设备树的interrupt

interrupts 一个计算机系统中大量设备都是通过中断请求CPU服务的,所以设备节点就需要在指定中断号。常用的属性; interrupt-controlle...

39040
来自专栏博岩Java大讲堂

Java日志体系(logback)

2.8K50
来自专栏流柯技术学院

TestNG官方文档中文版(4)-运行TestNG

4 - 运行TestNG TestNG可以以不同的方式调用:     * Command line     * ant     * Eclips...

13720
来自专栏主机笔记

centos安装ab工具给网站进行压力测试

在配置好网站服务器后,我们可以进行压力测试看一看实际环境中的效果怎么样,判断服务器质量、网站程序设计是否合理、提前预防突发事件。今天就介绍一款开源免费的压力测试...

295100
来自专栏gaoqin31

XDebug分析php代码性能

XDebug是一个开放源代码的PHP程序调试器(即一个Debug工具),可以用来跟踪,调试和分析PHP程序的运行状况。是一个C语言扩展包(Windows下扩展名...

42030
来自专栏电光石火

motan之异步调用

13740
来自专栏Golang语言社区

Go语言_并发篇

当被问到为什么用Go语言,一定不得不提的是Go语言的并发程序编写。在C语言中编写非常繁琐复杂的并发程序在Go语言中总是显得如此便捷。 Go中并发程序依靠的是两个...

29240
来自专栏偏前端工程师的驿站

Java魔法堂:打包知识点之jar

一、前言                                    通过eclipse导出jar包十分方便快捷,但作为码农岂能满足GUI的便捷呢?所...

24670
来自专栏orientlu

python 配置文件读写

将代码中的配置项抽取到配置文件中,修改配置时不需要涉及到代码修改,避免面对一堆令人抓狂的 magic number,极大的方便后期软件的维护。

58930
来自专栏Golang语言社区

Go语言_并发篇

当被问到为什么用Go语言,一定不得不提的是Go语言的并发程序编写。在C语言中编写非常繁琐复杂的并发程序在Go语言中总是显得如此便捷。 Go中并发程序依靠的是两个...

34570

扫码关注云+社区

领取腾讯云代金券