Elasticsearch-7.17 源码环境搭建

准备环境

本次我选择的环境是 7.X 中目前最新的 7.17 版本,代码下载下来之后,需要关注的文件有以下三个:

CONTRIBUTING.md 中的 Contributing to the Elasticsearch codebase部分详细说明了需要的 JDK 版本,而后面的两个 Ggradle 文件中则声明了对应分支所使用的 Gradle 版本,以及一些额外的要求(其它版本的要求类似,都可以在这些文档中找到),以下为从上述文件中获取到的 7.17 的环境要求信息:

  • JDK 17
  • GRADLE_USER_HOME,环境变量,用于指定依赖的下载位置;
  • gradle-7.4.1 ,在 gradle-wrapper.properties中有详细描述,最好的方式是使用 ./gradlew 或者gradlew.bat ,它们会自动下载 wrapper文件中对应版本的 gradle,并存放到 GRADLE_USER_HOME 中;

导入项目到 IDEA 中

此部分在 Contributing.md 中也有详细的描述,并说明了要求的最低 idea 的版本为 2020.1(很贴心,每个版本的分支中都有),下面为 7.17 版本的操作步骤:

  • 选择 File > Open
  • 在子窗口中,选择源代码根目录所在的 build.gradle 文件
  • 在子窗口中选择 Open as Project
  • 选择 File > Project Structure,设置项目的 SDKJDK17

张超老师的源码书中,6.3左右的版本中需要先执行 ./gradlew idea 再进行导入,目前使用该命令时会提示已经过时

启动项目

等待 Gradle 下载完依赖包之后,我们就可以开始启动项目了,具体的程序入口在 server 目录下的 org.elasticsearch.bootstrap.Elasticsearch#main 方法里。这里我们需要针对启动做一些额外配置:

首先在 idearun > Edit Configuration 中新建一个 Application ,设置名称为 local 以及对应的 SDK

image-20220319171719577

设置模块名为 elasticsearch.server.main(不先设置的话 Main class 会找不到指定类),设置Main classorg.elasticsearch.bootstrap.Elasticsearch,同时找到 Modify options,将 add vm options 选中(我用的 idea2021.3 版本默认是隐藏了的)

vm options 一栏的具体内容如下所示:

1
2
3
4
5
6
-Des.path.home=I:\eshome
-Des.path.conf=I:\eshome\config
-Dlog4j2.disable.jmx=true
-Djava.security.policy=I:\eshome\config\elasticsearch.policy
-Xms1g
-Xmx1g

在解释这些信息前,我们需要创建一个 eshome 目录(名称随意,可以在你电脑磁盘任意位置),ES 在启动时需要从中加载配置、模块,并向该目录写入相关日志信息。然后我们还需要向其中拷贝一些必要的模块和配置文件。获取这些文件的方式有以下两种:

  • 选择官方发布包对应版本,解压后将 configmodulesplugins 目录复制到 eshome 目录中,注意修改 elasticsearch.yml 中的配置
  • 参考 README 中的说明自行编译,然后拷贝到 eshome 目录中,运行 ./gradlew localDistro 之后即可根据自己当前的操作系统编译出对应的包,例如我是 windows系统,可以在 distribution/archives/windows-zip 中找到编译完成的文件。注意修改 elasticsearch.yml 中的配置

现在我们来细看下 vm options 中各参数的含义:

参数 说明
-Des.path.home 指定 eshome 所在的路径名
-Des.path.conf 指定配置文件的位置,ES 启动时会使用该目录下的配置文件
-Djava.security.policy 指定自定义 policy 文件的位置
-Dlog4j2.disable.jmx 不加此参数倒也能启动,不过控制台中会多出一些 access denied 的错误
-Xms、-Xmx 最小堆内存、最大堆内存设置

除上述信息外,我们还需要在 config 目录下手动创建一个名为 elasticsearch.policy 的文件,其内容如下:

1
2
3
4
5
6
7
grant {
permission javax.management.MBeanTruxtPermission "register";
permission javax.management.MBeanServerPermission "createMBeanServer";
permission java.lang.RuntimePermission "createClassLoader";
permission java.lang.RuntimePermission "getClassLoader";
permission java.lang.RuntimePermission "setContextClassLoader";
};

不同版本下会存在一些区别,启动时如果缺少 permission (例如将上述的最后一行删掉)会报类似如下的错误,将其添加到 policy 文件中即可,本质原因是由于 ES 自定义了代码安全策略,并在自己的 security.policy 文件中进行管理。而我们在调试时 idea 是使用的自行编译的 class 文件,详情可参考这篇文章 elasticsearch之自定义Java代码的安全策略管理

image-20220319183326218

配置好自定义的 policy 文件之后,我们还需要在 server 模块的 resouces 目录下找到源码中携带的 security.policy文件,注释掉该文件的 codebase.elasticsearch-secure-smcodebase.elasticsearchcodebase.elasticsearch-plugin-classloader 三处的权限配置,否则在启动时你会看到如下报错信息。(这里的原因是,此部分配置是针对打包后的设置,而我们在调试运行时,只有 classes 文件,所以会识别不到,详情也可参考社区里的提问idea运行es报Unknown codebases异常

到这里,我们的环境就配置完成了,点击启动,就能看到调试运行单机版的 ES

image-20220319211949574

另外,节点在启动时默认会去官网同步 geoip 数据,如果 elasticsearch.yml 文件中没有设置 ingest.geoip.downloader.enabled: false 的话,会显示 access denied (org.elasticsearch.secure_sm.ThreadPermission "modifyArbitraryThreadGroup") ,如果不希望看到报错信息的话,加上该配置即可解决。下图为我使用的配置文件内容:

参考文章

0%