ZooKeeper源码学习笔记(2)--Standalone模式下的ZooKeeper

本文深入探讨ZooKeeper Standalone模式的启动逻辑,包括Server入口、启动流程和数据结构。讲解了ServerSocket、Watcher实现,以及数据的三层缓存层:outstandingChanges、ZKDatabase和Disk files。此外,还介绍了RequestProcessor任务链的工作原理。
摘要由CSDN通过智能技术生成

Server入口

Server的启动代码位于 zkServer.sh 文件中。

zkServer 指令和Java入口类的对应关系

zkServer.sh脚本同 /etc/init.d/ 中的启动脚本比较类似,都是通过shell的case命令解析指令执行。具体指令如下:
1. start: 通过nohup后台启动org.apache.zookeeper.server.quorum.QuorumPeerMain
2. start-foreground: 前台运行org.apache.zookeeper.server.quorum.QuorumPeerMain
3. stop: 杀死通过start启动的进程
4. restart: 先后调用stopstart,起到重启的作用
5. status: 通过org.apache.zookeeper.client.FourLetterWordMain查看运行情况
6. upgrade: 通过org.apache.zookeeper.server.upgrade.UpgradeMain 进行线上更新
7. print-cmd: 输出启动start的命令

启动逻辑

zkServer.sh中看到,ZooKeeper Server的入口类是QuorumPeerMain

判断启动模式

在入口函数中,根据在 zoo.cfg 文件中配置的server个数,决定启动Standalone(单机)模式或是Cluster(集群)模式

如果在 zoo.cfg 文件中没有配置 server 则默认作为 Standalone 模式启动,并将启动参数传递给 ZooKeeperServerMain::main ,否则作为 Cluster 模式进行启动。

在本节中,暂时不考虑Cluster模式,只关心 Standalone 模式下的 Server 运行逻辑。

Standalone 模式的启动流程

如上所言,在Standalone模式下,QuorumPeerMain会将启动参数传递给ZooKeeperServerMain::main

ZooKeeperServerMain::main里,ZooKeeper在解析完成config文件后,调用runFromConfig初始化Server。

public void runFromConfig(ServerConfig config) throws IOException {
    final ZooKeeperServer zkServer = new ZooKeeperServer();
    // Registers shutdown handler which will be used to know the
    // server error or shutdown state changes.
    final CountDownLatch shutdownLatch = new CountDownLatch(1);
    zkServer.registerServerShutdownHandler( new ZooKeeperServerShutdownHandler(shutdownLatch));
    cnxnFactory = ServerCnxnFactory.createFactory();
    cnxnFactory.configure(config.getClientPortAddress(),
                    config.getMaxClientCnxns());
    cnxnFactory.startup(zkServer);
    shutdownLatch.await();
    shutdown();

    cnxnFactory.join();
    if (zkServer.canShutdown()) {
        zkServer.shutdown();
    }
}

cnxnFactory.startup

走读源码发现,cnxnFactory.startup方法中启动了三个线程,分别是NIOServerCnxnFactory(Runnable启动), PrepRequestProcessor , SyncRequestProcessor

线程启动完毕后,进入shutdownLatch.await()的等待状态, 阻塞主线程,避免程序退出。

退出逻辑在<

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值