四、ElasticSearch节点启动

节点启动流程

在debug源码之前先看一下ES启动的日志,日志中概括了ES节点的启动流程

[2020-05-12T21:28:28,560][INFO ][o.e.n.Node               ] [] initializing ...
[2020-05-12T21:28:29,488][INFO ][o.e.e.NodeEnvironment    ] [utTANpE] using [1] data paths, mounts [[/ (/dev/sda1)]], net usable_space [7gb], net total_space [27.4gb], types [ext4]
[2020-05-12T21:28:29,490][INFO ][o.e.e.NodeEnvironment    ] [utTANpE] heap size [981.5mb], compressed ordinary object pointers [true]
[2020-05-12T21:28:29,513][INFO ][o.e.n.Node               ] node name [utTANpE] derived from node ID [utTANpEYTuCZuJUTRC1MTA]; set [node.name] to override
[2020-05-12T21:28:29,515][INFO ][o.e.n.Node               ] version[6.1.2-SNAPSHOT], pid[42101], build[Unknown/Unknown], OS[Linux/5.3.0-46-generic/amd64], JVM[Oracle Corporation/Java HotSpot(TM) 64-Bit Server VM/1.8.0_191/25.191-b12]
[2020-05-12T21:28:29,517][INFO ][o.e.n.Node               ] JVM arguments [-Des.path.conf=/home/shwang/Documents/eshome/config, -Des.path.home=/home/shwang/Documents/eshome, -Djava.security.policy=/home/shwang/Documents/eshome/config/elasticsearch.policy, -Dlog4j2.disable.jmx=true, -agentlib:jdwp=transport=dt_socket,server=n,suspend=y,address=39783, -Xms1g, -Xmx1g, -Dfile.encoding=UTF-8, -Duser.country=US, -Duser.language=en, -Duser.variant]
[2020-05-12T21:28:29,519][WARN ][o.e.n.Node               ] version [6.1.2-SNAPSHOT] is a pre-release version of Elasticsearch and is not suitable for production
[2020-05-12T21:30:06,725][INFO ][o.e.p.PluginsService     ] [utTANpE] loaded module [aggs-matrix-stats]
[2020-05-12T21:30:06,726][INFO ][o.e.p.PluginsService     ] [utTANpE] loaded module [analysis-common]
[2020-05-12T21:30:06,727][INFO ][o.e.p.PluginsService     ] [utTANpE] loaded module [ingest-common]
[2020-05-12T21:30:06,729][INFO ][o.e.p.PluginsService     ] [utTANpE] loaded module [lang-expression]
[2020-05-12T21:30:06,730][INFO ][o.e.p.PluginsService     ] [utTANpE] loaded module [lang-mustache]
[2020-05-12T21:30:06,731][INFO ][o.e.p.PluginsService     ] [utTANpE] loaded module [lang-painless]
[2020-05-12T21:30:06,731][INFO ][o.e.p.PluginsService     ] [utTANpE] loaded module [mapper-extras]
[2020-05-12T21:30:06,732][INFO ][o.e.p.PluginsService     ] [utTANpE] loaded module [parent-join]
[2020-05-12T21:30:06,733][INFO ][o.e.p.PluginsService     ] [utTANpE] loaded module [percolator]
[2020-05-12T21:30:06,734][INFO ][o.e.p.PluginsService     ] [utTANpE] loaded module [reindex]
[2020-05-12T21:30:06,735][INFO ][o.e.p.PluginsService     ] [utTANpE] loaded module [repository-url]
[2020-05-12T21:30:06,736][INFO ][o.e.p.PluginsService     ] [utTANpE] loaded module [transport-netty4]
[2020-05-12T21:30:06,737][INFO ][o.e.p.PluginsService     ] [utTANpE] loaded module [tribe]
[2020-05-12T21:30:06,742][INFO ][o.e.p.PluginsService     ] [utTANpE] no plugins loaded
[2020-05-12T21:30:08,025][INFO ][i.n.u.i.PlatformDependent] Your platform does not provide complete low-level API for accessing direct buffers reliably. Unless explicitly requested, heap buffer will always be preferred to avoid potential system instability.
[2020-05-12T21:30:26,108][INFO ][o.e.d.DiscoveryModule    ] [utTANpE] using discovery type [zen]
[2020-05-12T21:30:34,491][INFO ][o.e.n.Node               ] initialized
[2020-05-12T21:30:34,492][INFO ][o.e.n.Node               ] [utTANpE] starting ...
[2020-05-12T21:30:36,438][INFO ][o.e.t.TransportService   ] [utTANpE] publish_address {127.0.0.1:9300}, bound_addresses {[::1]:9300}, {127.0.0.1:9300}
[2020-05-12T21:30:36,618][WARN ][o.e.b.BootstrapChecks    ] [utTANpE] max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
[2020-05-12T21:31:11,758][INFO ][o.e.c.s.MasterService    ] [utTANpE] zen-disco-elected-as-master ([0] nodes joined), reason: new_master {utTANpE}{utTANpEYTuCZuJUTRC1MTA}{dqniYcn1Ry6BLte0xA1d3w}{127.0.0.1}{127.0.0.1:9300}
[2020-05-12T21:31:11,864][INFO ][o.e.c.s.ClusterApplierService] [utTANpE] new_master {utTANpE}{utTANpEYTuCZuJUTRC1MTA}{dqniYcn1Ry6BLte0xA1d3w}{127.0.0.1}{127.0.0.1:9300}, reason: apply cluster state (from master [master {utTANpE}{utTANpEYTuCZuJUTRC1MTA}{dqniYcn1Ry6BLte0xA1d3w}{127.0.0.1}{127.0.0.1:9300} committed version [1] source [zen-disco-elected-as-master ([0] nodes joined)]])
[2020-05-12T21:31:41,619][INFO ][o.e.g.GatewayService     ] [utTANpE] recovered [0] indices into cluster_state
[2020-05-12T21:31:41,618][INFO ][o.e.h.n.Netty4HttpServerTransport] [utTANpE] publish_address {127.0.0.1:9200}, bound_addresses {[::1]:9200}, {127.0.0.1:9200}
[2020-05-12T21:31:43,789][INFO ][o.e.n.Node               ] [utTANpE] started
  • 解析命令行和配置文件参数
  • 检查JVM、操作系统环境
  • 初始化内部模块
  • 启动子模块和keepalive

