Linux環境でDockerを用いてRedisコンテナとブloomフィルタをインストールする方法

はじめに

多くのプロジェクトでキャッシュとして利用されるRedis。Redisの学習中に、キャッシュのパフォーマンス問題(キャッシュのパニング、ヒット、雪崩)に遭遇しました。その中で、キャッシュのパニング問題に対する解決策の一つとしてブloomフィルタが挙げられました。ブloomフィルタの実装には、Guava、Redisson、RedisBloomなど複数の選択肢がありますが、今回はローカル環境ではなく、Redis公式が提供するブloomフィルタプラグインを選択しました。

インストールの準備

DockerでRedisコンテナを作成する際、公式のRedisイメージとブloomフィルタプラグインを含むイメージの2種類があります。しかし、コンテナ起動時に設定ファイルをマウントする必要がある場合、プラグイン付きイメージでは設定ファイルが反映されない問題に遭遇しました(手順ミスの可能性もありますが、通常のイメージでは正常にマウントできました)。そのため、公式の標準イメージをpullし、手動でブloomフィルタプラグインをインストールする方法を選択しました。

詳細な手順

1. 設定ファイルのダウンロード

設定ファイルをマウントして起動するため、まず公式サイトから対応するバージョンの設定ファイルをダウンロードします。

2. 設定ファイルの修正

ダウンロードした設定ファイルには、いくつかの変更が必要です。

設定ファイルの修正点と注意事項:
1. bindのコメント解除とアクセス制限の解除(本番環境では適切な設定が必要)
# ローカルアクセスを制限する行をコメントアウトまたは0.0.0.0に変更
bind 0.0.0.0

2. daemonizeの値を確認
# この設定はdocker -dコマンドと競合しないようにしてください
# サーバー実行モード。Redisをデーモンとして実行するかどうかを指定。デフォルトはno。yesにするとバックグラウンドで実行されますが、設定ファイル方式での起動に失敗する可能性があります。起動に失敗した場合はこの行をコメントアウトしてください。
daemonize no

3. appendonlyをyesに変更
# デフォルトはno。Redisの永続化を有効にするためにyesに変更
appendonly yes

4. timeoutを0に設定(接続を切断しない)
# クライアントがアイドル状態で接続が閉じられるまでの時間。0を指定すると、この機能を無効にします。
timeout 0

5. protected-modeをnoに設定
# 保護モードを無効にし、外部からの接続を許可
protected-mode no

6. Redisのデータ削除ポリシーを設定(allkeys-lruが一般的)
maxmemory-policy allkeys-lru

7. ブloomフィルタを使用する場合は、設定ファイルに以下の行を追加
# loadmoduleを検索し、指定された位置に追加
loadmodule /opt/redis/RedisBloom-2.4.0/redisbloom.so

3. ブloomフィルタプラグインのダウンロード

https://github.com/RedisBloom/RedisBloom

ダウンロードした圧縮ファイルを保存し、後でLinuxシステムにアップロードします。

インストール手順

まず、仮想マシン内にマウントするディレクトリを作成します(ディレクトリ名は任意で構いません)。

mkdir -p /opt/redis/conf/
mkdir -p /opt/redis/data/

指定バージョンのRedisイメージをpullします。ここでは7.0バージョンを例にします。

docker pull redis:7.0

先ほどダウンロードしたブloomフィルタの圧縮ファイルをRedisのディレクトリにアップロードし、解凍します。

# ディレクトリに移動
cd /opt/redis

# 解凍とインストール
tar -xzf RedisBloom-2.4.0.tar.gz
cd RedisBloom-2.4.0/
make

もし`make`コマンドが認識されない場合は、まず以下のコマンドでインストールします。

yum -y install make

`make`実行時に127エラーが発生した場合は、システムにCのコンパイラがないためです。RedisはC/C++ベースで開発されています。

yum -y install gcc gcc-c++ autoconf pcre pcre-devel make automake

依存関係をインストール後、`cd RedisBloom-2.4.0/`ディレクトリに戻り`make`を実行すると成功します。

`make`が成功すると、`redisbloom.so`ファイルが生成されます。このファイルのパスを`redis.conf`に記述します。

loadmodule /opt/redis/RedisBloom-2.4.0/redisbloom.so

修正した`redis.conf`ファイルを`redis.conf`ディレクトリにアップロードします。

設定ファイルをマウントしてRedisコンテナを起動します。

docker run -p 6379:6379 --name redis \
-v /opt/redis/RedisBloom-2.4.0/redisbloom.so:/opt/redis/RedisBloom-2.4.0/redisbloom.so \
-v /opt/redis/conf/redis.conf:/etc/redis/redis.conf \
-v /opt/redis/data:/data \
-d redis:7.0 redis-server /etc/redis/redis.conf

注意:Linuxシステム内のブloomフィルタのアドレスもRedisコンテナにマウントしないと、コンテナはブloomプラグインを起動できません(以前、このディレクトリをマウントし忘れて、コンテナに入ってテストしたところ、ブloomコマンドが認識されず、問題の原因を探すのに時間がかかりました)。最後のコマンドは、コンテナ作成後に実行され、ブloomフィルタを起動します。

コンテナ作成後、コンテナに入ります。

docker exec -it redis bash
# テスト接続
redis-cli
# ブloomコマンドでテスト
BF.ADD myfilter user123

これで成功です。Redis管理ツールを使用して、さらにテストを行うことができます。

成功後の便利な設定:ポートの開放とコンテナの自動起動

# ファイアウォールで指定ポートを開放
firewall-cmd --zone=public --add-port=6379/tcp --permanent
# ファイアウォールを再起動
firewall-cmd --reload
# Redisを开机自動起動に設定
docker update --restart=always redis

タグ: Docker redis ブloomフィルタ linux

7月10日 21:42 投稿