【zookeeper核心源码解析】第二课:俯瞰QuorumPeer启动核心流程,实现选举关键流程

devtools/2024/12/26 16:57:52/

系列文章目录

zookeeper核心源码解析】第一课:zk启动类核心流程序列图
zookeeper核心源码解析】第二课:俯瞰QuorumPeer启动核心流程,实现选举关键流程
zookeeper核心源码解析】第三课:leader与follower何时开始同步,如何同步数据
zookeeper核心源码解析】第四课:客户端与服务端读写的io核心流程

zookeeper核心源码解析】第二课:俯瞰QuorumPeer启动核心流程,实现选举关键流程

  • 系列文章目录
  • 1. QuorumPeer.run() 核心流程执行流程进行选举(选举过程与结果)
  • 2. run方法解释


1. QuorumPeer.run() 核心流程执行流程进行选举(选举过程与结果)

 @Overridepublic void run() {setName("QuorumPeer" + "[myid=" + getId() + "]" +cnxnFactory.getLocalAddress());LOG.debug("Starting quorum peer");try {jmxQuorumBean = new QuorumBean(this);MBeanRegistry.getInstance().register(jmxQuorumBean, null);for(QuorumServer s: getView().values()){ZKMBeanInfo p;if (getId() == s.id) {p = jmxLocalPeerBean = new LocalPeerBean(this);try {MBeanRegistry.getInstance().register(p, jmxQuorumBean);} catch (Exception e) {LOG.warn("Failed to register with JMX", e);jmxLocalPeerBean = null;}} else {p = new RemotePeerBean(s);try {MBeanRegistry.getInstance().register(p, jmxQuorumBean);} catch (Exception e) {LOG.warn("Failed to register with JMX", e);}}}} catch (Exception e) {LOG.warn("Failed to register with JMX", e);jmxQuorumBean = null;}try {/** Main loop*/while (running) {switch (getPeerState()) {case LOOKING:LOG.info("LOOKING");if (Boolean.getBoolean("readonlymode.enabled")) {LOG.info("Attempting to start ReadOnlyZooKeeperServer");// Create read-only server but don't start it immediatelyfinal ReadOnlyZooKeeperServer roZk = new ReadOnlyZooKeeperServer(logFactory, this,new ZooKeeperServer.BasicDataTreeBuilder(),this.zkDb);// Instead of starting roZk immediately, wait some grace// period before we decide we're partitioned.//// Thread is used here because otherwise it would require// changes in each of election strategy classes which is// unnecessary code coupling.Thread roZkMgr = new Thread() {public void run() {try {// lower-bound grace period to 2 secssleep(Math.max(2000, tickTime));if (ServerState.LOOKING.equals(getPeerState())) {roZk.startup();}} catch (InterruptedException e) {LOG.info("Interrupted while attempting to start ReadOnlyZooKeeperServer, not started");} catch (Exception e) {LOG.error("FAILED to start ReadOnlyZooKeeperServer", e);}}};try {roZkMgr.start();setCurrentVote(makeLEStrategy().lookForLeader());} catch (Exception e) {LOG.warn("Unexpected exception",e);setPeerState(ServerState.LOOKING);} finally {// If the thread is in the the grace period, interrupt// to come out of waiting.roZkMgr.interrupt();roZk.shutdown();}} else {try {setCurrentVote(makeLEStrategy().lookForLeader());} catch (Exception e) {LOG.warn("Unexpected exception", e);setPeerState(ServerState.LOOKING);}}break;case OBSERVING:try {LOG.info("OBSERVING");setObserver(makeObserver(logFactory));observer.observeLeader();} catch (Exception e) {LOG.warn("Unexpected exception",e );                        } finally {observer.shutdown();setObserver(null);setPeerState(ServerState.LOOKING);}break;case FOLLOWING:try {LOG.info("FOLLOWING");setFollower(makeFollower(logFactory));follower.followLeader();} catch (Exception e) {LOG.warn("Unexpected exception",e);} finally {follower.shutdown();setFollower(null);setPeerState(ServerState.LOOKING);}break;case LEADING:LOG.info("LEADING");try {setLeader(makeLeader(logFactory));leader.lead();setLeader(null);} catch (Exception e) {LOG.warn("Unexpected exception",e);} finally {if (leader != null) {leader.shutdown("Forcing shutdown");setLeader(null);}setPeerState(ServerState.LOOKING);}break;}}} finally {LOG.warn("QuorumPeer main thread exited");try {MBeanRegistry.getInstance().unregisterAll();} catch (Exception e) {LOG.warn("Failed to unregister with JMX", e);}jmxQuorumBean = null;jmxLocalPeerBean = null;}}

2. run方法解释

1.选举状态有四种,一种是LOOKING,FOLLOWING,LEADING,OBSERVING
2. 一开始是Looking状态,进行选举,选举结束后,才决定leader和follower,分别创建leader和follower对象,并执行leader.lead(), follower.followLeader() 的方式,这时,完成leader和follower进程启动


http://www.ppmy.cn/devtools/145574.html

相关文章

机器学习之scikit-learn(简称 sklearn)

scikit-learn(简称 sklearn)是 Python 生态中一个非常流行且强大的机器学习库,支持各种机器学习算法和工具。 核心模块和功能 监督学习 (Supervised Learning): 分类 (Classification): 支持的算法:KNN、SVM、决策树、…

科技赋能医疗挂号:SSM 医院预约挂号系统的 Vue 卓越设计与达成

3系统分析 3.1可行性分析 通过对本医院预约挂号系统实行的目的初步调查和分析,提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本医院预约挂号系统采用SSM框架,JAVA作为开发语…

【Tomcat运行startup.bat闪退】

Tomcat运行startup.bat闪退 问题描述寻找报错原因修正注意 问题描述 双击startup.bat文件闪退! 寻找报错原因 首先查看tomcat日志,发现logs文件是空的。 然后我们在当前文件夹打开cmd或者powershell,通过文件指令运行一下启动指令。 PS D…

从Condition开始,回顾AQS

Synchronized和Reentrantlock的挂起逻辑 synchronized中有两个核心的结构 EntryList cxq:等待拿锁的线程存储位置Waitset:被执行wait方法的线程存储位置 流转: 线程获取锁资源失败,扔到EntryList cxq线程持有锁资源&#x…

网络管理-期末项目(附源码)

环境:网络管理 主机资源监控系统项目搭建 (保姆级教程 建议点赞 收藏)_搭建网络版信息管理系统-CSDN博客 效果图 下面3个文件的项目目录(python3.8.8的虚拟环境) D:\py_siqintu\myproject5\Scripts\mytest.py D:\py_siqintu\myproject5\Sc…

计算机网络习题( 第3章 物理层 第4章 数据链路层 )

第3章 物理层 一、单选题 1、下列选项中,不属于物理层接口规范定义范畴的是( )。 A、 接口形状 B、 引脚功能 C、 传输媒体 D、 信号电平 正确答案: C 2、在物理层接口特性中,用于描述完成每种功能的事件发…

Unity3D Huatuo技术原理剖析详解

前言 在游戏开发领域,Unity3D凭借其强大的跨平台能力和丰富的功能,成为了众多开发者的首选工具。而在Unity3D的生态系统中,Huatuo作为一款重要的插件,为游戏开发带来了极大的便利。本文将深入剖析Huatuo的技术原理,并…

修改npm镜像源

要更改 npm 的镜像源,你可以使用 npm config set registry 命令。以下是一些常见的镜像源: 1. **官方 npm 注册表**: bash npm config set registry https://registry.npmjs.org/ 2. **淘宝 npm 镜像**: bash npm conf…