博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
elasticsearch启动流程
阅读量:4539 次
发布时间:2019-06-08

本文共 3576 字,大约阅读时间需要 11 分钟。

本文基于ES2.3.2来描述。通过结合源码梳理出ES实例的启动过程。

elasticsearch的启动过程是根据配置和环境组装需要的模块并启动的过程。这一过程就是通过guice注入各个功能模块并启动这些模块,从而得到一个功能完整的node。正如之前所说elasticsearch的模块化特点,它的各个功能都是独立实现,然后实现通过guice对外提供。首先简单的说一下guice,它是google的一个轻量级依赖注入框架。它的作者也是依赖注入标准(JSR-330)制定者。虽然它是轻量级框架,但是它的功能及性能却非常好,这也是elasticsearch选用它作为代码主要框架的一个主要原因。

 

 

 1.ES实例启动

org.elasticsearch.Elasticsearch.mainorg.elasticsearch.bootstrap{    启动用户线程keepAliveThread    导入环境变量和配置参数    创建pid文件    检查(jvm环境,安全、等等)    nodeBuilder.build()    node.start();    keepAliveThread.start();}

 

2.Node启动

 

Node() {
更新setting和environment 构造pluginsService并动态加载plugin @1 加载并初始化modules(PluginsModule/ClusterModule/RestModule/TransportModule/ActionModule等) 使用guice构造各modules 构造client对象(performing actions/operations against the cluster}Node start(){ 构造services和plugins实例。 @2 TransportService启动 @3 DiscoveryService启动 @4 HttpServerTransport绑定地址,开始监听 @5 }

可以看到node的初始化过程主要包括三部分,第一是配置node环境,第二是启动插件服务(es提供了插件功能来进行扩展功能,这也是它的一个亮点),加载需要的插件,最后就是通过guice加载各个模块,启动各个服务。

先说一下插件加载过程。每个node在加载各个模块前,会首先加载所需要的插件,如果有些插件加载不成功node会启动失败。这里会加载三类插件:首先是配置插件,配置到节点配置文件中插件,如分词插件等;然后查找classpath中能找到的插件,这些插件一般防止在plugin文件夹中;最后是加载site插件,site插件是不涉及java代码的纯网站式插件,如监控插件head,bigdesk等。任何使用者都可以开发自己需要的插件,只要按着elasticsearch相关版本的插件开发规范来实现即可。接下来首先说一下启动各个模块的过程。elasticsearch各个功能模块实现的非常好,解耦非常完美,很多模块都实现了生命周期接口,只有启动它才能够对外提供服务,它的启动过程也是功能模块初始化的过程。因此,node节点的启动过程也就是这些模块初始化的过程。

 

@1构造pluginsService并动态加载plugin

依次调用各插件的OnModule方法。在OnModule方法内部可以针对多种model来依次操作,比如下面的添加过滤器或者替换TransportService。

为RestModule添加一个过滤器 public void onModule(RestModule module) {        module.addRestAction(AuthorityRestFilter.class);    }
为actionModels添加自定义过滤器AuthorityActionFilterpublic void onModule(final ActionModule module) {    module.registerFilter(AuthorityActionFilter.class);}
使用自定义AuthorityTransportService来代替默认的TransportServicepublic void onModule(final TransportModule module) {    module.setTransportService(AuthorityTransportService.class, name());}

 @2 启动各项服务

for (Class
plugin : pluginsService.nodeServices()) { injector.getInstance(plugin).start();// 加载插件中的自定义服务并启动 }
//通过guice获取各个模块的service接口并启动
injector.getInstance(MappingUpdatedAction.class).setClient(client); injector.getInstance(IndicesService.class).start(); injector.getInstance(IndexingMemoryController.class).start(); injector.getInstance(IndicesClusterStateService.class).start(); injector.getInstance(IndicesTTLService.class).start(); injector.getInstance(SnapshotsService.class).start(); injector.getInstance(SnapshotShardsService.class).start(); injector.getInstance(RoutingService.class).start(); injector.getInstance(SearchService.class).start(); injector.getInstance(MonitorService.class).start(); injector.getInstance(RestController.class).start(); // TODO hack around circular dependencies problems injector.getInstance(GatewayAllocator.class).setReallocation(injector.getInstance(ClusterService.class), injector.getInstance(RoutingService.class)); injector.getInstance(ResourceWatcherService.class).start(); injector.getInstance(GatewayService.class).start();
 

 

@3 使用netty实现的 tcp 引擎  public class NettyTransport extends AbstractLifecycleComponent<Transport> implements Transport

       构造客户端BootStrap,用于和其它节点间的通信。如果是server模式,还要启动ServerBootstrap用于接收其它客户端发来的请求

@4 发现功能功能主要用于节点启动后发现集群,master向所有节点发布集群状态,选举master节点并引发集群节点变得事件

 @5 使用netty实现的 http 引擎  public class NettyHttpServerTransport extends AbstractLifecycleComponent<HttpServerTransport> implements HttpServerTransport

 

 3.ES实例退出

shutdownhook触发node.close,停止各种服务、插件、脚本、线程池CountDownLatch减一,keepAliveThread退出删除pid文件

 

转载于:https://www.cnblogs.com/wzj4858/p/8111052.html

你可能感兴趣的文章
canvas刮奖
查看>>
添加源ubuntu_x64 安装 Adobe Reader
查看>>
给datalist加自动编号(解决博客的第XX楼)
查看>>
BZOJ3282: Tree (LCT模板)
查看>>
ES6中变量的解构赋值
查看>>
数据绑定控件Reperter
查看>>
【codeforces】【比赛题解】#937 CF Round #467 (Div. 2)
查看>>
Yii DataProvider
查看>>
BestCoder Round #14 B 称号 Harry And Dig Machine 【TSP】
查看>>
hdu 1114 Piggy-Bank
查看>>
maven集成tomcat插件启动报错
查看>>
Boost库编译安装
查看>>
算法复习——数位dp(不要62HUD2089)
查看>>
Spark2.1.0——运行环境准备
查看>>
noip模拟赛 寻宝之后
查看>>
ZOJ2833*(并查集)
查看>>
外连接简要总结
查看>>
第一次作业-准备篇
查看>>
【C++】继承时构造函数和析构函数
查看>>
opencv源代码之中的一个:cvboost.cpp
查看>>