Mastodon サーバーで Elasticsearch が落ちたときに自動起動する
メモリ 2GB のなーさーばーで Mastodon と Elasticsearch を実行すると、メモリが不足しているのか定期的に Elasticsearch が落ちるので systemd の機能を使って再起動します。例のニュースとは特に関係ないです。
要約
- Mastodon 用に Elasticsearch を動かしていると、プロセスが落ちて全文検索ができなくなる現象が定期的に発生していた
- systemctl のログを見る限り、OOM Killer によって強制的に終了したと推測することができた
- 数日くらいおきに落ちることを把握していたので、落ちたときに systemd の機能で自動で再起動をすることで解決した
起きたこと・ログの確認
Mastodon 用に Elasticsearch を動かしていると、プロセスが落ちて全文検索ができなくなる現象が定期的に発生していました。
そこで systemctl status elasticsearch.service
を確認したところ、以下のようなログを確認することができました。
root@nagi-server:~# systemctl status elasticsearch.service
● elasticsearch.service - Elasticsearch
Loaded: loaded (/lib/systemd/system/elasticsearch.service; enabled; vendor preset: enabled)
Active: failed (Result: signal) since Thu 2023-09-28 10:59:36 JST; 1 weeks 6 days ago
Docs: https://www.elastic.co
Main PID: 723910 (code=killed, signal=KILL)
Sep 28 10:59:36 nagi-server systemd[1]: elasticsearch.service: Main process exited, code=killed, status=9/KILL
Sep 28 10:59:36 nagi-server systemd[1]: elasticsearch.service: Failed with result 'signal'.
Warning: journal has been rotated since unit was started, output may be incomplete.
特にエラーなどは確認できず、代わりに code=killed, status=9/KILL
という文字列を確認できます。ここから、おそらくメモリ不足で OOM Killer によってプロセスが強制終了されたと推測することができます。
解決方法
頭のいい人なら Elasticsearch のパフォーマンス改善をして、お金がある人ならメモリ増設をするんでしょうけど、なーは頭も悪くてお金も無いので Elasticsearch を自動で再起動させて解決します。
というのも、Systemd にはエラーや OOM Killer などで落ちたサービスを自動で再起動する機能があり、Service
セッションの Restart
という項目で設定することができます。
Elasticsearch をサービスとして動かすための設定ファイルはさっきのログから確認できるので、追記をして自動で再起動するように仕込みます。
--- a/elasticsearch.service
+++ b/elasticsearch.service
@@ -64,6 +64,8 @@ SuccessExitStatus=143
# Allow a slow startup before the systemd notifier module kicks in to extend the timeout
TimeoutStartSec=900
+Restart=always
+
[Install]
WantedBy=multi-user.target
まとめ
Mastodon サーバーで Elasticsearch を動かしたいのであればメモリ 4GB 以上積みましょう。