elasticsearch源码分析及插件开发
ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。ES能提供强大的索引能力,很大一方面原因是由多个分布在不同机器的es实例组成集群对外提供服务,这种可以横向扩展的机制可以极大提升服务能力。每一个es实例都是基于Lucene的独立服务,负责本地分片上数据的索引和查询,如果掌握了ES的是实现细节,就会对es所具有的特性有一个本质的认识。
我们会先基于ES2.3.2源码来理清楚ES的启动流程,然后介绍下ES节点(Node)的内部结构,最后再分析下ES插件机制并举一个安全插件的开发示例。
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 @2.1
加载并初始化modules(PluginsModule/ClusterModule/RestModule/TransportModule/ActionModule等)
使用guice构造各modules
构造client对象(performing actions/operations against the cluster
} Node start()
{
构造services和plugins实例。 @2.2
TransportService启动 @2.3
DiscoveryService启动 @2.4
HttpServerTransport绑定地址,开始监听 @2.5
}
可以看到node的初始化过程主要包括三部分,第一是配置node环境,第二是启动插件服务(es提供了插件功能来进行扩展功能,这也是它的一个亮点),加载需要的插件,最后就是通过guice加载各个模块,启动各个服务。
先说一下插件加载过程。每个node在加载各个模块前,会首先加载所需要的插件,如果有些插件加载不成功node会启动失败。这里会加载三类插件:首先是配置插件,配置到节点配置文件中插件,如分词插件等;然后查找classpath中能找到的插件,这些插件一般防止在plugin文件夹中;最后是加载site插件,site插件是不涉及java代码的纯网站式插件,如监控插件head,bigdesk等。任何使用者都可以开发自己需要的插件,只要按着elasticsearch相关版本的插件开发规范来实现即可。接下来首先说一下启动各个模块的过程。elasticsearch各个功能模块实现的非常好,解耦非常完美,很多模块都实现了生命周期接口,只有启动它才能够对外提供服务,它的启动过程也是功能模块初始化的过程。因此,node节点的启动过程也就是这些模块初始化的过程。
@2.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.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();
@2.3 用于集群内节点间通信的引擎
基于netty实现的tcp引擎 NettyTransport 来构造客户端BootStrap,用于和其它ES节点间的通信。如果是server模式,还要启动ServerBootstrap用于接收其它客户端发来的请求
public class NettyTransport extends AbstractLifecycleComponent<Transport> implements Transport
@2.4 发现功能
发现功能主要用于节点启动后发现集群,master向所有节点发布集群状态,选举master节点并引发集群节点变得事件
@2.5 对外提供http服务的引擎
使用netty实现的 http 引擎
public class NettyHttpServerTransport extends AbstractLifecycleComponent<HttpServerTransport> implements HttpServerTransport
3.ES实例退出
shutdownhook触发
node.close,停止各种服务、插件、脚本、线程池
CountDownLatch减一,keepAliveThread退出
删除pid文件
elasticsearch源码分析及插件开发的更多相关文章
- Elasticsearch源码分析 - 源码构建
原文地址:https://mp.weixin.qq.com/s?__biz=MzU2Njg5Nzk0NQ==&mid=2247483694&idx=1&sn=bd03afe5a ...
- Elasticsearch源码分析—线程池(十一) ——就是从队列里处理请求
Elasticsearch源码分析—线程池(十一) 转自:https://www.felayman.com/articles/2017/11/10/1510291570687.html 线程池 每个节 ...
- elasticsearch源码分析之search模块(server端)
elasticsearch源码分析之search模块(server端) 继续接着上一篇的来说啊,当client端将search的请求发送到某一个node之后,剩下的事情就是server端来处理了,具体 ...
- elasticsearch源码分析之search模块(client端)
elasticsearch源码分析之search模块(client端) 注意,我这里所说的都是通过rest api来做的搜索,所以对于接收到请求的节点,我姑且将之称之为client端,其主要的功能我们 ...
- Elasticsearch源码分析 | 单节点的启动和关闭
本文主要简要介绍Elasticsearch单节点的启动和关闭流程.Elasticsearch版本:6.3.2 相关文章 1.Google Guice 快速入门 2.Elasticsearch 中的 G ...
- Elasticsearch源码分析(一)启动流程 ModuleBuilder injector
http://blog.csdn.net/u010994304/article/details/50452890 es启动脚本是bin目录下的elasticsearch. 脚本内容不再赘述,java主 ...
- ElasticSearch Index操作源码分析
ElasticSearch Index操作源码分析 本文记录ElasticSearch创建索引执行源码流程.从执行流程角度看一下创建索引会涉及到哪些服务(比如AllocationService.Mas ...
- ElasticSearch 启动时加载 Analyzer 源码分析
ElasticSearch 启动时加载 Analyzer 源码分析 本文介绍 ElasticSearch启动时如何创建.加载Analyzer,主要的参考资料是Lucene中关于Analyzer官方文档 ...
- Solr4.8.0源码分析(13)之LuceneCore的索引修复
Solr4.8.0源码分析(13)之LuceneCore的索引修复 题记:今天在公司研究elasticsearch,突然看到一篇博客说elasticsearch具有索引修复功能,顿感好奇,于是点进去看 ...
随机推荐
- 分布式:分布式事务(CAP、两阶段提交、三阶段提交)
1 关于分布式系统 1.1 介绍 我们常见的单体结构的集中式系统,一般整个项目就是一个独立的应用,所有的模块都聚合在一起.明显的弊端就是不易扩展.发布冗重.服务治理不好做. 所以我们把整个系统拆分成若 ...
- 通过go调用bat解决乱码核心代码
背景:通过go写的程序调用dos命令(如dir c:),返回值往往有中文,默认会出现乱码. 解决:转码. 代码:GO package shellLib import ( "golang.or ...
- uniapp+nvue实现仿微信App界面+功能 —— uni-app实现聊天+语音+视频+图片消息
基于uniapp + nvue实现的uniapp仿微信界面功能聊天应用 txim 实例项目,实现了以下功能. 1: 聊天会话管理 2: 好友列表 3: 文字.语音.视频.表情.位置等聊天消息收发 4: ...
- PowerDotNet平台化软件架构设计与实现系列(09):消息平台
消息队列已经几乎成为大中型高吞吐应用的标配,继续根据我们一贯的节约代码的风格,为了复用的目标,抽象出消息队列平台,进行消息队列管理. 环境准备 1.(必须).Net Framework4.5+ 2.( ...
- JENKINS中创建全局变量并在JOB中使用
配置了一个 "PASSWORD"的变量值 然后再脚本里面使用 注意这里必须要用双引号 不然不行
- Linux使用docker安装MinIO
官方地址:http://docs.minio.org.cn/docs/master/minio-docker-quickstart-guide 拉取镜像 docker pull minio/minio ...
- 【LeetCode】322. Coin Change 解题报告(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 动态规划 日期 题目地址:https://leetc ...
- 【LeetCode】783. Minimum Distance Between BST Nodes 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 中序遍历 日期 题目地址:https://leetc ...
- 基于内存的关系数据库memsql初探
背景 广告系统中,算法模型预估需要根据广告的实时转化统计结果,才能做出更精准的预估:同时,支持多维度聚合查询(例如按照广告各个不同层级维度,按照时间不同粒度的维度),并跨大区合并.一开始的版本是基于m ...
- WEB文档在线预览解决方案
web页面无法支持预览office文档,但是却可以预览PDF.flash文档,所以大多数解决方案都是在服务端将office文档转换为pdf,然后再通过js的pdf预览插件(谷歌浏览器等已经原生支持嵌入 ...