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. android事件传递机制以及onInterceptTouchEvent()和onTouchEvent()总结

    老实说,这两个小东东实在是太麻烦了,很不好懂,我自己那api文档都头晕,在网上找到很多资料,才知道是怎么回事,这里总结一下,记住这个原则就会很清楚了: 1.onInterceptTouchEvent( ...

  2. MySQL install and setting

    Tomorrow is the deadline of DATABASE, I am very nervous because of my project. Today is first day th ...

  3. 转载.Avalon-MM 阿窝龙妹妹应用笔记

    Avalon Interface Special http://www.altera.com.cn/literature/manual/mnl_avalon_spec.pdf Avalon总线是SOP ...

  4. rabbitmq java

    package com.enniu.rabbitmq; import com.rabbitmq.client.AMQP; import com.rabbitmq.client.AMQP.BasicPr ...

  5. fn project 运行时配置选项

    Env Variables Description Default values DB_URL The database URL to use in URL format. SeeDatabases  ...

  6. 【转】Python自动化测试 (一) Eclipse+Pydev 搭建开发环境

    原文网址:http://www.cnblogs.com/TankXiao/archive/2013/05/29/3033640.html C#之所以容易让人感兴趣,是因为安装完Visual Studi ...

  7. erlang的tcp服务器模板

    改来改去,最后放github了,贴的也累,蛋疼 还有一个tcp批量客户端的,也一起了 大概思路是 混合模式 使用erlang:send_after添加recv的超时处理 send在socket的opt ...

  8. laravel中有条件使用where

    在项目开发的过程中;有时候会有多个参数 去用在where查询中;那么这里的where语句是可能有也可能没有的 1.用原生的mysql语句来实现 private function getData($ty ...

  9. Mvn+Jetty启动项目

    这里要注意,Mvn加jetty启动项目,主要用到的是Maven的jetty插件,和你下的Jetty服务器没什么关系. 我的运行环境是jdk1.7,Eclipse-mars,Maven是Eclipse自 ...

  10. Oracle存储过程使用总结

    1.使用Oracle存储过程查询结果集: 网上写的都是他妈的扯淡!其实一句话就行了,你只要返回一个游标就OK了.具体代码如下: CREATE OR REPLACE PROCEDURE PR_ORDER ...