启动的代码的入口在Elasticsearch.java中的main()
(暂时先忽略安全相关的部分)
1. 注册ErrorListener,用于在启动失败的时候报错
2. 启动ES命令行客户端EnvironmentAwareCommand和对应用来输入输入Terminal
//和命令行还有环境相关的操作
3. 创建一个Setting(HashMap),放入一些ES配置(path.conf path.data …),根据setting创建一个环境变量(包含所有的配置,给命令行使用的)
一些配置文件的路径之类…蛮重要的
4. 命令行相关初始化完成之后,最后到跳转到Bootstrap中进行其他操作(init(daemonize, pidFile, quiet, env))
-------------------------------跳转到Bootstrap类中执行方法------------------------------------------------------
INSTANCE = new Bootstrap();
在new Bootstrap时初始化一个keepAlived线程,内部的countDownLatch用于心跳(在之后启动) -- 这个的作用是为了保证节点运行期间bootstrap会一直存在,可以接受关闭的命令从而退出
接着做了一些检查:
例如SSL加密/CustomConfFile/创建PID文件/Lucene版本/
----------------Node节点相关!!!---------------------
//初始化一些相关的配置和进行检查
1. 根据Pid和是否守护进程等信息和之前是setting,创建运行时环境environment和pid文件
2. 检查所需要的Lucene jar包(checkLucene())
3. 根据之前的environment,为每个plugin创建本地插件控制器: spawner
4. 初始化本地资源(主要是native方法进行一些OS调用和JVM信息,比如mlock/系统最大资源数之类的…)
5. 初始化两种probes(探测),将提供给ES start时所需要的一些进程信息和OS层面的信息
6. 检查重复的jar包,并打印在日志中(JarHell.checkJarHell())
//初始化Node(本地节点)
1. 配置一个检查非回路IP的检测
2. 初始化nodeId和nodeName
在new NodeEnvironment初始化这个node相关信息
3. 初始化ES各个功能模块的Service和module,并将service和module绑定
----------------------核心: 真正启动Node和keepalived线程-------------------------
//启动各个module INSTANCE.start();
Node的启动实际上是node中各个模块的启动,通过guice获取各个module的service接口并启动
内部包括了master选举等机制,需要后续文章慢慢分析!