elasticsearch启动流程
本文基于ES2.3.2来描述。通过结合源码梳理出ES实例的启动过程。
elasticsearch的启动过程是根据配置和环境组装需要的模块并启动的过程。这一过程就是通过guice注入各个功能模块并启动这些模块,从而得到一个功能完整的node。正如之前所说elasticsearch的模块化特点,它的各个功能都是独立实现,然后实现通过guice对外提供。首先简单的说一下guice,它是google的一个轻量级依赖注入框架。它的作者也是依赖注入标准(JSR-330)制定者。虽然它是轻量级框架,但是它的功能及性能却非常好,这也是elasticsearch选用它作为代码主要框架的一个主要原因。
1.ES实例启动
org.elasticsearch.Elasticsearch.main
org.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添加自定义过滤器AuthorityActionFilter
public void onModule(final ActionModule module) {
module.registerFilter(AuthorityActionFilter.class);
}
使用自定义AuthorityTransportService来代替默认的TransportService
public void onModule(final TransportModule module) {
module.setTransportService(AuthorityTransportService.class, name());
}
@2 启动各项服务
for (Class<? extends LifecycleComponent> 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文件
elasticsearch启动流程的更多相关文章
- 渣渣菜鸡的 ElasticSearch 源码解析 —— 启动流程(下)
关注我 转载请务必注明原创地址为:http://www.54tianzhisheng.cn/2018/08/12/es-code03/ 前提 上篇文章写完了 ES 流程启动的一部分,main 方法都入 ...
- 渣渣菜鸡的 ElasticSearch 源码解析 —— 启动流程(上)
关注我 转载请务必注明原创地址为:http://www.54tianzhisheng.cn/2018/08/11/es-code02/ 前提 上篇文章写了 ElasticSearch 源码解析 -- ...
- java框架之SpringBoot(10)-启动流程及自定义starter
启动流程 直接从 SpringBoot 程序入口的 run 方法看起: public static ConfigurableApplicationContext run(Object source, ...
- Flink 源码解析 —— Standalone Session Cluster 启动流程深度分析之 Job Manager 启动
Job Manager 启动 https://t.zsxq.com/AurR3rN 博客 1.Flink 从0到1学习 -- Apache Flink 介绍 2.Flink 从0到1学习 -- Mac ...
- Flink 源码解析 —— Standalone session 模式启动流程
Standalone session 模式启动流程 https://t.zsxq.com/EemAEIi 博客 1.Flink 从0到1学习 -- Apache Flink 介绍 2.Flink 从0 ...
- Flink 源码解析 —— Standalone Session Cluster 启动流程深度分析之 Task Manager 启动
Task Manager 启动 https://t.zsxq.com/qjEUFau 博客 1.Flink 从0到1学习 -- Apache Flink 介绍 2.Flink 从0到1学习 -- Ma ...
- MyCat源码分析系列之——配置信息和启动流程
更多MyCat源码分析,请戳MyCat源码分析系列 MyCat配置信息 除了一些默认的配置参数,大多数的MyCat配置信息是通过读取若干.xml/.properties文件获取的,主要包括: 1)se ...
- Android进阶系列之源码分析Activity的启动流程
美女镇楼,辟邪! 源码,是一个程序猿前进路上一个大的而又不得不去翻越障碍,我讨厌源码,看着一大堆.5000多行,要看完得啥时候去了啊.不过做安卓的总有这一天,自从踏上这条不归路,我就认命了.好吧,我慢 ...
- Spring Boot启动流程详解(一)
环境 本文基于Spring Boot版本1.3.3, 使用了spring-boot-starter-web. 配置完成后,编写了代码如下: @SpringBootApplication public ...
随机推荐
- ss命令用来显示处于活动状态的套接字信息。
ss命令用来显示处于活动状态的套接字信息.ss命令可以用来获取socket统计信息,它可以显示和netstat类似的内容.但ss的优势在于它能够显示更多更详细的有关TCP和连接状态的信息,而且比net ...
- JAVA中CountDownLatch的简单示例
public static void main(String[] args) throws InterruptedException { CountDownLatch latch =new Count ...
- Linux蓝牙库blueZ
1.blueZ 官网 2.zigbee 网络库zigbee(可用在smart home devices)
- 【LeetCode】526. Beautiful Arrangement 解题报告(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...
- 【LeetCode】659. Split Array into Consecutive Subsequences 解题报告(Python)
[LeetCode]659. Split Array into Consecutive Subsequences 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id ...
- 【LeetCode】868. Binary Gap 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 线性扫描 日期 题目地址:https://leetc ...
- RabbitMQ 七种队列模式
(1)简单模式(Hello World) 做最简单的事情,一个生产者对应一个消费者,RabbitMQ相当于一个消息代理,负责将A的消息转发给B 应用场景: 将发送的电子邮件放到消息队列,然后邮件服务在 ...
- 第四十七个知识点:什么是Fiat-Shamir变换?
第四十七个知识点:什么是Fiat-Shamir变换? 只要Alice和Bob同时在线,Sigma协议能快速的完成Alice向Bob证明的任务.Alice向Bob发送承诺,Bob返回一个挑战,最后Ali ...
- 更新系统为High sierra 后无法使用Cocoapods
sudo gem update --system sudo gem install -n /usr/local/bin cocoapods执行完就可以直接用了.
- Linux的基本目录结构