一、Mac上安装es
最近在调研Elasticsearch(后续简称es)的translog,在Mac上安装了es单机版和集群版本,这里推荐使用docker搭建,简单叙述下过程:
安装Docker环境
首先需要在Mac上安装Docker运行环境,这里推荐直接安装 docker-for-mac,安装完成并启动成功后Mac右上方会显示running
安装完docker-for-mac后,建议修改镜像源,默认镜像源拉取镜像太慢了。修改方式如下:依次点击Preferences -> Docker Engine
- 拉取镜像,docker pull docker.elastic.co/elasticsearch/elasticsearch:7.12.0
- 启动容器,docker run –name es01-test -p 9200:9200 -p 9300:9300 -e “discovery.type=single-node” docker.elastic.co/elasticsearch/elasticsearch:7.12.0
- 当容器退出后,下次需要启动该容器,可以执行 docker ps -a 显示当前所有容器(docker ps显示运行时容器,-a会显示包括非运行在内所有容器),找到对应的container id名称,然后 docker start 891f7a68c705
- 创建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
- 在同目录下执行 docker-compose up 创建集群
- 执行 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代码
- 切换分支 git checkout v7.8.1
- 两种方式导入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
- 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目录 - Exception in thread “main” java.lang.IllegalStateException: path.home is not configured
添加VM options: -Des.path.home=/Users/dianping/Downloads/elasticsearch-7.8.1 - Exception in thread “main” java.lang.NullPointerException: Cannot invoke “String.hashCode()” because “
“ is null
直接注释**InternalSettingsPreparer.checkSettingsForTerminalDeprecation()**for循环代码,不影响启动 - ERROR Could not register mbeans java.security.AccessControlException: access denied (“javax.management.MBeanTrustPermission” “register”)
添加VM options:-Dlog4j2.disable.jmx=true 禁用jmx - java.security.AccessControlException: access denied (“java.lang.RuntimePermission” “createClassLoader”)
创建java.policy文件,然后 -Djava.security.policy=/Users/dianping/Downloads/elasticsearch-7.8.1/config/java.policygrant { permission java.lang.RuntimePermission "createClassLoader"; };
解决上述问题后,es应该就能在IDEA中启动了,后续调试的话即可debug模式启动 Elasticsearch.java main函数