Elasticsearch 7.0から、OpenJDKがバンドルされるようになっていたという話

# TL;DR

* Elasticsearchは、7.0からOpenJDKをバンドルするようになっている
* バンドルされているOpenJDKは、AdoptOpenJDKの模様
* デフォルトでは、バンドルされているOpenJDKで起動する
* 変更したい場合は、`JAVA_HOME`を設定する

ちなみに、**LogstashにはOpenJDKがバンドルされていません**。


# ドキュメントとリリースノート

CentOSに`yum`でElasticsearchをインストールした時に、インストールしたパッケージ内部で持っているJDKで起動しているのに、ふと気づきました。

ドキュメントを読んでみると、どうやらOpenJDKをバンドルしているようです。

[Install Elasticsearch with RPM](https://www.elastic.co/guide/en/elasticsearch/reference/7.5/rpm.html)

> Elasticsearch includes a bundled version of OpenJDK from the JDK maintainers (GPLv2+CE). To use your own version of Java, see the JVM version requirements

7.0からみたいですね。

[Release Notes/ Elasticsearch version 7.0.0](https://www.elastic.co/guide/en/elasticsearch/reference/7.5/release-notes-7.0.0.html)

> Bundle java in distributions

Pull Requestを見ると、セットアップの手間、古いJDKが入っている環境の場合に引き起こされる問題を嫌ったようですね。

[Bundle java in distributions](https://github.com/elastic/elasticsearch/pull/38013)

自分で用意したJDKを使用する場合は、環境変数`JAVA_HOME`に指定すればよいみたいです。

> Set a custom Java path to be used.

[Configuring Elasticsearch](https://www.elastic.co/guide/en/elasticsearch/reference/7.5/rpm.html#rpm-configuring)

> The bundled Java Development Kit used to run Elasticsearch. Can be overriden by setting the JAVA_HOME environment variable in /etc/sysconfig/elasticsearch

[Directory layout of RPM](https://www.elastic.co/guide/en/elasticsearch/reference/7.5/rpm.html#rpm-layout)


# 確認してみる

実際に、確認してみましょう。

今回の環境は、こちら。

```shell
$ cat /etc/redhat-release 
CentOS Linux release 7.6.1810 (Core)
```

# Elasticsearchをインストールする

まずは、ドキュメントに沿ってElasticsearchをインストールしてみます。

[Install Elasticsearch with RPM](https://www.elastic.co/guide/en/elasticsearch/reference/7.5/rpm.html)

```shell
$ sudo rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch
$ sudo vim /etc/yum.repos.d/elasticsearch.repo
$ sudo yum install --enablerepo=elasticsearch elasticsearch
```

作成した`/etc/yum.repos.d/elasticsearch.repo`の中身は、こちら。

```shell
[elasticsearch]
name=Elasticsearch repository for 7.x packages
baseurl=https://artifacts.elastic.co/packages/7.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=0
autorefresh=1
type=rpm-md
```

Elasticsearchを起動。

```shell
$ sudo systemctl start elasticsearch
```

ここで、Elasticsearchの起動に使われているJavaを見てみます。

```shell
$ ps -ef | grep java | grep -v grep
elastic+ 24025     1 39 05:49 ?        00:00:23 /usr/share/elasticsearch/jdk/bin/java -Des.networkaddress.cache.ttl=60 -Des.networkaddress.cache.negative.ttl=10 -XX:+AlwaysPreTouch -Xss1m -Djava.awt.headless=true -Dfile.encoding=UTF-8 -Djna.nosys=true -XX:-OmitStackTraceInFastThrow -Dio.netty.noUnsafe=true -Dio.netty.noKeySetOptimization=true -Dio.netty.recycler.maxCapacityPerThread=0 -Dio.netty.allocator.numDirectArenas=0 -Dlog4j.shutdownHookEnabled=false -Dlog4j2.disable.jmx=true -Djava.locale.providers=COMPAT -Xms1g -Xmx1g -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSInitiatingOccupancyOnly -Djava.io.tmpdir=/tmp/elasticsearch-5336255756681085720 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/var/lib/elasticsearch -XX:ErrorFile=/var/log/elasticsearch/hs_err_pid%p.log -Xlog:gc*,gc+age=trace,safepoint:file=/var/log/elasticsearch/gc.log:utctime,pid,tags:filecount=32,filesize=64m -XX:MaxDirectMemorySize=536870912 -Des.path.home=/usr/share/elasticsearch -Des.path.conf=/etc/elasticsearch -Des.distribution.flavor=default -Des.distribution.type=rpm -Des.bundled_jdk=true -cp /usr/share/elasticsearch/lib/* org.elasticsearch.bootstrap.Elasticsearch -p /var/run/elasticsearch/elasticsearch.pid --quiet
```

ElasticsearchにバンドルされているJavaで動作しています。

バンドルされているのは、AdoptOpenJDKみたいですね。

```shell
$ /usr/share/elasticsearch/jdk/bin/java --version
openjdk 13.0.1 2019-10-15
OpenJDK Runtime Environment AdoptOpenJDK (build 13.0.1+9)
OpenJDK 64-Bit Server VM AdoptOpenJDK (build 13.0.1+9, mixed mode, sharing)
```

しかも、13…。

サポートされている範囲ではありますが、LTSなOpenJDKを使いたい人もいるでしょう。

[Support Matrix / Product and JVM](https://www.elastic.co/jp/support/matrix#matrix_jvm)


# Elasticsearchが使うJavaを切り替える

ここで、バンドルされているAdoptOpenJDKではなく、自前でインストールしたOpenJDKに切り替えてみます。

自分でOpenJDKをインストール。

```shell
$ sudo yum install java-11-openjdk-devel
$ java --version
openjdk 11.0.5 2019-10-15 LTS
OpenJDK Runtime Environment 18.9 (build 11.0.5+10-LTS)
OpenJDK 64-Bit Server VM 18.9 (build 11.0.5+10-LTS, mixed mode, sharing)
```

このOpenJDKは、このままではElasticsearchに使ってもらえないので、設定を変更します。

こちらを見て、`JAVA_HOME`を`/usr/lib/jvm/java-11-openjdk`で指定することにしましょう。

[Directory layout of RPM](https://www.elastic.co/guide/en/elasticsearch/reference/7.5/rpm.html#rpm-layout)

```shell
$ ll /usr/lib/jvm
total 0
lrwxrwxrwx. 1 root root 26 Dec 13 06:00 java -> /etc/alternatives/java_sdk
lrwxrwxrwx. 1 root root 29 Dec 13 06:00 java-11 -> /etc/alternatives/java_sdk_11
lrwxrwxrwx. 1 root root 37 Dec 13 06:00 java-11-openjdk -> /etc/alternatives/java_sdk_11_openjdk
drwxr-xr-x. 8 root root 97 Dec 13 06:00 java-11-openjdk-11.0.5.10-0.el7_7.x86_64
lrwxrwxrwx. 1 root root 34 Dec 13 06:00 java-openjdk -> /etc/alternatives/java_sdk_openjdk
lrwxrwxrwx. 1 root root 21 Dec 13 06:00 jre -> /etc/alternatives/jre
lrwxrwxrwx. 1 root root 24 Dec 13 06:00 jre-11 -> /etc/alternatives/jre_11
lrwxrwxrwx. 1 root root 32 Dec 13 06:00 jre-11-openjdk -> /etc/alternatives/jre_11_openjdk
lrwxrwxrwx. 1 root root 40 Dec 13 06:00 jre-11-openjdk-11.0.5.10-0.el7_7.x86_64 -> java-11-openjdk-11.0.5.10-0.el7_7.x86_64
lrwxrwxrwx. 1 root root 29 Dec 13 06:00 jre-openjdk -> /etc/alternatives/jre_openjdk
```

`/etc/sysconfig/elasticsearch`を設定。

```shell
# Elasticsearch Java path
#JAVA_HOME=
```

`JAVA_HOME`に、使いたいJavaを設定します。

```shell
# Elasticsearch Java path
JAVA_HOME=/usr/lib/jvm/java-11-openjdk
```

Elasticsearchを再起動。

```shell
$ sudo systemctl restart elasticsearch
```

これで、自分でインストールしたOpenJDKが使われるようになりました。

```shell
$ ps -ef | grep java | grep -v grep
elastic+ 24695     1 83 06:08 ?        00:00:23 /usr/lib/jvm/java-11-openjdk/bin/java -Des.networkaddress.cache.ttl=60 -Des.networkaddress.cache.negative.ttl=10 -XX:+AlwaysPreTouch -Xss1m -Djava.awt.headless=true -Dfile.encoding=UTF-8 -Djna.nosys=true -XX:-OmitStackTraceInFastThrow -Dio.netty.noUnsafe=true -Dio.netty.noKeySetOptimization=true -Dio.netty.recycler.maxCapacityPerThread=0 -Dio.netty.allocator.numDirectArenas=0 -Dlog4j.shutdownHookEnabled=false -Dlog4j2.disable.jmx=true -Djava.locale.providers=COMPAT -Xms1g -Xmx1g -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSInitiatingOccupancyOnly -Djava.io.tmpdir=/tmp/elasticsearch-586651067490676884 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/var/lib/elasticsearch -XX:ErrorFile=/var/log/elasticsearch/hs_err_pid%p.log -Xlog:gc*,gc+age=trace,safepoint:file=/var/log/elasticsearch/gc.log:utctime,pid,tags:filecount=32,filesize=64m -XX:MaxDirectMemorySize=536870912 -Des.path.home=/usr/share/elasticsearch -Des.path.conf=/etc/elasticsearch -Des.distribution.flavor=default -Des.distribution.type=rpm -Des.bundled_jdk=true -cp /usr/share/elasticsearch/lib/* org.elasticsearch.bootstrap.Elasticsearch -p /var/run/elasticsearch/elasticsearch.pid --quiet
```