vlambda博客
学习文章列表

从0到1之搭建Elasticsearch(7.10.2)源码debug环境







Elasticsearch






1

背景


很多对Ealsticsearch感兴趣或者需要阅读ES源码去解决一些问题的同学,往往因为在本地很难把ES的源码跑起来,而阻碍了学习热情;为了帮助有需要的同学解决这个问题,本文将如何在IDEA搭建ES源码开发环境进行实操演练。


2

软硬件环境

macPro、jdk11(Elasticsearch需要的jdk版本)、idea2021.2.1、maven3.8.5和gradle(可以不用自己安装)、Elasticsearch源码(v7.10.2) 


3

软件安装

  • jdk

安装jdk11,可以去oracle官网下载,可以下载安装版dmg          

https://www.oracle.com/java/technologies/downloads/,如图3-1

                                         图3-1 jdk

点击运行之后配置环境变量,在终端执行如下的命令,并在文件末尾追加你安装的JAVA_HOME.

vim /etc/profile

alias ll='ls -Alh'export JAVA_8_HOME=`/usr/libexec/java_home -v 1.8`export JAVA_11_HOME=`/usr/libexec/java_home -v 11`export JAVA_17_HOME=`/usr/libexec/java_home -v 17`export JAVA_HOME=$JAVA_8_HOME#alias命令动态切换JDK版本alias jdk8="export JAVA_HOME=$JAVA_8_HOME"alias jdk11="export JAVA_HOME=$JAVA_11_HOME"alias jdk17="export JAVA_HOME=$JAVA_17_HOME"
执行命令 source /etc/profile,使环境变量生效;因为我为了开发方便,安装是三个版本的jdk;使用jdk11,直接在终端执行jdk11命令。
  • maven       

    安装maven,maven的作用主要是帮助管理java项目的jar依赖。

    在终端执行如下命令

//下载wget https://dlcdn.apache.org/maven/maven-3/3.8.5/binaries/apache-maven-3.8.5-bin.tar.gz//解压tar -zxf apache-maven-3.8.5-bin.tar.gzcd apache-maven-3.8.5/conf    
给maven配置下,本地仓库地址和镜像仓库地址 vim settings.xml 。
<!--将其从注释中复制出来,取消掉其注释,目录修改为自己本机自定义的一个目录即可--><localRepository>/path/to/local/repo</localRepository>
<mirrors>  <!--为了加快jar的下载速度,可以配置一些国内的镜像仓库--> <mirror> <id>nexus-aliyun</id> <mirrorOf>*</mirrorOf> <name>Nexus aliyun</name> <url>http://maven.aliyun.com/nexus/content/groups/public</url> </mirror></mirrors>


gradle在es6版本之后,可以不用提前安装,Elasticsearch的源码包自带。


4

源码下载与运行

es源码地址如下
//https clone 地址https://github.com/elastic/elasticsearch.git//ssh clone地址[email protected]:elastic/elasticsearch.git
如果你的工作中需要配置多个ssh-key,那么你需要在 ~/.ssh 目录下创建一个config文件。
yangsongbai@yangsongbai conf % cd ~/.ssh yangsongbai@yangsongbai .ssh % lltotal 40-rw-r--r--  1 yangsongbai  staff   260B  3 25 17:35 config-rw-------  1 yangsongbai  staff   1.6K  3 25 17:36 known_hosts-rw-------  1 yangsongbai  staff   1.1K  3 25 17:36 known_hosts.old-rw-------  1 yangsongbai  staff   3.3K  3 17 23:20 yangsongbai_rsa-rw-r--r--  1 yangsongbai  staff   750B  3 17 23:20 yangsongbai_rsa.pub
config文件内容如下
yangsongbai@yangsongbai .ssh % cat config # githubHost github.com HostName github.com PreferredAuthentications publickey    IdentityFile ~/.ssh/yangsongbai_rsa
ssh配置正确后,我们就可以clone代码了,这个过程会比较长(国外网速慢,也可以将elasticsearch的代码clone到码云上,再从码云上clone下来);
//https clone 地址git clone https://github.com/elastic/elasticsearch.git//或者 ssh clone地址git clone [email protected]:elastic/elasticsearch.git


5

本地运行代码

  • 导入IDEA

