C语言学习网

zk服务预启动和启动选举的过程

发表于:2022-11-27 作者:安全数据网编辑
编辑最后更新 2022年11月27日,这篇文章主要介绍"zk服务预启动和启动选举的过程",在日常操作中,相信很多人在zk服务预启动和启动选举的过程问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"zk服务预启动

这篇文章主要介绍"zk服务预启动和启动选举的过程",在日常操作中,相信很多人在zk服务预启动和启动选举的过程问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"zk服务预启动和启动选举的过程"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

QuorumPeerMain类public static void main(String[] args) {    QuorumPeerMain main = new QuorumPeerMain();    try {        main.initializeAndRun(args);    } catch (IllegalArgumentException e) {        LOG.error("Invalid arguments, exiting abnormally", e);        LOG.info(USAGE);        System.err.println(USAGE);        System.exit(ExitCode.INVALID_INVOCATION.getValue());    } catch (ConfigException e) {        LOG.error("Invalid config, exiting abnormally", e);        System.err.println("Invalid config, exiting abnormally");        System.exit(ExitCode.INVALID_INVOCATION.getValue());    } catch (DatadirException e) {        LOG.error("Unable to access datadir, exiting abnormally", e);        System.err.println("Unable to access datadir, exiting abnormally");        System.exit(ExitCode.UNABLE_TO_ACCESS_DATADIR.getValue());    } catch (AdminServerException e) {        LOG.error("Unable to start AdminServer, exiting abnormally", e);        System.err.println("Unable to start AdminServer, exiting abnormally");        System.exit(ExitCode.ERROR_STARTING_ADMIN_SERVER.getValue());    } catch (Exception e) {        LOG.error("Unexpected exception, exiting abnormally", e);        System.exit(ExitCode.UNEXPECTED_ERROR.getValue());    }    LOG.info("Exiting normally");    System.exit(ExitCode.EXECUTION_FINISHED.getValue());}

预启动

1.由QuorumPeerMain 启动

2 解析配置文件 集群情况下配置多个节点,启动清理DatadirCleanupManager

2.1创建zk数据管理器(FileTxnSnapLog)

3 判断是集群还是单机模式

4通过配置初始化quorumPeer,包括(ElectionType,zkdatabase,quorumVerifier,cnxnFactory,learnerType等)

是zk服务器实例的托管者,quorumPeer会不断检测当前服务器实例运行状态,同时发起leader选举

5创建内存database,zkdb管理所有会话记录,事务信息和dataTree数据

6初始化QuorumPeer实例,将FileTxnSnapLog,ServerCnxnFactory,ZkDatabase注册到QuorumPeer中,配置参数服务器列表,竞选时选举算法和超时时间等

7加载数据库loadDataBase()

8启动serverCnxn连接

7-8在QuorumPeer中

public synchronized void start() {    if (!getView().containsKey(myid)) {        throw new RuntimeException("My id " + myid + " not in the peer list");    }    //加载数据库    loadDataBase();    //启动服务连接工厂    startServerCnxnFactory();    try {        adminServer.start();    } catch (AdminServerException e) {        LOG.warn("Problem starting AdminServer", e);        System.out.println(e);    }    //开始选举    startLeaderElection();    startJvmPauseMonitor();    super.start();}

Leader选举

1初始化leader选举算法

2集群模式下,zookeeper首先会根据自身服务器id(sid),最新事务id(zxid)(lastLoggedZxid)

3和当前服务器epoch(currentEpoch)来创建选票

4在创建过程中,每个服务器都会给自己投票,然后,根据zoo.cfg配置,创建相应leader选举算法

zookeeper默认提供了三种算法(LeaderElection,AuthFastLeaderElection,FastLeaderElection),可以通过zoo.cfg的electionArg属性配置类型,

5但是现在默认支持的是FastLeaderElection选举算法

在初始化阶段 zk会创建选举需要的网络io管理器QuorumCnxnManager,同时监听选举指定端口,等待其他选举服务连接

到此,关于"zk服务预启动和启动选举的过程"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!

0