【Elasticsearch 5.6.12 源码】——【2】启动过程分析(上)
版权声明:本文为博主原创,转载请注明出处!
简介
本文主要解决以下问题:
1、启动ES的入口类及入口方法是哪个?
2、分析梳理ES服务启动的主要流程?
入口类
ES的入口类为org.elasticsearch.bootstrap.Elasticsearch
,启动方法为:
public static void main(final String[] args) throws Exception
该类通过继承EnvironmentAwareCommand类增加了CLI的支持,类图:
启动流程
Step 1、给JVM安装(临时的)安全管理器,并注册错误日志监听器。
ES在程序启动的第一步先给JVM安装了一个安全管理器,并授予了程序所有的权限(临时的,后续会更换新的安全管理器),以方便以后的操作。接下来会注册一个错误日志的监听器,来监听是否有错误发生,随后使用配置文件配置日志组件是会检查监听器是否检测到错误,如果有将通过抛异常的方式中止ES的启动过程。执行该动作的方法:
// org.elasticsearch.bootstrap.Elasticsearch public static void main(final String[] args) throws Exception
Step 2、创建一个Elasticsearch类的实例(一个CLI的Command实例),并执行实例的main方法。
Elasticsearch类直接继承了EnvironmentAwareCommand,可以认为这一步创建了一个CLI的command对象。在该类的构造方法以及父类中定义了该
command
对象可以接受的cli的参数。执行该动作的方法:
// org.elasticsearch.bootstrap.Elasticsearch public static void main(final String[] args) throws Exception
在
bin
目录下运行Elasticsearch -h
命令,可以查看该实例支持的所有命令行参数:
Step 3、添加JVM关闭的构造,使用默认配置配置日志组件。
为JVM添加了一个shutdown的钩子函数,在钩子函数中调用了close()方法。使用系统属性
es.logger.level
的值来配置日志组件,如果没有该配置则使用默认的INFO
级别来配置logger.level
。执行该动作的方法:
// org.elasticsearch.cli.Command public final int main(String[] args, Terminal terminal) throws Exception
Step 4、解析help
、silent
、verbose
或normal
的参数配置,并输出或设置到Terminal
上。
首先检查控制台是否传入了
-h
或--help
参数,如果有的话打印帮助信息,并结束ES的启动过程。否则,依次检查-s
、-v
等参数,并根据相应的参数配置terminal
的信息输出方式。执行该动作的方法:
// org.elasticsearch.cli.Command void mainWithoutErrorHandling(String[] args, Terminal terminal) throws Exception
Step 5、解析通过控制台传入的ES的配置参数,并根据配置参数创建Environment对象。
首先,解析通过控制台
-E
参数传入的ES配置。其次,通过System Property
补齐某些确实的配置。这两个过程都会对配置的key进行查重。解析配置的代码:
// org.elasticsearch.cli.EnvironmentAwareCommand protected void execute(Terminal terminal, OptionSet options) throws Exception { final Map<String, String> settings = new HashMap<>(); for (final KeyValuePair kvp : settingOption.values(options)) { if (kvp.value.isEmpty()) { throw new UserException(ExitCodes.USAGE, "setting [" + kvp.key + "] must not be empty"); } if (settings.containsKey(kvp.key)) { final String message = String.format( Locale.ROOT, "setting [%s] already set, saw [%s] and [%s]", kvp.key, settings.get(kvp.key), kvp.value); throw new UserException(ExitCodes.USAGE, message); } settings.put(kvp.key, kvp.value); } putSystemPropertyIfSettingIsMissing(settings, "default.path.conf", "es.default.path.conf"); putSystemPropertyIfSettingIsMissing(settings, "default.path.data", "es.default.path.data"); putSystemPropertyIfSettingIsMissing(settings, "default.path.logs", "es.default.path.logs"); putSystemPropertyIfSettingIsMissing(settings, "path.conf", "es.path.conf"); putSystemPropertyIfSettingIsMissing(settings, "path.data", "es.path.data"); putSystemPropertyIfSettingIsMissing(settings, "path.home", "es.path.home"); putSystemPropertyIfSettingIsMissing(settings, "path.logs", "es.path.logs"); execute(terminal, options, createEnv(terminal, settings)); }
接下来,根据解析到的配置项来创建Environment对象。
// org.elasticsearch.cli.EnvironmentAwareCommand protected Environment createEnv(Terminal terminal, Map<String, String> settings) { return InternalSettingsPreparer.prepareEnvironment(Settings.EMPTY, terminal, settings); }
最终,通过InternalSettingsPreparer对象的prepareEnironment方法来创建Enironment对象。
// org.elasticsearch.node.InternalSettingsPreparer public static Environment prepareEnvironment(Settings input, Terminal terminal, Map<String, String> properties)
该方法会合并控制台传入的配置项、部分通过系统环境变量设置的配置项及
elasticsearch.yml
设置的配置项。最终创建一个Environment对象,该对象中保存了ES程序的配置目录、数据目录、插件目录及日志目录的地址。
Step 6、解析控制台传入的-v
、-d
、-p
及-q
等参数,并依据相应的参数初始化Bootstrap
。
首先,检查是否传入了
-v
参数,如果有该参数则打印ES的版本信息并退出。接下来解析-d
、-p
及-q
参数,并依据这些参数调用Bootstrap.init
。执行该动作的方法:
// org.elasticsearch.bootstrap.Elasticsearch protected void execute(Terminal terminal, OptionSet options, Environment env) throws UserException void init(final boolean daemonize, final Path pidFile, final boolean quiet, Environment initialEnv)
Step 7、通过调用BootstrapInfo.init()
方法的方式来初始化BootstrapInfo
对象。
通过这个对象可以获取
JNA
是否可用、系统Memory Lock
是否可用等一些系统信息。执行该动作的方法:
// org.elasticsearch.bootstrap.Bootstrap static void init(final boolean foreground, final Path pidFile, final boolean quiet, final Environment initialEnv) throws BootstrapException, NodeValidationException, UserException
Step 8、创建一个Bootstrap
实例,加载Secure Settings
,并结合原有的配置重新创建Environment
对象。
在
Bootstrap
实例中首先启动了一个keep alive
线程。结合SecureSettings
重新创建Environment
对象。依据env
中的配置文件配置日志组件,这时会检查是否有错误日志产生。接下来输出一些配置相关的日志,并按需创建pidFile
。执行该动作的方法:
// org.elasticsearch.bootstrap.Bootstrap static void init(final boolean foreground, final Path pidFile, final boolean quiet, final Environment initialEnv) throws BootstrapException, NodeValidationException, UserException
Step 9、检查Lucene
的版本,设置 默认的未捕获异常的处理器 ,并开始配置新建的Bootstrap
实例。
首先,根据是否守护经常运行的方式按需关闭
SysOut
。接下来检查Lucene
库的版本是否匹配。最后,设置DefaultUncaughtExceptionHandler
。执行该动作的方法:
// org.elasticsearch.bootstrap.Bootstrap static void init(final boolean foreground, final Path pidFile, final boolean quiet, final Environment initialEnv) throws BootstrapException, NodeValidationException, UserException
Step 10、设置NativePluginControllers
,初始化native
资源,初始化资源“探针”,checkJarHell
,再次设置系统安全管理器并新建Node
对象。
在这些过程中间还会检查老配置项
bootstrap.seccomp
和新配置项bootstrap.system_call_filter
都配置了的情况下是否产生了冲突。执行该动作的方法:
// org.elasticsearch.bootstrap.Bootstrap private void setup(boolean addShutdownHook, Environment environment) throws BootstrapException
Step 11、关闭SecureSettings
的存储文件,并调用Bootstrap
对象的start
方法,按需closeSysError
。
这是启动流程的最后一步。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Spark中的资源调度
Spark中涉及的资源调度可以分为4层: YARN对不同SparkApplication(SparkContext)的调度 同一个SparkAppliction内不同资源池(pool)之间的调度 同一个SparkAppliction内同一个资源池(pool)内不同TaskSetManager的调度 同一个SparkAppliction内同一个资源池(pool)内同一个TaskSetManager内的Task调度 前置 为啥需要资源调度 当用户提交作业,Spark内部的执行流程如下图: Spark上层的SQL/Streaming等最终都会生成RDD到底层SparkCore执行。如上图所示当RDD执行一个action类型的算子(如collect)会触发一个Job的提交到DAGScheduler,DAGScheduler会将Job拆成Stage(根据s
- 下一篇
elasticsearch 核心的http api
开篇 作为一个elasticsearch的新手,我觉得elasticsearch的官网的文档归类清楚,作为新手很有必要多阅读几次,每次都能加深印象。这里作为个人理解进行一些简单的归类便于查阅。 对于新手而言,熟悉各类能够掌握简单的操作包括:索引的创建删除查询,文档的增删改查、集群信息查询等。 Indices APIs:负责索引Index的创建(create)、删除(delete)、获取(get)、索引存在(exist)等操作。 Document APIs:负责索引文档的创建(index)、删除(delete)、获取(get)等操作。 Search APIs:负责索引文档的search(查询),Document APIS根据doc_id进行查询,Search APIs]根据条件查询。 Aggregations:负责针对索引的文档各维度的聚合(Aggregation)。 cat APIs:负责查询索引相关的各类信息查询。 Cluster APIs:负责集群相关的各类信息查询。 提供一个操作的方法,就是本机搭建个es集群然后部署一个kibana,通过kibana熟悉http api就可...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
-
Docker使用Oracle官方镜像安装(12C,18C,19C)
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8编译安装MySQL8.0.19
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
推荐阅读
最新文章
- CentOS6,CentOS7官方镜像安装Oracle11G
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- 设置Eclipse缩进为4个空格,增强代码规范
- Mario游戏-低调大师作品
- MySQL8.0.19开启GTID主从同步CentOS8
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- CentOS8编译安装MySQL8.0.19
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池