社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Elasticsearch

elasticsearch源码深入分析——启动过程

飞来来 • 7 年前 • 531 次点击  

本篇为elasticsearch源码分析系列文章的第二篇,由于技术不精,而叙述的不好或不对的地方还请大家指出 ^ _ ^!!!

源码主要模块

distribution:elasticsearch的打包发行相关,将elasticsearch打成各种发行包(zip,deb,rpm,tar)的模块。具体用法如是,在相应的发行版本模块下执行publishToMavenLocal这个Task,如果执行成功的话就会在路径build/distributions下生成对应的发行包,这种打好的包就能在生产服务器上运行。如下图所示:

通过distribution模块打包发行版本.png

core:核心包,elasticsearch的源码主要在这个里面

buildSrc:elasticsearch的构建相关的代码

client:作为连接elasticsearch的客户端相关代码,接口如下图:

client

modules:作为elasticsearch除核心外的必备模块相关代码,结构如下图:

modules

plugins:作为elasticsearch必备的插件的相关代码,结构如下图:

plugins

启动入口

在上面提到的distribution模块中的src/main/resources/bin路径下能看到elasticsearch的启动脚本。如下图所示:

elasticsearch启动脚本

脚本先载入了jvm配置文件jvm.options(在我们下载解约的发行包的config文件夹中)

ES_JVM_OPTIONS="$ES_PATH_CONF"/jvm.options

然后载入我们在Run/Debug Configurations中配置的VM参数。

-Des.path.conf=D:\seymour\elasticsearch\elasticsearch-6.0.0-rc2
-Des.path.home=D:\seymour\elasticsearch\elasticsearch-6.0.0-rc2
-Dlog4j2.disable.jmx=true

最后启动org.elasticsearch.bootstrap.Elasticsearch这个主类中的main方法。

main方法首先添加了关闭钩子,

关闭钩子

然后配置日志输出器,

日志输出器

然后检查了elasticsearch的三个环境参数:

    putSystemPropertyIfSettingIsMissing(settings, "path.data", "es.path.data");
    putSystemPropertyIfSettingIsMissing(settings, "path.home", "es.path.home");
    putSystemPropertyIfSettingIsMissing(settings, "path.logs", "es.path.logs");

所有的检查做完后,代码流转到了*org.elasticsearch.bootstrap.Bootstrap *类的init()方法,而正是Bootstrap类完成了elasticsearch的启动

Bootstrap.init(!daemonize, pidFile, quiet, initialEnv);

Bootstrap类

下面我们来看一下Bootstrap中的几个重要方法:

init
init(final boolean foreground,final Path pidFile,final boolean quiet,final Environment initialEnv) throws BootstrapException, NodeValidationException, UserException

这个方法不用说也知道是做了一些启动前的初始化工作

参数详解

  • foreground:标识elasticsearch是否是作为后台守护进程启动的,
  • pidFile:通过parser解析args后得到,实际是解析了默认命令行参数(verbose,E,silent,version,help,quiet,daemonize,pidfile)
  • quiet:同上
  • initialEnv:Environment实例化的环境参数对象,保存了一些类似于repoFile,configFile,pluginsFile,binFile,libFile等参数。

主要工作

  • 首先会实例化一个Bootstrap对象
  • 配置log输出器
  • 创建pid文件,会在磁盘上持久化一个记录应用pid的文件
  • 通过参数foreground和quiet来控制日志输出
  • 调用Bootstrap的setup方法和start方法
setup
setup(boolean addShutdownHook, Environment environment)throws BootstrapException 

主要工作

  • 通过environment生成本地插件控制器

  • 初始化本地资源

  • 在安全管理器安装之前初始化探针

  • 添加关闭钩子

  • 检查jar重复

  • 在安全管理器安装之前配置日志输出器

  • 安装安全管理器

  • 通过参数environment实例化Node

start
start() throws NodeValidationException 

主要工作

  • 启动已经实例化的Node
  • 启动keepAliveThread 线程,这个线程在Bootstrap初始化的时候就已经实例化了,该线程创建了一个计数为1的CountDownLatch,目的是在启动完成后能顺利添加关闭钩子,而这句:

意思就是在jvm中增加一个关闭的钩子,当jvm关闭的时候,会执行系统中已经设置的所有通过方法addShutdownHook添加的钩子,当系统执行完这些钩子后,jvm才会关闭。所以这些钩子可以在jvm关闭的时候进行内存清理、对象销毁等操作。

可以看到启动的重点在setup方法中,启动过后就是Node的事了。

Node类

Node是通过NodeBuilder来实例化的,使用google的注入框架Guice的Injector进行注入与获取实例。elasticsearch里面的组件都是用上面的方法进行模块化管理,elasticsearch对guice进行了封装,通过ModulesBuilder类构建elasticsearch的模块:

Node的启动就是Node里每个组件的启动,同样的,分别调用不同的的start方法来启动这个组件,如下

至此elasticsearch就启动完成了,后面我会继续讲解elasticsearch细节内容,请大家多多支持 ^ _ ^ !!!


今天看啥 - 高品质阅读平台
本文地址:http://www.jintiankansha.me/t/4wzkiaDcUx
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/4539
 
531 次点击