IDEA调试Elasticsearch源码


一、Mac上安装es


最近在调研Elasticsearch(后续简称es)的translog,在Mac上安装了es单机版和集群版本,这里推荐使用docker搭建,简单叙述下过程:
安装Docker环境
首先需要在Mac上安装Docker运行环境,这里推荐直接安装 docker-for-mac,安装完成并启动成功后Mac右上方会显示running

安装完docker-for-mac后,建议修改镜像源,默认镜像源拉取镜像太慢了。修改方式如下:依次点击Preferences -> Docker Engine

安装es单机版

  1. 拉取镜像,docker pull docker.elastic.co/elasticsearch/elasticsearch:7.12.0
  2. 启动容器,docker run –name es01-test -p 9200:9200 -p 9300:9300 -e “discovery.type=single-node” docker.elastic.co/elasticsearch/elasticsearch:7.12.0
  3. 当容器退出后,下次需要启动该容器,可以执行 docker ps -a 显示当前所有容器(docker ps显示运行时容器,-a会显示包括非运行在内所有容器),找到对应的container id名称,然后 docker start 891f7a68c705
    docker-ps

安装es集群版本

  1. 创建docker-compose.yml
    version: '2.2'
    services:
      es01:
        image: docker.elastic.co/elasticsearch/elasticsearch:7.12.0
        container_name: es01
        environment:
          - node.name=es01
          - cluster.name=es-docker-cluster
          - discovery.seed_hosts=es02,es03
          - cluster.initial_master_nodes=es01,es02,es03
          - bootstrap.memory_lock=true
          - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
        ulimits:
          memlock:
            soft: -1
            hard: -1
        volumes:
          - data01:/usr/share/elasticsearch/data
        ports:
          - 9200:9200
        networks:
          - elastic
      es02:
        image: docker.elastic.co/elasticsearch/elasticsearch:7.12.0
        container_name: es02
        environment:
          - node.name=es02
          - cluster.name=es-docker-cluster
          - discovery.seed_hosts=es01,es03
          - cluster.initial_master_nodes=es01,es02,es03
          - bootstrap.memory_lock=true
          - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
        ulimits:
          memlock:
            soft: -1
            hard: -1
        volumes:
          - data02:/usr/share/elasticsearch/data
        networks:
          - elastic
      es03:
        image: docker.elastic.co/elasticsearch/elasticsearch:7.12.0
        container_name: es03
        environment:
          - node.name=es03
          - cluster.name=es-docker-cluster
          - discovery.seed_hosts=es01,es02
          - cluster.initial_master_nodes=es01,es02,es03
          - bootstrap.memory_lock=true
          - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
        ulimits:
          memlock:
            soft: -1
            hard: -1
        volumes:
          - data03:/usr/share/elasticsearch/data
        networks:
          - elastic
    
    volumes:
      data01:
        driver: local
      data02:
        driver: local
      data03:
        driver: local
    
    networks:
      elastic:
        driver: bridge
  2. 在同目录下执行 docker-compose up 创建集群
  3. 执行 curl -X GET “localhost:9200/_cat/nodes?v=true&pretty” 确认集群是否启动

二、IDEA编译es源码

环境准备:

  • JDK 16:版本要求可以参考CONTRIBUTING.md,es对jdk版本要求较高,建议直接使用最新版本,下载完成后,建议配置JAVA_HOME
  • IDEA 2021.1:低版本的IDEA貌似不太支持高版本的JDK,根据自己情况选择。
  • ElasticSearch 7.8.1代码分支:刚开始编译master分支代码和7.12.0一直有问题,后改成7.8.1版本
  • ElasticSearch 7.8.1服务端:建议下载服务端完整包,后续启动时候一些配置路径可以直接指向完整安装包中的目录
  • Gradle 7.0:下载完成后,建议配置GRADLE_HOME和PATH,最好修改gradle镜像源为阿里云,在 ~/.gradle目录创建 init.gradle 文件

github pull代码
es代码挺大的,第一次拉取很慢,后面从google应用商店下载了github加速插件,拉代码速度提升很明显。安装完成后,会有一个加速按钮

编译es代码

  1. 切换分支 git checkout v7.8.1
  2. 两种方式导入IDEA:我是使用第二种方式导入的,第一种一直报错。
    • cd到代码根目录,执行./gradlew idea,会下载6.5版本的gradle来编译源代码(或者执行gradle idea,直接使用之前环境准备配置的es版本),生成 IML, IPR, IWS 3个文件,然后导入 elasticsearch.ipr。
    • IDEA直接 File -> Open 打开es根目录的 build.gradle,然后等待编译源码

运行es代码
es启动类位于 :elasticsearch\server\src\main\java\org\elasticsearch\bootstrap\Elasticsearch.java

  1. ERROR: the system property [es.path.conf] must be set
    添加VM options: -Des.path.conf=/Users/dianping/Downloads/elasticsearch-7.8.1/config,这里可以直接指向成之前下载的es 7.8.1的config目录
  2. Exception in thread “main” java.lang.IllegalStateException: path.home is not configured
    添加VM options: -Des.path.home=/Users/dianping/Downloads/elasticsearch-7.8.1
  3. Exception in thread “main” java.lang.NullPointerException: Cannot invoke “String.hashCode()” because ““ is null
    直接注释**InternalSettingsPreparer.checkSettingsForTerminalDeprecation()**for循环代码,不影响启动
  4. ERROR Could not register mbeans java.security.AccessControlException: access denied (“javax.management.MBeanTrustPermission” “register”)
    添加VM options:-Dlog4j2.disable.jmx=true 禁用jmx
  5. java.security.AccessControlException: access denied (“java.lang.RuntimePermission” “createClassLoader”)
    创建java.policy文件,然后 -Djava.security.policy=/Users/dianping/Downloads/elasticsearch-7.8.1/config/java.policy
    grant {
    	permission java.lang.RuntimePermission "createClassLoader";
    };

解决上述问题后,es应该就能在IDEA中启动了,后续调试的话即可debug模式启动 Elasticsearch.java main函数


文章作者: 叶明
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 叶明 !
评论
 上一篇
MySQL Binlog性能优化 MySQL Binlog性能优化
最近一段时间,一到业务午高峰,外卖集群的一些订阅机器就会出现Binlog消费大量延时。出现Binlog延时的原因主要是:一般11点开始,外卖业务进入中午午高峰,数据库的Binlog QPS会逐渐增加,一旦订阅服务出现性能瓶颈,处理Binlog的能力跟不上Binlog生成的速度,就会导致消费Binlog出现延时,并且延时时间会越来越长。业务在BCP上配置的核对规则一般最小是60s,一旦Binlog延时时间超过60s,那么规则就会大量误告。
2022-04-26
下一篇 
基于本地日志的可靠消息型事务 基于本地日志的可靠消息型事务
业务经常会使用消息中间件进行上下游解耦或者异步削峰填谷的目的,通常处理流程是如下:操作本地数据库,完成自身业务逻辑
2021-04-15
  目录