1、启动脚本

source "`dirname "$0"`"/elasticsearch-env

ES_JVM_OPTIONS="$ES_PATH_CONF"/jvm.options
JVM_OPTIONS=`"$JAVA" -cp "$ES_CLASSPATH" org.elasticsearch.tools.launchers.JvmOptionsParser "$ES_JVM_OPTIONS"`
ES_JAVA_OPTS="${JVM_OPTIONS//${ES_TMPDIR}/$ES_TMPDIR} $ES_JAVA_OPTS"

cd "$ES_HOME"
# manual parsing to find out, if process should be detached
if ! echo $* | grep -E '(^-d |-d$| -d |--daemonize$|--daemonize )' > /dev/null; then
  exec 
    "$JAVA" 
    $ES_JAVA_OPTS 
    -Des.path.home="$ES_HOME" 
    -Des.path.conf="$ES_PATH_CONF" 
    -Des.distribution.flavor="$ES_DISTRIBUTION_FLAVOR" 
    -Des.distribution.type="$ES_DISTRIBUTION_TYPE" 
    -cp "$ES_CLASSPATH" 
    org.elasticsearch.bootstrap.Elasticsearch 
    "$@"
else
  exec 
    "$JAVA" 
    $ES_JAVA_OPTS 
    -Des.path.home="$ES_HOME" 
    -Des.path.conf="$ES_PATH_CONF" 
    -Des.distribution.flavor="$ES_DISTRIBUTION_FLAVOR" 
    -Des.distribution.type="$ES_DISTRIBUTION_TYPE" 
    -cp "$ES_CLASSPATH" 
    org.elasticsearch.bootstrap.Elasticsearch 
    "$@" 
    <&- &
  retval=$?
  pid=$!
  [ $retval -eq 0 ] || exit $retval
  if [ ! -z "$ES_STARTUP_SLEEP_TIME" ]; then
    sleep $ES_STARTUP_SLEEP_TIME
  fi
  if ! ps -p $pid > /dev/null ; then
    exit 1
  fi
  exit 0
fi

exit $?

2、实例化ElasticSearch

2.1、实例化ElasticSearch中用到的设计模式(命令模式)

  • 客户端角色(Client):创建一个具体命令(ConcreteCommand)对象并确定其接收者
  • 命令角色(Command):声明了一个给所有具体命令类的抽象接口或抽象类
  • 具体命令角色(ConcreteCommand):定义一个接收者和行为之间的弱耦合
  • 请求者角色(Invoker):负责调用命令对象执行请求,相关的方法叫做行动方法
  • 接收者角色(Receiver):负责具体实施和执行一个请求

    Elasticsearch在启动时接收不同的参数,来控制 Elasticsearch 的启动后的行为;使用使命模式让请求和执行模块解耦,


3、加载安全配置

elasticsearch.keystore

4、检查内部环境

5、检测外部环境

6、启动内部模块

7、启动keepalive线程

【引用】
图1引用自https://www.easyice.cn/archives/media/15108012015913/15153811722455.jpg

原文地址:https://www.cnblogs.com/shwang/p/12655651.html