First call *setup(ElectionContext) to ensure the election process is in it'd.

 
 Next calljoinElection(ElectionContext) to start the leader election. 
 
The implementation follows the classic ZooKeeper recipe of creating an ephemeral, sequential node for each candidate and then looking at the set of such nodes -
 
 if the created node is the lowest sequential node, the candidate that created the node is the leader. 
 
If not, the candidate puts a watch on the next lowest node it finds, and if that node goes down, starts the whole process over by checking if it's the lowest sequential node, etc.
 
 
org.apache.solr.cloud.LeaderElector实现选举leader的逻辑。
 
首先调用setup方法保证选举初始化,主要是保证写在zookeeper上的信息节点存在。
  
[java]  
/** 
  * Set up any ZooKeeper nodes needed for leader election. 
  */  
 public void setup(final ElectionContext context) throws InterruptedException,  
     KeeperException {  
   String electZKPath = context.electionPath + LeaderElector.ELECTION_NODE;  
    
   zkCmdExecutor.ensureExists(electZKPath, zkClient);  
 }  
  
 
加入选举队列实现
每个shard进入集群后,会在zookeeper上注册一个序列号类似,n_0000000001 or n_0000000003
应该是以active的状态记录,每次进入选举的队列里,都会先取得新的序列号,先进序列号越小,这个序列号对于选举leader很重要,每次选举leader会从最小的序列号做为leader,初次创建的时候,就会作为首选 的leader。
至于每次有leader发生故障的时候,看检查自己是不是最小的那个序列号,如果是,则可以做一下leader的初始化工作,如果不是,至以当前第二小的做为新的leader看齐。
挂掉的leader的shard再成功起来的时候,照道理应该是改为最大的序列号,变为followe者。
加入选举队列实现主要代码 :(返回选举后的leader序列号)
 [java]  
public int joinElection(ElectionContext context) throws KeeperException, InterruptedException, IOException {  
    final String shardsElectZkPath = context.electionPath + LeaderElector.ELECTION_NODE;  
      
    long sessionId = zkClient.getSolrZooKeeper().getSessionId();  
    String id = sessionId + "-" + context.id;  
    String leaderSeqPath = null;  
    boolean cont = true;  
    int tries = 0;  
    while (cont) {  
      try {  
      //取出shard片对应的leader seq信息。  
        leaderSeqPath = zkClient.create(shardsElectZkPath + "/" + id + "-n_", null,  
            CreateMode.EPHEMERAL_SEQUENTIAL, false);  
        context.leaderSeqPath = leaderSeqPath;  
        cont = false;  
      } catch (ConnectionLossException e) {  
        // we don't know if we made our node or not...  
        List<String> entries = zkClient.getChildren(shardsElectZkPath, null, true);  
        //检查自己是否在这个选 举的队列里  
        boolean foundId = false;  
        for (String entry : entries) {  
          String nodeId = getNodeId(entry);  
          if (id.equals(nodeId)) {  
            // we did create our node...  
            foundId  = true;  
            break;  
          }  
        }  
        //没找到则跳出微循环,如果重试已超过20次则抛出异常  
        if (!foundId) {  
  
          cont = true;  
          if (tries++ > 20) {  
            throw new ZooKeeperException(SolrException.ErrorCode.SERVER_ERROR,  
                "", e);  
          }  
          try {  
            Thread.sleep(50);  
          } catch (InterruptedException e2) {  
            Thread.currentThread().interrupt();  
          }  
        }  
  
      } catch (KeeperException.NoNodeException e) {  
        // we must have failed in creating the election node - someone else must  
        // be working on it, lets try again  
        if (tries++ > 20) {  
          throw new ZooKeeperException(SolrException.ErrorCode.SERVER_ERROR,  
              "", e);  
        }  
        cont = true;  
        try {  
          Thread.sleep(50);  
        } catch (InterruptedException e2) {  
          Thread.currentThread().interrupt();  
        }  
      }  
    }  
    //得到leader的seq,并检查自己是不是leader  
    int seq = getSeq(leaderSeqPath);  
    checkIfIamLeader(seq, context, false);  
      
    return seq;  
  }  
 

