ElasticSearchを、Docker Compose でマルチノード クラスターとして起動する

# 前提
OS：ubuntu 22.04
dockerコマンド・docker composeコマンドは利用可能な状態

# 導入手順とトラブル対応

概ね以下のガイドをそのまま実行。バージョンは8.17.0
https://www.elastic.co/guide/en/elasticsearch/reference/current/docker.html#docker-compose-file

発生したトラブルと対応履歴は以下の通り。

#### **トラブル内容**
- **概要：Elasticsearch ノードの起動失敗**
   - `es01` ノードが初期設定のままでは起動できない
   - `es01` ノードの起動成功後、`es02` と `es03` のノードが起動失敗

---

##### **事象１：`es01`ノードの起動失敗**
   - 事象：
   以下の通り`es01`ノードの起動に失敗。合わせて`es02`,`es03`も起動失敗しているが、まずは最初のノードについての対応を試みる

```
$ docker compose up -d
WARN[0000] /mnt/NVMe01TB01/elasticsearch/docker-compose.yml: the attribute `version` is obsolete, it will be ignored, please remove it to avoid potential confusion 
[+] Running 26/26
 ✔ setup Pulled                                                                                                               41.9s 
 ✔ es02 Pulled                                                                                                                41.9s 
   ✔ e7894aa63b6b Pull complete                                                                                                3.0s 
   ✔ d8ebfd0673f3 Pull complete                                                                                                3.3s 
   ✔ b844b5486b14 Pull complete                                                                                                3.4s 
   ✔ 4ca545ee6d5d Pull complete                                                                                               42.0s 
   ✔ e32dac13ab73 Pull complete                                                                                               35.6s 
   ✔ dd86513089d5 Pull complete                                                                                               35.6s 
   ✔ 0fa5101f1738 Pull complete                                                                                               35.7s 
   ✔ 6552e993d0fe Pull complete                                                                                               35.7s 
   ✔ 8140cc9eb823 Pull complete                                                                                               35.7s 
   ✔ 27354fdb6987 Pull complete                                                                                               35.7s 
 ✔ es01 Pulled                                                                                                                41.9s 
 ✔ es03 Pulled                                                                                                                41.9s 
 ✔ kibana Pulled                                                                                                              48.2s 
   ✔ e6e9b664c8c6 Pull complete                                                                                                4.8s 
   ✔ ecc21f6b622a Pull complete                                                                                               40.6s 
   ✔ f2b27481e8b1 Pull complete                                                                                               40.7s 
   ✔ adfa6d0c6437 Pull complete                                                                                               40.8s 
   ✔ ed2ac883e03f Pull complete                                                                                               40.9s 
   ✔ 910aa07d8c20 Pull complete                                                                                               40.9s 
   ✔ 491c26394402 Pull complete                                                                                               41.0s 
   ✔ 8bb0ec9614e7 Pull complete                                                                                               41.0s 
   ✔ 69cbf59608d0 Pull complete                                                                                               41.0s 
   ✔ abab7bfb2278 Pull complete                                                                                               41.0s 
   ✔ bd1bf47182e1 Pull complete                                                                                               41.1s 
[+] Running 11/11
 ✔ Network elasticsearch_default      Created                                                                                  0.1s 
 ✔ Volume "elasticsearch_certs"       Created                                                                                  0.0s 
 ✔ Volume "elasticsearch_esdata03"    Created                                                                                  0.0s 
 ✔ Volume "elasticsearch_kibanadata"  Created                                                                                  0.0s 
 ✔ Volume "elasticsearch_esdata01"    Created                                                                                  0.0s 
 ✔ Volume "elasticsearch_esdata02"    Created                                                                                  0.0s 
 ✔ Container elasticsearch-setup-1    Healthy                                                                                  4.8s 
 ✘ Container elasticsearch-es01-1     Error                                                                                   29.8s 
 ✘ Container elasticsearch-es02-1     Error                                                                                   30.2s 
 ✘ Container elasticsearch-es03-1     Error                                                                                   31.2s 
 ✔ Container elasticsearch-kibana-1   Created                                                                                  0.0s 
dependency failed to start: container elasticsearch-es01-1 exited (78)
```
  - 原因：
   Elasticsearch の推奨設定である `vm.max_map_count=262144` が未設定で、初期値 `65530` のままだった。
```$ sysctl vm.max_map_count
vm.max_map_count = 65530
```
  - 対処：とりあえず以下で対応
  （設定を永続化するか、elasticsearchクラスタ起動の都度設定するか、は別途考える）
```
$ sudo sysctl -w vm.max_map_count=262144
vm.max_map_count = 262144
```
---

