【橘子ES】如何本地调试ES源码

一、简介

我们在研究一个中间件源码的时候,其实最好的办法就是编译他的源码,并且通过源码启动,然后这样可以在服务端进行debug,方便我们更加清晰的了解他的运行流程。

这里我们来编译启动一下Elasticsearch8.1.0的版本。

二、源码编译

1、在编译之前要准备好jdk17的环境,因为从es8之后jdk要求就是jdk17。

2、准备一个发行版的安装包,比如我们这里是8.1.0,那我们就下载一个8.1.0的版本

发行版的作用是为我们的源码启动提供一些配置环境,比如配置文件,权限文件,jvm文件,等等那些你以前通过安装包启动时候需要的脚本和文件,这里依然需要。

3、idea最好是2024左右的,别太老了,不然会有一些奇怪的问题。

4、一个比较好的网络环境,因为我们要下载一些安装文件,或者可以配置国内的比如阿里的源都可以。

在准备好之后我们就通过git clone把源码拉下来,或者直接下载都可以,对好版本8.1.0即可。

然后用idea打开项目,选择好jdk,就把平时那几个需要配置jdk版本的地方都指向jdk17即可,除了常见的那几个地方一定要把setting下的gradle的java版本指定好。

执行 ./gradlew localDistro (注意jdk版本17)

编译完成后执行 导入项目 使用 idea open项目下的 build.gradle,等待编译结束(这里耗时会比较长)。中间失败的多执行几次就好。其余的想配置就配置一下gradle路径那些,不想配置就idea自己接管就好。

三、配置启动 elasticsearch

编译好之后,此时我们就来配置启动es。

我们需要创建一个启动配置,内容如下。

图中的vm参数需要详细讲解一下。

json 复制代码
-Des.path.home=/Users/levi/develop/source_code/es_debug/elasticsearch-8.1.0
-Des.path.conf=/Users/levi/develop/source_code/es_debug/elasticsearch-8.1.0/config
-Djava.security.policy=/Users/levi/develop/source_code/es_debug/elasticsearch-8.1.0/config/elasticsearch.policy
-Dlog4j2.disable.jmx=true

我们这里配置了四行,其中-Dlog4j2.disable.jmx=true这个是jmx的

上面三行比较重要,-Des.path.home这个指向的是你刚才下载的发行版的路径,

-Des.path.conf这个指向你发行版的配置文件目录,你的源码会读取这里的配置,所以你可以在这下面的配置文件修改一些你的东西。因为我们这就是个单点的启动,最好把那些权限都关掉,不然害的配证书。比如我的config下面的配置文件如下:

json 复制代码
cluster.name: my-application810
node.name: node-8101
network.host: 127.0.0.1
http.port: 9202 
xpack.security.enabled: false # 关闭https
xpack.security.transport.ssl.enabled: false # 关闭ssl

其余的jvm那些你也可以配置一下,源码启动就会按照那个jvm参数的内容去读取。

下面我们来说第三个配置-Djava.security.policy,es在启动的时候有很多jdk权限要开启,源码这里没有,我们需要自己创建一个新的.policy文件里面指定一下,也就是我的/Users/levi/develop/source_code/es_debug/elasticsearch-8.1.0/config/elasticsearch.policy这个发行版下面创建的。这个东西很麻烦,一开始我并不知道里面写啥,每次运行一次根据报错的信息一点一点的把权限加上去的。这里我给出我的一个内容。

json 复制代码
grant {
  permission org.elasticsearch.secure_sm.ThreadPermission "*";
  permission java.lang.RuntimePermission "*";
  permission java.lang.RuntimePermission "accessDeclaredMembers"; 
  permission java.lang.RuntimePermission "getenv.AWS_RETRY_MODE"; 
  permission org.elasticsearch.SpecialPermission "*"; 
  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 org.elasticsearch.ThreadPermission "modifyArbitraryThreadGroup";
  permission java.lang.management.ManagementPermission "monitor";
  permission java.util.PropertyPermission "es.distribution.flavor", "read";
  permission java.util.PropertyPermission "*", "read";
  permission java.lang.RuntimePermission "getProtectionDomain";
};

此时我们就配置完了jvm参数。此时就可以启动了。

四、启动遇到的问题

1、版本不一致

如果你下载的发行版和你的源码版本差异比较多,那就会报版本错误,此时你最好去下一个一致的版本。或者要是版本差异不大,可以直接在源码中修改版本,让他强行读取。org.elasticsearch.Version这个类里面的CURRENT和你的发行版保持一致即可,但是这样可能有兼容性问题,我建议还是下一个一致的版本比较到位。

2、Unknown codebases

这是一些权限问题,你可以根据报错的Unknown codebases内容到resources/org/elasticsearch/bootstrap/security.policy这个文件中把对应的grant部分注释了,也可以像我一样,直接全删了,不影响你的启动。因为他是一些内部的校验。

至此,我们要做的就都ok了,启动之后。通过浏览器访问一下。

没有问题。

3、高版本

其实我一开始是想编译8.16.1这个版本的,因为我日常用的就是这个版本,但是从8.3.0之后的版本启动流程改了很多,有些地方我没摸准,就启动失败了,后续如果编译好了,再补充高版本的。

相关推荐
RD_daoyi3 小时前
新手小白独立站运营实操手册:从0到1跑通流量-转化-留存闭环
搜索引擎
老纪的技术唠嗑局4 小时前
告别OpenClaw配置丢失——Mindkeeper内测版邀测
大数据·elasticsearch·搜索引擎
老陈头聊SEO4 小时前
高效整合长尾关键词以提升网站SEO排名的有效策略
其他·搜索引擎·seo优化
key_3_feng4 小时前
揭秘AI的“语言积木“:Token科普之旅
人工智能·搜索引擎·token
Elasticsearch4 小时前
使用 Elasticsearch + Jina embeddings 进行无监督文档聚类
elasticsearch
勇哥的编程江湖7 小时前
flinkcdc streaming 同步数据到es记录过程
大数据·elasticsearch·flink·flinkcdc
曾阿伦7 小时前
Elasticsearch 7.x 常用命令备忘录
大数据·elasticsearch·搜索引擎
斯特凡今天也很帅7 小时前
Elasticsearch数据库专栏(二)DSL语句总结(更新中)
大数据·elasticsearch·搜索引擎
要记得喝水7 小时前
适用于 Git Bash 的脚本,批量提交和推送多个仓库的修改
git·elasticsearch·bash
二十七剑8 小时前
Elasticsearch的索引问题
大数据·elasticsearch·搜索引擎