solrCloud选举leader的逻辑分析的更多相关文章

  1. Raft协议实战之Redis Sentinel的选举Leader源码解析

    这可能是我看过的写的最详细的关于redis 选举的文章了, 原文链接 Raft协议是用来解决分布式系统一致性问题的协议,在很长一段时间,Paxos被认为是解决分布式系统一致性的代名词.但是Paxos难 ...

  2. kafka备份机制——zk选举leader,leader在broker里负责备份

    Kafka架构 如上图所示,一个典型的kafka集群中包含若干producer(可以是web前端产生的page view,或者是服务器日志,系统CPU.memory等),若干broker(Kafka支 ...

  3. zookeeper 选举leader详解

    一.前言 前面学习了Zookeeper服务端的相关细节,其中对于集群启动而言,很重要的一部分就是Leader选举,接着就开始深入学习Leader选举. 二.Leader选举 2.1 Leader选举概 ...

  4. 【分布式】Zookeeper的Leader选举

    一.前言 前面学习了Zookeeper服务端的相关细节,其中对于集群启动而言,很重要的一部分就是Leader选举,接着就开始深入学习Leader选举. 二.Leader选举 2.1 Leader选举概 ...

  5. Ceph剖析:Leader选举

    作者:吴香伟 发表于 2014/09/11 版权声明:可以任意转载,转载时务必以超链接形式标明文章原始出处和作者信息以及版权声明 Paxos算法存在活锁问题.从节点中选出Leader,然后将所有对数据 ...

  6. 第四章 Leader选举算法分析

    Leader选举 学习leader选举算法,主要是从选举概述,算法分析与源码分析(后续章节写)三个方面进行. Leader选举概述 服务器启动时期的Leader选举 选举的隐式条件便是ZooKeepe ...

  7. 基于库zkclient 的leader选举代码实现

    利用了zookeeper临时节点,在当连接或session断掉时被删除这一特性来做选举.(简单简单互斥锁) 查了下网上的做法. 大致流程: <1>判定是否存在/wzgtest路径 < ...

  8. zookeeper leader选举算法源码

    服务器状态 在QuorumPeer中有定义,这个类是一个线程. LOOKING:寻找Leader状态.处于该状态时,它会认为当前集群中没有Leader,进入选举流程. FOLLOWING: LEADI ...

  9. kafka知识体系-kafka设计和原理分析-kafka leader选举

    kafka leader选举 一条消息只有被ISR中的所有follower都从leader复制过去才会被认为已提交.这样就避免了部分数据被写进了leader,还没来得及被任何follower复制就宕机 ...

随机推荐

  1. [Git]Git指南一 查看创建删除标签

    1. 查看标签 列出现有标签,使用如下命令: xiaosi@yoona:~/code/learningnotes$ git tag r-000000-000000-cm.cm v1.0.0 v1.0. ...

  2. html调bug

    F12-->Sources-->相应文件-->找有波浪线

  3. better1【模式】Module模式

    var myModule = (function($, _) { var privateVariable = "Hello World" var pulicProperty = & ...

  4. element resetFields 方法报错

    resetFields  对整个表单进行重置,将所有字段值重置为初始值并移除校验结果:如果用了之后报错如下: 查了下资料,是DOM加载的顺序问题: 解决方法: this.$nextTick(() =& ...

  5. el表达式的坑

    为了写作业,又用回去了jstl,有几个坑重复坑了 1,导入包 <dependency> <groupId>javax.servlet</groupId> <a ...

  6. mybatis+druid+springboot 注解方式配置多个数据源

    1\数据库配置 #test数据源 spring.datasource.test.url=jdbc:mysql:///db?useUnicode= spring.datasource.test.user ...

  7. CString 中的SpanIncluding 和SpanExcluding 用法

    SpanIncluding 简单的理解就是提取包含在指定串中的一个子串 MSDN上的备注说:从左边的第一个字符开始查找与给定串相等的字符,如果没有则返回空的串,反之,继续查找,到结束. 例子方便理解 ...

  8. GOF23设计模式之建造者模式(builder)

    一.建造者模式概述 建造者模式的本质: 1.分离了对象子组件的单独构造(由Builder负责)和装配(由Director负责).从而可以构造出复杂的对象.这个模式适用于:某个对象的过程复杂的情况下使用 ...

  9. 【转】Jmeter和LR上传文件和下载

    背景: 在某个申请业务中,需要上传附件文件,然后才能提交该申请 遇到的问题: 1,  在使用Jmeter或者LR进行录制时,无法录制到上传文件的请求,只能通过Fiddler能查看到该请求 2,  因为 ...

  10. java图形化界面-------鼠标监听画圆----------使用匿名类

    package com.aa; import java.awt.Color; import java.awt.Graphics; import java.awt.event.MouseAdapter; ...