`

Zookeeper 源码分析-启动

 
阅读更多

   本文主要介绍了zookeeper启动的过程

 

   运行zkServer.sh start命令可以启动zookeeper。入口的main函数在类中QuorumPeerMain。

   main函数主要调用了runFromConfig函数,创建了QuorumPeer对象,并且调用了start函数,从而启动了zookeeper。

public class QuorumPeerMain {
     protected QuorumPeer quorumPeer;

    /**
     * To start the replicated server specify the configuration file name on
     * the command line.
     * @param args path to the configfile
     */
    public static void main(String[] args) {
        QuorumPeerMain main = new QuorumPeerMain();
        main.initializeAndRun(args);
    }

    protected void initializeAndRun(String[] args)
        throws ConfigException, IOException
    {
        runFromConfig(config);
    }
    
    public void runFromConfig(QuorumPeerConfig config) throws IOException {
      LOG.info("Starting quorum peer");
      try {
          NIOServerCnxn.Factory cnxnFactory =
              new NIOServerCnxn.Factory(config.getClientPortAddress(),
                      config.getMaxClientCnxns());
  
          quorumPeer = new QuorumPeer();
          quorumPeer.setClientPortAddress(config.getClientPortAddress());
          quorumPeer.setTxnFactory(new FileTxnSnapLog(
                      new File(config.getDataLogDir()),
                      new File(config.getDataDir())));
          quorumPeer.setQuorumPeers(config.getServers());
          quorumPeer.setElectionType(config.getElectionAlg());
          quorumPeer.setMyid(config.getServerId());
          quorumPeer.setTickTime(config.getTickTime());
          quorumPeer.setMinSessionTimeout(config.getMinSessionTimeout());
          quorumPeer.setMaxSessionTimeout(config.getMaxSessionTimeout());
          quorumPeer.setInitLimit(config.getInitLimit());
          quorumPeer.setSyncLimit(config.getSyncLimit());
          quorumPeer.setQuorumVerifier(config.getQuorumVerifier());
          quorumPeer.setCnxnFactory(cnxnFactory);
          quorumPeer.setZKDatabase(new ZKDatabase(quorumPeer.getTxnFactory()));
          quorumPeer.setLearnerType(config.getPeerType());
  
          quorumPeer.start();
          quorumPeer.join();
      } catch (InterruptedException e) {
          // warn, but generally this is ok
          LOG.warn("Quorum Peer interrupted", e);
      }
    }
}

    在QuorumPeer的start函数中,先调用了loadDataBase方法用于恢复数据。启动与client交互的线程,并

    @Override
    public synchronized void start() {
        try {
            zkDb.loadDataBase();
        } catch(IOException ie) {
            LOG.fatal("Unable to load database on disk", ie);
            throw new RuntimeException("Unable to run quorum server ", ie);
        }
        cnxnFactory.start(); //用于处理与client的交互        
        startLeaderElection();//开始选举算法
        super.start();
    }

 

    调用loadDatabase从磁盘加载数据到内存

    public long loadDataBase() throws IOException {
        PlayBackListener listener=new PlayBackListener(){
            public void onTxnLoaded(TxnHeader hdr,Record txn){
                Request r = new Request(null, 0, hdr.getCxid(),hdr.getType(),
                        null, null);
                r.txn = txn;
                r.hdr = hdr;
                r.zxid = hdr.getZxid();
                addCommittedProposal(r);
            }
        };
        
        long zxid = snapLog.restore(dataTree,sessionsWithTimeouts,listener);
        initialized = true;
        return zxid;
    }

    调用QuorumPeer的run函数,按照peer的state做不同的处理

 @Override
    public void run() {
        setName("QuorumPeer:" + cnxnFactory.getLocalAddress());

        try {
            /*
             * Main loop
             */
            while (running) {
                switch (getPeerState()) {
                case LOOKING:
                    try {
                        LOG.info("LOOKING");
                        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;
                }
            }
        }  
    }

 

    

分享到:
评论

相关推荐

    apache-zookeeper-3.5.8-bin.zip

    在"apache-zookeeper-3.5.8-bin.zip"这个压缩包中,包含了Apache ZooKeeper 3.5.8版本的源码、编译后的二进制文件以及相关的配置和脚本。 1. **Zookeeper 的核心概念** - **节点(ZNode)**: ZooKeeper 数据模型由...

    zookeeper源码分析

    第2章 ZooKeeper之序列化组件源码解析【透视现象,直击本质】 第4章 持久化【高手过招必备】 第6章 服务器启动 【由浅入深,先学好单机版,才能掌握集群版】 第7章 会话管理 【无处不在的会话其实没那么难】 第8章 ...

    zookeeper3.6.0-linux版本

    ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,它是集群的管理者,监视着集群中各个节点的状态根据节点提交的反馈进行下一步合理操作。最终将简单易用的接口和性能高效、功能稳定的系统提供给用户。...

    zookeeper 可视化工具 直接运行jar 即可

    Zookeeper 是一个分布式的,开放源码的分布式应用程序协调服务,它是集群的管理者,监视着集群中各个节点的状态根据节点提交的反馈进行下一步合理操作。最终将简单易用的接口和性能高效、功能稳定的系统提供给用户。...

    linux-ZooKeeper管理工具

    1. 安装与启动:在Linux上安装ZooKeeper通常通过下载源码编译或者使用包管理器(如apt-get或yum)进行。安装完成后,可以通过`zookeeper-server-start.sh`脚本启动服务,使用`zookeeper-server-stop.sh`停止服务。 ...

    dubbo源码分析-2(注册表AbstractRegistry设计技巧讲解)

    本文将深入分析"Dubbo源码分析-2(注册表AbstractRegistry设计技巧讲解)"这一主题,探讨`AbstractRegistry`的设计理念和实现细节。 `AbstractRegistry`是Dubbo中的抽象注册表类,它是所有具体注册表实现(如...

    zookeeper-3.4.0下载

    ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,它是集群的管理者,监视着集群中各个节点的状态根据节点提交的反馈进行下一步合理操作。最终将简单易用的接口和性能高效、功能稳定的系统提供给用户。...

    Zookeeper源码剖析:深入理解Leader选举机制

    **Zookeeper源码剖析:深入理解Leader选举机制** 在分布式协调服务Zookeeper中,Leader选举是其核心功能之一,确保了服务的高可用性和一致性。本文将深入Zookeeper的源码,探讨Leader选举的实现机制。 **为什么要...

    ZooKeeper-:ZooKeeper源码剖析

    ZooKeeper源码分析 优秀时间学习了一下ZooKeeper:分布式过程协调这本书的内容,对ZooKeeper实现的细节很好奇,所以顺便把ZooKeeper源码看了一遍。看完之后想写点内容做个笔记,确实发现不好开始。由于ZooKeeper一个...

    第四课:zookeeper ZAB协议实现源码分析1

    在本课程中,我们将深入探讨Zookeeper的ZAB协议实现,并通过源码分析来理解其启动流程、快照与事务日志的存储结构。Zookeeper是一款分布式协调服务,广泛应用于分布式系统中,如Hadoop、HBase等。本节主要关注...

    java8集合源码分析-hsweb-iot-cloud:hsweb-物联网云

    集合源码分析 开源物联网管理平台 目的 提供一个开源的物联网管理平台,支持各种设备接入,并完成数据上报,分析,处理等自定义功能. 技术栈 java8,maven3 : 整合各种组件 : 对微服务提供支持 : 基础业务框架 : 物联网...

    zookeeper-3.4.6 eclipse

    7. 测试与调试:在Eclipse中,你可以设置断点,启动调试模式,进行单步调试和数据查看,以便更好地理解和分析Zookeeper的工作原理。 通过以上步骤,你已经在Eclipse中成功地集成并配置了Zookeeper 3.4.6。这不仅...

    源码阅读之storm操作zookeeper-cluster.clj

    这篇文章主要聚焦于storm在Clojure语言环境下如何通过cluster.clj文件与Zookeeper集群进行交互,提供了对相关源码的初步分析。 首先,我们要知道Zookeeper在storm中的角色。Zookeeper是一个分布式协调服务,它在...

    zookeeper-3.4.5

    Zookeeper-3.4.5是该项目的一个稳定版本,提供了丰富的功能和优化,对于想要深入理解Zookeeper源码的开发者来说,这是一个值得研究的版本。 Zookeeper的核心设计理念是“简单、快速、正确”,它采用类文件系统的...

    dubbo+zookeeper案例,dubbo和Zookeeper详解,Java源码.zip

    《Dubbo与Zookeeper深度解析:Java源码实践》 在现代分布式系统中,服务治理是不可或缺的一部分。Dubbo和Zookeeper作为两个重要的组件,...通过分析源码,你可以掌握服务治理的核心思想,提升解决分布式问题的能力。

    C# 关于zookeeper主从选举的源码

    5. **源码分析**: - 分析源码时,重点关注类的设计,如`ZookeeperNode`、`ZookeeperLeader`和`ZookeeperFollower`,它们分别代表Zookeeper的节点、领导者和跟随者。 - 查看节点间如何交换信息(如使用TCP套接字...

    shell脚本一键安装zookeeper3.4.5

    - 进入Zookeeper源码目录,执行`./configure`进行预编译配置。 - 使用`make`和`make install`命令编译源码并将其安装到系统默认位置(通常为`/usr/local/zookeeper`)。 5. **环境变量设置**: - 需要在系统的`...

    zookeeper第四节课原理源码分析资料1

    总的来说,Zookeeper的源码分析涵盖了从服务启动、配置解析、日志清理、集群通信到故障恢复等多个层面,深入了解这些原理对于优化和维护Zookeeper集群至关重要。通过本节课的学习,我们可以更好地理解Zookeeper如何...

    zookeeper安装包.zip

    Apache ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,它是集群的管理者,监视着集群中各个节点的状态根据节点提交的反馈进行下一步合理操作。最终将简单易用的接口和性能高效、功能稳定的系统提供给...

Global site tag (gtag.js) - Google Analytics