検証環境
- Ubuntu 18.04
背景
Ubuntuサーバー上にElasticsearchを構築しようと思った。
が、起動時に以下のようなエラー
[2019-04-10T15:59:19,986][ERROR][o.e.b.Bootstrap ] [es01] node validation exception [1] bootstrap checks failed [1]: memory locking requested for elasticsearch process but memory is not locked
完全に理解した、の顔とともにエラーメッセージでググる。するとちゃんと解決策が載ってた。
要はカーネルパラメータを設定すればいいとのこと 早速/etc/security/limits.confに以下を追記して
elasticsearch hard memlock unlimited elasticsearch soft memlock unlimited
で、Elasticsearchを再度起動。。。しても同じエラーになる。
原因
以下のサイトの解説が詳しい
PAM認証を介さないようなdaemon系プログラムの制限には/etc/security/limits.confは使えない
どういうことかというと、 /etc/pam.d/sudo とか /etc/pam.d/sshd で
session required pam_limits.so
があることで、普段はlimits.confが適用される、と。
しかし、systemdでは当然/etc/pam.d/sudo なんぞ効かないし、共通の/etc/pam.d/common はデフォルトではpam_limits.soの設定ないためにsystemdで起動したプロセスには無効 ということ
解決策
設定は/etc/security/limits.confに書かずにsystemd側に書くのがベストプラクティスぽい
例えばelasticsearchのsystemdの設定ファイルは /usr/lib/systemd/system/elasticsearch.service である。
が、これを直接いじるのはリスキー、、、で実はsystemdにはデフォルトの設定を追記する機能がある。
systemctl edit elasticsearch
すると編集画面になるので、以下を追記
[Service] LimitMEMLOCK=infinity
(余談だが、実際には/etc/systemd/system/elasticsearch.service.d/override.confというファイルを編集している。)
でリロードで反映
systemctl daemon-reload
実はこれElasticsearchの公式ドキュメントにちゃんと書いてあった。ちゃんと読もうな、、、