环境信息
- java_home. jdk11
- elasticsearch 6.6.1(7.6也类似) 不需要下载gradle,编译时候自己会去下载对应的gradle的版本
git clone elasticsearch代码,以idea为例
git clone github.com/elastic/ela…
这里用idea演示,拉取的时间有点长,需要等会
编译
- 在当前目录下运行./gradlew idea(如果失败的话,看下具体的jdk的版本,像6.6的es需要jdk11)
- idea右边gradle刷新下,这个时候就能代码就能跳转看了
打成elasticsearch安装包
打包命令
当前目录下运行./gradlew assemble,这个会生成所有平台的安装包,如只需要生成对应平台的安装包,则用如下的命令:
- ./gradlew :distribution:archives:linux-tar:assemble --parallel
- ./gradlew :distribution:archives:darwin-tar:assemble --parallel
- ./gradlew :distribution:archives:windows-zip:assemble --parallel 打成安装包以后就跟跟官网下载的一样可以解压运行了
查看包所在的目录
这里显示的es7.6的目录,es6.6也是类似的
本地运行命令
- ./gradlew run,基于源码本地启动elasticsearch(无需安装包)
远程调试
本地远程调试
./gradlew run --debug-jvm本地启动后,利用idea远程debug,远程debug配置,配置好后,打上断点就可以发起debug了(注意debug的端口号,6.6的es默认是8000)
安装包远程调试
基于安装包启动elasticsearch,启动之前需要在jvm.config中增加-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005,然后在idea里面配置,打断点debug就可以了
elasticsearch代码结构解析
-
transport layer 传输层,用于客户端和集群交互以及集群节点间的交互,传输层包括http模块和tcp模块,es进程启动会绑定两个tcp端口,一个用于http restful协议,一个走私有协议。内部走的都是私有协议,对外接口,除了java 提供tcp sdk,其他语言的sdk均走的是http协议,es现在也推崇走http restful协议,私有协议在版本兼容性方面,兼容成本会比较高
-
action layer es内部功能处理流转模块,es的提供的各种接口、内部分布式处理的命令都会被定义为一种action,所以我们要知道es提供了什么能力,就要知道它定义了多少action,要知道这种能力是如何执行的,就要知道具体的action中的doExecute方法是如何实现的。重点关注:
org.elasticsearch.action.support.TransportAction org.elasticsearch.action.support.master.TransportMasterNodeAction org.elasticsearch.action.support.replication.TransportReplicationAction
- cluster layer 集群管控主要都围绕ClusterState对象展开,ClusterState是ES集群的元数据类,里面包含了ES集群全部的元数据信息,cluster管控了索引shard的routing、索引的mapping信息和一些管理操作,这些管控命令都在master上完成,主要都是在调整ClusterState对象,并同步给集群的其他节点(后续会重点介绍)。重点关注:
org.elasticsearch.cluster.service.MasterService org.elasticsearch.cluster.routing.allocation.allocator.BalancedShardsAllocator org.elasticsearch.cluster.routing.allocation.decider
-
indices layer shard之上是索引的一些操作,用于控制索引整体shard的创建、删除、恢复、mapping、flush操作等
-
index layer 索引shard的一些操作,实现了比如cache、fielddata、flush、refresh、translog等功能。重点关注:org.elasticsearch.index.engine.InternalEngine
-
lucene layer lucene的library,es存储引擎使用的是lucene,查询、写入接口最终的操作会转换成lucene引擎的调用
-
gateway layer es的持久化层gateway,gateway用于配置es数据存放的文件系统,默认会使用本地文件系统,也可以配置使用一些分布式的文件系统。持久化层除了决定lucene使用的文件系统,也管理了es自身的元数据信息持久化,translog持久化等。gateway层还控制了集群恢复的一些参数,比如最小的master数量,执行恢复操作的最小的节点数量等。 重点关注:org.elasticsearch.gateway.GatewayService
-
discovery 节点注册与选组模块,es使用p2p协议,自动发现集群所有的节点,其实就是根据配置的地址列表,找到master,然后从master获取集群节点信息。es默认使用的是zen discovery。重点关注:org.elasticsearch.discovery.zen.ZenDiscovery
-
common 公共模块
-
search 将DSL查询语句转换成lucene的查询语句,聚合相关的逻辑是es自己实现的。重点关注:org.elasticsearch.search.SearchService
org.elasticsearch.search.internal.SearchContext -
ingest ingest node是一个对文档进行预处理的节点,能够在数据写入es前,先对数据进行预处理。
-
plugins es支持在以插件的方式为es添加更丰富,个性化的功能。在请求流程之前和之后都能植入插件的逻辑,插件还能给es增加接口、定时任务,获取到es内部的一些状态信息等等
-
monitor 收集stats信息
-
task 任务管理模块,用于像reindex、delete by query等执行时间比较长的任务管理。
-
script 脚本模块,es支持在查询语句中插入一段脚本语言,从而在处理时调用该脚本。
实战debug demo,es 6.6.1为例
locaost:9200这个请求运行流程图
启动elasticsearch
当前目录下,启动./gradlew run --debug-jvm
远程调试debug
idea配置远程debug
打上断点
启动debug,展示如下表示启动debug成功
浏览器执行localhost:9200,如下表示debug成功
总结
本篇主要介绍了elasticsearch本地编译、本地启动和远程debug,以及elasticsearch的代码结构和实战debug demo,后续会介绍elasticsearch的查询,写入等流程。