源码分析,最关键的是要找到一个入口,对于zk的leader选举,并不是由客户端来触发,而是在启动的时候会触发一次选举。因此我们可以直接去看启动脚本zkServer.sh中的运行命令
ZOOMAIN就是QuorumPeerMain。那么我们基于这个入口来看
QuorumPeerMain.main方法
main方法中,调用了initializeAndRun进行初始化并且运行
protected void initializeAndRun(String[] args) throws ConfigException, IOException{
//这段代码比较简单,设置配置参数,如果args不为空,可以基于外部的配置路径来进行解析
QuorumPeerConfig config = new QuorumPeerConfig();
if (args.length == 1) {
config.parse(args[0]);
}
// 这里启动了一个线程,来定时对日志进行清理,从命名来看也很容易理解
DatadirCleanupManager purgeMgr = new DatadirCleanupManager(config.getDataDir(), config.getDataLogDir(), config.getSnapRetainCount(), config.getPurgeInterval());
purgeMgr.start();
// 如果是集群模式,会调用runFromConfig.servers实际就是我们在zoo.cfg里面配置的集群节点
if (args.length == 1 && config.servers.size() > 0) {
runFromConfig(config);
} else {//否则直接运行单机模式
LOG.warn("Either no config or no
quorum defined in config, running "+ " in standalone mode");
// there is only server in the quorum -- run as standalone
ZooKeeperServerMain.main(args);
}
}