##### **事象２：`es02` と `es03` ノードの起動失敗**

   - 事象：
   以下の通り、`es-01`コンテナが起動するも、後続の`es02`,`es03`が引き続き起動しない。
   ただしエラーコードは`es01`の頃と変わって78（構成エラーや設定ミス などで起動に失敗）ではなく137（Out of Memory: OOM）となっている。

```
$ docker compose up -d
WARN[0000] /mnt/NVMe01TB01/elasticsearch/docker-compose.yml: the attribute `version` is obsolete, it will be ignored, please remove it to avoid potential confusion 
[+] Running 6/6
 ✔ Network elasticsearch_default     Created                                                                                   0.1s 
 ✔ Container elasticsearch-setup-1   Healthy                                                                                   2.4s 
 ✔ Container elasticsearch-es01-1    Healthy                                                                                  33.6s 
 ✘ Container elasticsearch-es02-1    Error                                                                                    25.1s 
 ✘ Container elasticsearch-es03-1    Error                                                                                    25.1s 
 ✔ Container elasticsearch-kibana-1  Created                                                                                   0.0s 
dependency failed to start: container elasticsearch-es02-1 exited (137)
```
   - 原因：
   Docker の `mem_limit` が 1GB（1073741824バイト）に設定されており、Elasticsearch の推奨要件である 2GB 以上に満たなかったため、`es02` と `es03` が起動に失敗。
   具体的にはガイドの中で「これを使え」と指定されている[.env](https://github.com/elastic/elasticsearch/blob/8.17/docs/reference/setup/install/docker/.env)の中で、環境変数として指定されているMEM_LIMITの値が1GB（1073741824バイト）に設定されていた。どういうことなの…

- **対応**
   - `.env` ファイル内の `MEM_LIMIT` を 1GB（1073741824）から **2GB（2147483648）** に増加：
```
# Increase or decrease based on the available host memory (in bytes)
# MEM_LIMIT=1073741824
MEM_LIMIT=2147483648
```
---

##### **対処完了後の起動**
   - 修正後の設定を適用するため、Docker Compose を再起動
     ```bash
     docker compose down
     docker compose up -d
     ```
- **全ノードの正常起動確認**
   - すべての Elasticsearch ノード（`es01`, `es02`, `es03`）および Kibana が正常に起動。
```
$ docker compose down
WARN[0000] /mnt/NVMe01TB01/elasticsearch/docker-compose.yml: the attribute `version` is obsolete, it will be ignored, please remove it to avoid potential confusion 
[+] Running 6/6
 ✔ Container elasticsearch-kibana-1  Removed                                                                                                                                                                                                                          0.0s 
 ✔ Container elasticsearch-es03-1    Removed                                                                                                                                                                                                                          0.0s 
 ✔ Container elasticsearch-es02-1    Removed                                                                                                                                                                                                                          0.0s 
 ✔ Container elasticsearch-es01-1    Removed                                                                                                                                                                                                                         10.4s 
 ✔ Container elasticsearch-setup-1   Removed                                                                                                                                                                                                                          0.4s 
 ✔ Network elasticsearch_default     Removed                                                                                                                                                                                                                          0.2s 

$ docker compose up -d
WARN[0000] /mnt/NVMe01TB01/elasticsearch/docker-compose.yml: the attribute `version` is obsolete, it will be ignored, please remove it to avoid potential confusion 
[+] Running 6/6
 ✔ Network elasticsearch_default     Created                                                                                                                                                                                                                          0.1s 
 ✔ Container elasticsearch-setup-1   Healthy                                                                                                                                                                                                                          2.4s 
 ✔ Container elasticsearch-es01-1    Healthy                                                                                                                                                                                                                         33.7s 
 ✔ Container elasticsearch-es02-1    Healthy                                                                                                                                                                                                                         34.2s 
 ✔ Container elasticsearch-es03-1    Healthy                                                                                                                                                                                                                         35.2s 
 ✔ Container elasticsearch-kibana-1  Started        
 ```

# 初期ログイン
`http://localhost:5601` にアクセスしてみる。
`.env`ファイルの中で、elasticユーザのパスワードを「elastic」として設定したので、そのように入力してみる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179750/4ec56ed0-07fb-3e30-5755-c6693c7ae33a.png)

ログインできた。とりあえず管理画面を見せてほしいので「Explore on my own」を選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179750/ced55d48-69cc-7e44-20e5-418016039484.png)

なるほどこんな感じのトップ画面になるのね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179750/727a345a-c811-3d1f-fa80-52985bc6658a.png)

ここからデータを放り込んでみたりベクトルストア化してみたり、色々やってみようと思う。
以上。