代码clone 下来之后,我们需要切换到我们想要版本的分支/tag 
//切换到指定tag上 git checkout v7.10.2 //基于v7.10.2的tag创建自己的分支git checkout -b 7.10.2-reader  v7.10.2 //切换到自己的分支git checkout 7.10.2-reader
接下来我们可以用idea打开Elasticsearch项目(如果是早期版本的es,可能需要先在es项目下执行 ./gradlew idea,再用idea打开),打开之后可能需要等到比较长的时间,因为idea要识别的项目模块,并且给文件建立索引。如果ES项目的java文件没有被识别很有可能是没有正确给项目配置jdk;因此需要重新给idea中的es项目配置好jdk。
在左上角,菜单File->project Structure...,如图5-1所示;然后如图5-2所示,配置project SDK选择为本地已经安装好的jdk11。

从0到1之搭建Elasticsearch(7.10.2)源码debug环境

                                  图 5-1 

从0到1之搭建Elasticsearch(7.10.2)源码debug环境

                                   图5-2

配置完成后建议重启下idea。

本地debug      

在本地创建es运行时的目录,执行命令如下
mkdir ~/eshome
eshome所需的文件如下
yangsongbai@yangsongbai  eshome % lltotal 0
drwxr-xr-x  12 yangsongbai  staff   384B  3 27 10:41 configdrwxr-xr-x@ 53 yangsongbai  staff   1.7K  3 24 13:42 modulesdrwxr-xr-x@  2 yangsongbai  staff    64B  3 24 13:42 plugins

以上三个目录可以去官方网站下载对应发行版的es或者在自己clone下来的elasticsearch项目下执行./gradlew assemble命令(注意:自己构建打包的安装包,在distribution下的archives和packages目录下),然后解压将如上的三个目录复制到eshome下。

为了获取jdk的一些权限,需要在config目录下创建elasticsearch.policy文件,文件内容如下

grant{ permission javax.management.MBeanTruxtPermission "register";  permission javax.management.MBeanServerPermission "createMBeanServer"; permission java.lang.RuntimePermission "createClassLoader"; permission java.net.SocketPermission "*:*","connect,resolve"; permission java.lang.RuntimePermission "getClassLoader";  permission java.lang.RuntimePermission "setContextClassLoader"; } ;
config目录下修改elasticsearch.yml文件,文件内容如下
cluster.name: es_local_on_macgateway.write_dangling_indices_info: false
#network.host: 0.0.0.0discovery.seed_hosts: ["127.0.0.1:9300"]cluster.initial_master_nodes: ["master-1"]node.data: truenode.master: truenode.name: master-1http.port: 9200transport.tcp.port: 9300
在idea的run配置如图5-3所示     

从0到1之搭建Elasticsearch(7.10.2)源码debug环境

                               图5-3所示

如图5-3所示,其中图中1处 表示使用的jdk,图中2处 表示运行的es模块elasticsearch.server.main,图中3处表示VM options,图中4处表示主类,5 表示将依赖scope为provided的jar加入进classPath(有的idea,直接是个复选框,有的idea是在途中6处选中)


其中比较重点的是图中3处VM options,其详细配置如下(使用时将注释去掉)

//es运行时的家目录-Des.path.home=/Users/yangsongbai1/apps/eshome//配置文件的目录-Des.path.conf=/Users/yangsongbai1/apps/eshome/config//这个是jvm.options文件的默认配置,不加会报access denied等错,//idea启动的时候不会去去加载jvm.options-Dlog4j.disable.jmx=true//权限问题(比如呀运行时创建类加载器等权限问题),需要配置-Djava.security.policy=/Users/yangsongbai1/apps/eshome/config/elasticsearch.policy//配置运行es节点堆内存-Xms1g-Xmx1g
完成以上配置之后便可以在本地,通过源代码运行一个es节点,我们可以通过debug或者打日志的方式,学习阅读源码了。
  • 远程debug

    除了在本地debug外,我们还可以通过远程debug的方式去学习源代码。

    假如我们在远端服务器或者本地部署了三个节点的集群,那么我们可以分别在每个节点的vm.options追加如下配置,方便我们进行远程debug

远程debug#node1-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=2220#node2-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=2221#node3-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=2222
远端的节点配置好之后,重启每个节点;然后在idea中远程的run配置如图5-4所示

                                     图5-4

如图5-4所示,Host填写远程机器的ip,如果是本地可以直接写localhost;Port即为jvm.options对应节点的监听端口;再下面的Command line arguments for remote JVM填写,与服务器端节点jvm.options中对应的配置即可。
  • 本地集群       

    在本地搭建一个集群,其中两个节点为官网的发行版,另外一个节点为本地用源码启动的节点,并且加入集群。

