noellabo's tech blog

@noellaboの技術ブログ

Mastodon用にRedisインスタンスを複数立ち上げる

ここでは、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を作ることにしましょう。ここで決めたmastodonmastodon-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