1 Node的启动流程
节点的启动整体流程如下所示:
2 启动过程分析
启动入口: 通过启动脚本bin/elasticsearch启动ES,在distribution模块中的/src/bin目录下面,脚本先载入了jvm配置文件jvm.options。最后启动org.elasticsearch.bootstrap.Elasticsearch这个主类中的main方法。
exec \ #执行命令
"$JAVA" \ #Java程序路径
$ES_JAVA_OPTS \ #JVM选项
-Des.path.home="$ES_HOME" \ #设置path.home路径
-Des.path.conf="$ES_PATH_CONF" \ #设置path.conf路径
-Des.distribution.flavor="$ES_DISTRIBUTION_FLAVOR" \
-Des.distribution.type="$ES_DISTRIBUTION_TYPE" \
-cp "$ES_CLASSPATH" \ #设置java classpath
org.elasticsearch.bootstrap.Elasticsearch \ #指定main函数所在类
"$@" #传递给main函数命令行参数
main方法中首先添加了shutdown Hook,以便在close的时候清理关闭资源:
在JVM里面添加关闭的shutdown Hook,当jvm关闭的时候,会执行系统中已经设置的所有通过方法addShutdownHook添加的shutdown Hook,当系统执行完这些shutdown Hook后,jvm才会关闭。
所以这些shutdown Hook可以在jvm关闭的时候进行内存清理、对象销毁等操作。
Runtime.getRuntime().addShutdownHook(shutdownHookThread);
然后检查了ES的3个环境参数:
putSystemPropertyIfSettingIsMissing(settings, "path.data", "es.path.data");
putSystemPropertyIfSettingIsMissing(settings, "path.home", "es.path.home");
putSystemPropertyIfSettingIsMissing(settings, "path.logs", "es.path.logs");
所有的检查做完后,代码进入到Bootstrap#init方法,Bootstrap类完成了elasticsearch的启动。
- 先初始化一个Bootstrap实例;
- 加载安全配置;
- 配置log输出器;
- 创建pid文件,会在磁盘上持久化一个记录应用pid的文件;
- 调用Bootstrap的setup方法和start方法
setup方法主要:初始化环境配置,添加关闭shutdown Hook,检查jar包冲突,配置日志输出器,通过environment初始化Node实例。
start方法主要:启动已经实例化的Node,启动keepAliveThread 线程。
private void start() throws NodeValidationException {
node.start();
keepAliveThread