百度收录哪些网站吗,成品网站1688入门网,企业网站用个人备案,驻马店建设局网站系列文章目录
【zookeeper核心源码解析】第一课#xff1a;zk启动类核心流程序列图 【zookeeper核心源码解析】第二课#xff1a;俯瞰QuorumPeer启动核心流程#xff0c;实现选举关键流程 【zookeeper核心源码解析】第三课#xff1a;leader与follower何时开始同步#…系列文章目录
【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 dont 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 were 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.选举状态有四种一种是LOOKINGFOLLOWINGLEADINGOBSERVING 2. 一开始是Looking状态进行选举选举结束后才决定leader和follower,分别创建leader和follower对象并执行leader.lead() follower.followLeader() 的方式这时完成leader和follower进程启动