問題の概要ホストOSが大規模なデータベース負荷に合わせて調整されていない場合、Elasticsearchはブートストラップフェーズ中にクラッシュすることがよくあります。ノードが起動しない場合は、docker logsを使用するか、/var/log/elasticsearch/内のファイルを末尾から確認(tail)してログをチェックしてください。おそらく、vm.max_map_countが65530(ほとんどのLinuxディストリビューションのデフォルト値)に設定されているという致命的なエラーが表示されます。
max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
これは単なる推奨事項ではなく、運用環境における必須要件です。Elasticsearchは、デフォルトでインデックスの保存にmmapfsディレクトリを使用します。Linux標準の制限値である65,530個のメモリマップ領域は、Luceneがセグメントを効果的にマッピングするにはあまりに小さすぎ、結果としてメモリ不足例外や起動の失敗を引き起こします。
デバッグと確認方法変更を加える前に、現在のカーネル設定を確認しましょう。ターミナルを開き、以下のコマンドを実行します。
cat /proc/sys/vm/max_map_count
または、sysctlツールを使用して値を照会することもできます。
sysctl vm.max_map_count
If the terminal returns 65530, you have found the bottleneck. You need to bump this number up to at least 262,144 to satisfy the Elasticsearch bootstrap checks.
解決策現在のセッションに対して即座に修正を適用する方法と、サーバーの再起動後も有効になるように永続化する方法があります。
1. 一時的な修正(即時反映)サーバーを再起動せずにクラスターをすぐにオンラインに戻すには、実行中のカーネルパラメータを更新します。これにはrootまたはsudo権限が必要です。
sudo sysctl -w vm.max_map_count=262144
この変更は、Enterキーを押した瞬間に反映されます。これでElasticsearchサービスまたはDockerコンテナを再起動でき、ブートストラップチェックをクリアできるはずです。
2. 恒久的な修正(再起動後も維持)上記のコマンドはシステムの揮発性メモリにのみ保持されます。サーバーが再起動すると、制限は65530に戻ってしまいます。変更を永続させるには、sysctl.confファイルを編集する必要があります。
- Nanoなどのテキストエディタで設定ファイルを開きます。
sudo nano /etc/sysctl.conf- ファイルの最後に以下の行を追加します。vm.max_map_count=262144- 保存して終了します(Nanoの場合、Ctrl+O、Enter、Ctrl+Xの順に押します)。- 設定をすぐに適用するためにリロードします。``` sudo sysctl -p
## 特殊なケース: DockerとWSL2### Dockerユーザーの場合`Dockerfile`や`docker-compose.yml`の中で`vm.max_map_count`を設定しようとするのは、よくある間違いです。これは**カーネルレベルのパラメータ**であるため、コンテナ側から変更することはできません。Dockerエンジンが動作している実際のLinuxサーバーや仮想マシンなどの**ホストマシン**上で修正を適用する必要があります。ホストが更新されれば、その上で動作するすべてのコンテナに自動的に新しい制限が適用されます。
### Windowsユーザー (WSL2) の場合WSL2を介してWindows上でDocker Desktopを実行している場合、ホストは実際には隠れたユーティリティVMです。そこで制限を設定する必要があります。
- PowerShellを開きます。- WSL2ターミナルにアクセスします: `wsl -d docker-desktop`- パラメータを設定します: `sysctl -w vm.max_map_count=262144`- Windowsでこれを永続化するには、ユーザープロファイルフォルダ(例: `C:\Users\Admin\.wslconfig`)に`.wslconfig`ファイルを作成または編集し、以下の行を含めます。```
[wsl2]
kernelCommandLine = "vm.max_map_count=262144"
最終確認サービスを再起動する前に、システムに新しい値が登録されていることを再確認してください。
sysctl vm.max_map_count
262144が返されたら、サービスを起動しましょう。
# Docker Composeユーザーの場合
docker-compose up -d
# Systemdユーザーの場合
sudo systemctl restart elasticsearch

