专栏首页Spark学习技巧基于zookeeper leader选举方式一

基于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),作者:浪尖

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

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

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Curator实现基于zookeeper leader选举

    Curator Framework是一个针对zookeeper做的搞层次的API,极大地简化了zookeeper的使用。它基于zookeeper构建了很多功能,...

    Spark学习技巧
  • Kafka源码系列之源码分析zookeeper在kafka的作用

    浪尖的kafka源码系列以kafka0.8.2.2源码为例给大家进行讲解的。纯属个人爱好,希望大家对不足之处批评指正。 一,zookeeper在分布式集群的作...

    Spark学习技巧
  • Kafka源码系列之源码分析zookeeper在kafka的作用

    Spark学习技巧
  • 从0.5到1写个rpc框架 - 2:远程服务调用(grpc)

    gRPC是Google开源的跨语言远程服务调用(RPC)框架,通信协议用的HTTP/2,数据传输默认用的protocol buffers(一种轻便高效的结构化数...

    acupt
  • Java知识点——NIO和BIO

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jvUiQgVM-1584882587306)(img/NIO图例.png)]

    用户7073689
  • Python处理cassandra 升级

    前几天开发把分布式存储服务器cassandra 升级了,担心升级不成功,所以写了一个升级回滚失败的脚本

    py3study
  • Jmeter(七)_if控制器+循环控制器+计数器控制接口分支

    最近查阅了一下网上关于if控制器的文章,大同小异,几乎找不到原创,于是决定自己写一篇

    飞天小子
  • 自定义注解与常用设计模式

    注解分为:内置注解,自定义注解。内置注解就是JDK 自带的,而自定义注解则是自己定义的比如许多框架(spring) 用到的

    斯文的程序
  • 聊聊skywalking的HTTPAccessLog

    skywalking-6.6.0/oap-server/server-core/src/main/java/org/apache/skywalking/oap/...

    codecraft
  • 安全的移除ES节点

    想要安全的移除一个es节点,不改变分片的数量,100%不会引起数据丢失,即保证这个节点的所有数据被其他节点接收。然后停止这个节点的实例。

    HLee

扫码关注云+社区

领取腾讯云代金券