ここでは、Debian / UbuntuでMastodonを実行しているという前提で説明します。
- 最新版をインストールする
- 複数のインスタンスを立ち上げる
- 環境を整備する
最新版をインストールする
基本的にapt install redis
だけでイケるんですが、最新版がインストールされません。
今日もUbuntu 19.04でやってみましたが、5.0.3です。5.0.5を入れたいのに……。
面倒なので、自分でビルドして入れちゃいましょう。 C言語のソースコードをmakeするだけです。
wget -O - http://download.redis.io/releases/redis-5.0.5.tar.gz | tar xvzf - cd redis-5.0.5 make
最新版をmakeしたら、testします。tclが必要なので入れておきます。
sudo apt install tcl
で、テスト。
make test
多分通るでしょう。確認できたらインストールします。
sudo make install
設定ユーティリティ等も付属していますが、今回は使いません。 aptと同じものを流用したいので、そちらをいれちゃいます(先に入れてある場合はここでのインストールは不要です)
sudo apt install redis
aptで入れたものは/usr/bin/redis-server
、自分でビルドした奴は/usr/local/bin/redis-server
です。
複数のインスタンスを立ち上げる
Mastodonでは、再起動しても残っていて欲しいデータを保存するredisと、純粋にキャッシュが目的で消えてしまっても構わない内容を保存するredisに分割するというチューニングが可能です。また、同一サーバでredisを使う他のサービスを立ち上げることもあるでしょう。(後者はnamespaceで対処する方法もあります)
Debian系では、複数のインスタンスをセットアップし易いように、テンプレート化されたサービスファイルが提供されているので、これを利用します。
既存のものを止める
今回は消えてもらいます……。
sudo systemctl stop redis sudo systemctl disable redis
redisのパスを直す
/lib/systemd/system/redis-server@.service
にテンプレート化されたサービスファイルがあります。編集します。
sudoedit /lib/systemd/system/redis-server@.service
直すのはココ。さっきビルドして入れた方を起動するように変えちゃう。
# ExecStart=/usr/bin/redis-server /etc/redis/redis-%i.conf ExecStart=/usr/local/bin/redis-server /etc/redis/redis-%i.conf
redisのconfを必要なだけ増やす
さっきのサービスファイルにコメントで手順が書いてあるんですが、ここでも説明しておきます。
/etc/redis/redis.conf
を、コピーして増やします。
ここでは、Mastodonの永続化用にredis-mastodon.conf
、キャッシュ用にredis-mastodon-cache.conf
を作ることにしましょう。ここで決めたmastodon
とmastodon-cache
の名前をあちこちで使います。
sudo cp -p /etc/redis/redis.conf /etc/redis/redis-mastodon.conf sudo cp -p /etc/redis/redis.conf /etc/redis/redis-mastodon-cache.conf
テンプレートで名前の付け方が決まっているので、それに合わせて必要な項目を設定しましょう。
redis-mastodon.confの方は、
port 6379 pidfile /var/run/redis-mastodon/redis-server.pid logfile /var/log/redis/redis-server-mastodon.log dbfilename dump-mastodon.rdb
redis-mastodon-cache.confの方は、
port 6380 pidfile /var/run/redis-mastodon-cache/redis-server.pid logfile /var/log/redis/redis-server-mastodon-cache.log dbfilename dump-mastodon-cache.rdb save ""
って感じかな。portが重ならないようにするのは基本。
キャッシュ用はsaveを空にして永続化しない運用なので、dbfilenameの設定は要らないのですが、何かの折に設定変更した場合などに重なると危ないので、念のため設定しておきます。
socket接続する場合はunixsocket /var/run/redis-mastodon/redis-server.sock
なども設定してください。
サービスを起動する
sudo systemctl start redis-server@mastodon.service sudo systemctl start redis-server@mastodon-cache.service
エラーが起きる場合は、まずログを確認してみてください。
ファイルのオーナーがredisになっていない(パーミッション)、ファイルが存在しない(名前が間違っている)など、必要な情報が得られるハズです。
サービスを有効にする
起動を確認したら、再起動しても常時立ち上がるよう有効化します。
sudo systemctl enable redis-server@mastodon.service sudo systemctl enable redis-server@mastodon-cache.service
環境を整備する
ところで、ログをみると、警告が3つ出ています。
- WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
- WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
- WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.
Redisの実行に適した設定をせよ、とのことですので、警告メッセージに従ってシステムの設定を変更します。
sysctlの設定
/etc/sysctl.d/redis.conf
を作成して、必要な設定を記述します。
net.core.somaxconn=511 vm.overcommit_memory=1
rc.localの設定
/etc/rc.local
を作成して、必要な設定を記述します。すでにある場合は追記してください。
#!/bin/sh if test -f /sys/kernel/mm/transparent_hugepage/enabled; then echo never > /sys/kernel/mm/transparent_hugepage/enabled fi
実行できるようにsudo chmod u+x /etc/rc.local
しておきます。
rc.localの実行を待つようにサービスファイルを書き換え
/lib/systemd/system/redis-server@.service
を書き換えます。
#After=network.target After=network.target rc-local.service
rebootして、ログを確認する
最後に再起動し、警告がなくなっていればOKです。
Mastodonの設定
.env.production
に、キャッシュ用のRedisの設定を追加します。
REDIS_HOST=localhost REDIS_PORT=6379 CACHE_REDIS_HOST=localhost CACHE_REDIS_PORT=6380
Mastodonを再起動すれば、新しいキャッシュ専用のRedisインスタンスを利用するようになります。
キャッシュの残骸の掃除
永続化するメインのRedisインスタンスに、キャッシュが残っています。掃除しておきましょう。
redis-cli KEYS "cache:*" | xargs redis-cli DEL