Leader Shard的选举原理主要是依靠LeaderElector.java类来实现的。

函数checkIfIamLeader开始真正的leader选举,根据和Zookeeper上创建的znode的nodeName对比,判断自己是否是leader。

  1. 如果是leader,好了,更新的活以后该你去干了,执行注册leader的一系列更新操作。
  2. 如果不是leader,而是replica的话,则在leader的znode上注册watcher,关注leader znode的状态。
  3. 一旦发现leader znode消失,则会触发下一次的leader选举过程。
  /*** Check if the candidate with the given n_* sequence number is the leader.* If it is, set the leaderId on the leader zk node. If it is not, start* watching the candidate that is in line before this one - if it goes down, check* if this candidate is the leader again.** @param replacement has someone else been the leader already?*/private void checkIfIamLeader(final ElectionContext context, boolean replacement) throws KeeperException,InterruptedException, IOException {context.checkIfIamLeaderFired();// get all other numbers...final String holdElectionPath = context.electionPath + ELECTION_NODE;List<String> seqs = zkClient.getChildren(holdElectionPath, null, true);sortSeqs(seqs);String leaderSeqNodeName = context.leaderSeqPath.substring(context.leaderSeqPath.lastIndexOf('/') + 1);if (!seqs.contains(leaderSeqNodeName)) {log.warn("Our node is no longer in line to be leader");return;}// If any double-registrations exist for me, remove all but this latest one!// TODO: can we even get into this state?String prefix = zkClient.getSolrZooKeeper().getSessionId() + "-" + context.id + "-";Iterator<String> it = seqs.iterator();while (it.hasNext()) {String elec = it.next();if (!elec.equals(leaderSeqNodeName) && elec.startsWith(prefix)) {try {String toDelete = holdElectionPath + "/" + elec;log.warn("Deleting duplicate registration: {}", toDelete);zkClient.delete(toDelete, -1, true);} catch (KeeperException.NoNodeException e) {// ignore}it.remove();}}if (leaderSeqNodeName.equals(seqs.get(0))) {// I am the leadertry {runIamLeaderProcess(context, replacement);} catch (KeeperException.NodeExistsException e) {log.error("node exists",e);retryElection(context, false);return;}} else {// I am not the leader - watch the node below meString toWatch = seqs.get(0);for (String node : seqs) {if (leaderSeqNodeName.equals(node)) {break;}toWatch = node;}try {String watchedNode = holdElectionPath + "/" + toWatch;zkClient.getData(watchedNode, watcher = new ElectionWatcher(context.leaderSeqPath, watchedNode, getSeq(context.leaderSeqPath), context), null, true);log.debug("Watching path {} to know if I could be the leader", watchedNode);} catch (KeeperException.SessionExpiredException e) {throw e;} catch (KeeperException.NoNodeException e) {// the previous node disappeared, check if we are the leader againcheckIfIamLeader(context, true);} catch (KeeperException e) {// we couldn't set our watch for some other reason, retrylog.warn("Failed setting watch", e);checkIfIamLeader(context, true);}}}

Leader重新选举

  1. 正常运行的SolrCloud已产生一个leader(Znode编号最小,比如XXX_node1_0000001),后续的Replica后在leader节点上注册Watcher。当Leader下线时候,即短连接断开,那么Zookeeper上的Znode(比如XXX_node1_0000001)就会被删除。
  2. 此时,所有Replica在Leader节点上的watcher就会监控到这一变化,所有的Replica就会进行leader选举,选举的原则依然是判断自己是不是目前注册在/collections/collectionTest/leader_select/shard1/election下的Znode编号最小的那位,是的话就是Leader,否则就是Replica。
  3. 如果判断自己是Replica,就会继续在leader的Znode上(这个时候的leader是XXX_node1_0000002)注册watcher,等待leader下线再次触发选举leader。
  4. 如果这个时候原先下线的leader上线了会怎么样,它就会被当做新的一个Solr节点注册到Zookeeper上,并获取一个比现有Znode更大的编号,在Leader Znode节点上注册watcher,等待它的选举机会。

这篇文章讲得很好,但它base的版本是比较老的Solr 4.x了。

Reference
http://quentinxxz.iteye.com/blog/2149891
https://www.cnblogs.com/rcfeng/p/4082568.html
https://www.cnblogs.com/saratearing/p/5690476.html
https://blog.csdn.net/u011026968/article/details/50336709
https://blog.csdn.net/iteye_16982/article/details/82574099

Zookeeper简介
https://www.cnblogs.com/xinfang520/p/7717684.html

SolrCloud Recovery原理及无法选举分片Leader
https://www.sohu.com/a/130752460_505885

【Solr原理】Leader Shard选举相关推荐

  1. Apache ZooKeeper - 集群中 Follow 的作用_非事务请求的处理与 Leader 的选举分析

    文章目录 Pre 非事务性请求处理过程 源码分析 选举过程 在这里插入图片描述 Leader 失效发现 Leader 重新选举 Follow 角色变更 集群同步数据 源码解析 小结 Pre 在 Zoo ...

  2. Solr原理?为什么要用Solr?Solr为什么比较快?

    什么是Solr? Solr是一个用java开发的基于lucene引擎的 全文搜索 平台,原理是倒排索引,从关键字到文档的过程,Solr的资源都是以Doc为对象进行存储的,每个文档都由一系列的field ...

  3. Redis集群运维与核心原理(哨兵选举、集群选举等)剖析

    1.Redis集群方案比较 哨兵模式 高可用集群模式 redis集群是一个由多个主从节点群组成的分布式服务器群,它具有复制.高可用和分片特性.Redis集群不需要 sentinel哨兵也能完成节点移除 ...

  4. elasticsearch的master选举

    1 Discovery Discovery模块负责发现集群中的节点.选择主节点. ES支持多种不同Discovery类型选择,内置的实现有两种:Zen Discovery和Coordinator 7. ...

  5. 【Elasticsearch选主流程】

    Discovery模块负责发现集群中的节点,以及选择主节点.ES支持多种不同的Discovery选择,内置的实现称为Zen Discovery,其封装了节点发现(ping).选主等实现过程.本文基于E ...

  6. Zookeeper——选举机制原理与Leader和Follower作用

    摘要 本博文主要介绍Zookeeper的选举机制的原理与Zookeeper事务请求处理的原理. 一.zookeeper选举算法原理 Leader 服务器的作用是管理 ZooKeeper 集群中的其他服 ...

  7. Kafka Partition Leader选举机制原理详解

    1 大数据常用的选主机制 Leader选举算法非常多,大数据领域常用的有以下两种: 1.1 Zab(zookeeper使用) Zab协议有四个阶段 Leader election Discovery ...

  8. solrCloud选举leader的逻辑分析

    solrCloud选举leader的逻辑分析 转贴请声明原文:http://blog.csdn.net/duck_genuine/article/details/8491901 First call ...

  9. zookeeper集群部署监控与选举同步流程等工作原理

    部署一个zookeeper集群,要多简单就能有多简单(下载压缩包,解压,修改配置文件zoo.cfg,执行启动脚本),但是想要真的把这套东西玩好了,还是需要费些功夫研究一番的.就跟自己搭建一个lnmp的 ...

  10. Zookeeper选举原理——FastLeaderElection

    转载自  Zookeeper选举原理 作为一个分布式应用程序协调服务,在大型网站中,其本身也是集群部署的,安装zookeeper的时候最好是单数节点,因为要选举.Zookeeper的leader节点是 ...

最新文章

  1. JSON WEB TOKEN(JWT)的分析
  2. centos nginx不是命令_虚拟机下Centos 8.0 安装PHP+Mysql+Nginx
  3. 使用mysql事件_MySQL事件的使用详解
  4. shell生成随机数+判断路径存不存在+判断文件夹有无内容
  5. 美国运营商Verizon宣布5月16日开始发售三星5G手机 售价1300美元起
  6. 使用wget抓取网站资源
  7. 【定位问题】基于matlab RSSI和模拟退火优化粒子群算法求解无线传感器网络定位问题【含Matlab源码 1766期】
  8. [谈现在的PSP与NDSi]
  9. Windows安装光盘启动优盘制作
  10. apk一键脱壳工具_海量破解、修改、无广告软件一键获取!一个工具就能轻松搞定!...
  11. icem合并面网格_ICEM CFD中合并多个网格
  12. 如何用文献管理软件Endnote X9插入参考文献
  13. Loadrunner_集合点(rendezvous)
  14. 电路定理——替代定理
  15. 生成13位条形码Ean-13码规则:第十三位数字是前十二位数字经过计算得到的校验码。
  16. ProcessingJoy —— 字母流光粒子【JAVA】
  17. 《公司的力量》纪录片
  18. linux替换变量字符串,linux shell 替换字符串的几种方法,变量替换${},sed,awk
  19. Android+6.0的全盘加密(,Android6.0强制全盘加密 隐私牺牲性能
  20. Symbian OS on E65应用开发手记(3)——SDK注册及14天学习总结

热门文章

  1. 暑假第一战——java+mysql 个人信息管理系统
  2. Zynq7000硬件开发之电源供电系统(PDN)设计(一)
  3. 如何使用记事本编译并运行Java源代码
  4. Oracle数据库的数据类型
  5. Oracle数据库的下载地址
  6. Java面试宝典(超级详细)
  7. win98万能显卡驱动_win98万能显卡驱动-万能显卡驱动精灵
  8. JAVA回合制pk游戏
  9. 虚化4独立游戏开发第一章:策划案
  10. 10+必备的 WORDPRESS 常用插件