到官方网站下载elasticsearch-7.10.2-darwin-x86_64.tar.gz;具体操作命令如下:

//解压文件tar -zxf elasticsearch-7.10.2-darwin-x86_64.tar.gz//创建master节点目录mkdir master//创建data1节点目录mkdir data1//将发行版解压内容,复制到mastercp -rf elasticsearch-7.10.2/* master///将发行版解压内容,复制到data1cp -rf elasticsearch-7.10.2/* master/

完成以上命令后内容如下

yangsongbai@yangsongbai originate % ll         total 595568drwxr-xr-x  13 yangsongbai  staff   416B  3 26 10:33 data1drwxr-xr-x@ 12 yangsongbai  staff   384B  1 13  2021 elasticsearch-7.10.2-rw-r--r--@  1 yangsongbai  staff   291M  3 22 12:27 elasticsearch-7.10.2-darwin-x86_64.tar.gzdrwxr-xr-x  13 yangsongbai  staff   416B  3 26 10:31 master
修改master的配置,vim master/config/elasticsearch.yml,增加如下的内容
cluster.name: es_orig_local_on_macgateway.write_dangling_indices_info: falsediscovery.seed_hosts["127.0.0.1:9300"]cluster.initial_master_nodes: ["master-1"]node.data: falsenode.master: truenode.name: master-1http.port: 9200transport.tcp.port: 9300
为了方便进行远程debug,可以在jvm.options文件末尾追加如下配置,vim master/config/jvm.options
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=2220
data1节点的配置,vim data/config/elasticsearch.yml,增加如下内容
cluster.name: es_orig_local_on_macgateway.write_dangling_indices_info: falsediscovery.seed_hosts: ["127.0.0.1:9300"]cluster.initial_master_nodes: ["master-1"]node.data: truenode.master: falsenode.name: data-1http.port: 9201transport.tcp.port: 9301
vim data1/config/jvm.options
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=2221
然后分别启动节点这两个节点(也可以开两个终端,前台启动)
./master/bin/elasticsearch &./data1/bin/elasticsearch &

完成两个发行版的节点启动之后,我们再来配置源码节点(具体操作可以参看本文的本地debug部分);config目录下修改elasticsearch.yml文件,文件内容如下
cluster.name: es_orig_local_on_macgateway.write_dangling_indices_info: falsediscovery.seed_hosts: ["127.0.0.1:9300"]cluster.initial_master_nodes: ["master-1"]node.data: truenode.master: falsenode.name: data-2http.port: 9202transport.tcp.port: 9302
完成修改配置后直接在idea启动run该Elasticsearch,源代码节点便可以加入集群。
  • 测试 restfulApi 

    测试rest-api-spec的命令如下

./gradlew :rest-api-spec:yamlRestTest
运行效果如图5-5所示

                   图5-5 restApi测试

或者可以执行运行某个测试用例,命令如下所示
./gradlew ':rest-api-spec:yamlRestTest' \ --tests "org.elasticsearch.test.rest.ClientYamlTestSuiteIT" \ -Dtests.method="test {p0=cat.segments/10_basic/Help}"
查看:rest-api-spec:yamlRestTest任务支持哪些参数,执行命令如下
yangsongbai@yangsonbai elasticsearch-7.10.2 % ./gradlew help --task :rest-api-spec:yamlRestTest =======================================Elasticsearch Build Hamster says Hello! Gradle Version : 6.6.1 OS Info : Mac OS X 12.1 (x86_64) JDK Version : 11 (Oracle JDK) JAVA_HOME : /Library/Java/JavaVirtualMachines/jdk-11.0.14.jdk/Contents/Home Random Testing Seed : 3A61F74191DEDB20 In FIPS 140 mode : false=======================================
> Task :helpDetailed task information for :rest-api-spec:yamlRestTest
Path :rest-api-spec:yamlRestTest
Type RestIntegTestTask (org.elasticsearch.gradle.test.RestIntegTestTask)
Options --debug-jvm Enable debugging for the test process. The process is started suspended and listening on port 5005.
--fail-fast Stops test execution after the first failed test.
--tests Sets test class or method name to be included, '*' is supported.
Description Runs the REST tests against an external cluster
Group verification
更多测试使用方式,请参考

https://github.com/elastic/elasticsearch/blob/v7.10.2/TESTING.asciidoc



Elasticsearch