S1-Bootstrap模块


接下来开始Bootstrap模块的分析,目录如下,

1. Debug开启
2. Node启动

Debug开启

es的bootstrap如下, image

bootstrap模块

里面Elasticsearch.java上有main()方法,通过其来启动es集群。而main()方法的调用是通过elasticsearch.sh这个脚本里面的java -cp

image

es集群的启动脚本

image

elasticsearch.sh

其中start是第一个手输入参;$@是脚本的所有参数汇总;<&-是输入重定向;&是设置为后台进程。

image

main入口

由此进入Elasticsearch的main(),初始化Bootstrap,之前的start在这里是一个识别的作用,是start还是version;在初始化bootstrap过程中,需要初始化env,如果在Windows本机下逐步debug,需要设置path.home或者set env

image

environment

至此,可以通过main function来在Windows系统下进行debug。

image

9200_snapshot

image

console

console显示的cluster.namenode.name是在elasticsearch.yml配置,建议自定义,不然es分配的默认值不利于辨识。另外,出现了一个异常,后续会讲到。

Type Default Custom
cluster.name elasticsearch your custom
node.name random hero name your custom

Node启动

es集群的启动,通过Elasticsearch.main -> bootstrap.init即可,中间会涉及es绝大部分模块(plugin,setting,cluster,transport等)的初始化和相关功能服务(mapping,index,search,routing等)的注入。其主要步骤如下,

  1. CLIParser,检测CLI命令行环境
  2. instance = new Bootstrap,新建一个bootstrap实例(实例由node,keepAlive组成)
  3. prepare Environment,构建es env
    • initialSettings,settings是environment的一个属性
  4. instance.setup,根据environment配置bootstrap实例的node属性
    • node -> nodeBuilder.build = new Node
    • node constructor
      • threadpool
      • modules.add,根据environment将各具体module类加入到ModulesBuilder中,然后使其产生injector
      • pluginService
      • injector
      • client

image

bootstrap instance的node初始化构造

  1. instance.start,启动bootstrap实例
    • node.start
      • injector.getInstance.start,通过DI的方式将node的具体功能function挂靠在该node的injector上
    • keepAliveThread.start

image

injector注入

至此,es集群搭建起来了。搭建过程中所涉及的modulesfunction将在之后展开;另外es通过暴露client的方式将其一系列的功能开放出去。

image

client接口