Fedora ServerでのValkeyインストールと設定:本番環境向けRedis代替ソリューション

Fedora tutorial - IT technology blog
Fedora tutorial - IT technology blog

背景:深夜2時のRedis脱出劇

午前2時15分、突然鳴り響く電話の着信音。データベースの障害通知かと思いきや、コンプライアンスチームからの緊急メールでした。ライセンスがRSALv2/SSPLへ変更されたことに伴い、ステージングおよび本番環境の全Redisクラスターの利用を即時停止せよとの通達です。40,000人を超える同時アクティブユーザー(CCU)を抱えるシステムにおいて、深夜に突如降って湧いたオープンソースのコンプライアンス問題に、チーム全員が冷や汗をかきました。

その時、最も現実的な救世主となったのがValkeyでした。Linux Foundation傘下のプロジェクトであり、AWS、Google Cloud、Oracleなどの支援を受け、Redisの元コアメンテナー陣によって立ち上げられたものです。ValkeyはBSD 3-Clauseライセンスを維持し、Redis 7.2.4のコマンドセットと完全な互換性を保っています。redis-py、ioredis、predisといった主要なクライアントライブラリも、バックエンドのコードを1行も修正することなくそのまま接続可能です。

私たちのチームでは社内マイクロサービス向けにFedora Serverクラスターを運用しています。幸いなことに、FedoraチームはFedora 40からValkeyを公式リポジトリに採用し、従来のRedisパッケージを完全に置き換えていました。そのため、ソースコードのコンパイル作業に手間取ることなく、オンコールシフトの対応時間内に迅速な移行を進めることができました。

Fedora ServerへのValkeyのインストール

サーバーにSSH接続した後、公式リポジトリにパッケージが用意されているため、インストールは非常にスムーズに行えます。

システムで利用可能なバージョン情報を確認します:

sudo dnf info valkey

後方互換性パッケージとともにValkeyサーバーをインストールします:

sudo dnf install -y valkey valkey-compat-redis

valkey-compat-redisパッケージは、レガシースクリプトの互換性問題を完全に解消してくれます。このパッケージにより、redis-cliからvalkey-cliへ、またredis-serverからvalkey-serverへのシンボリックリンクが自動生成されます。これにより、既存のcronジョブ、デプロイパイプライン、バックアップスクリプトなどを書き換えることなく、そのまま正常に動作させることができます。

本番環境向けの標準設定

本番環境に導入する際、デフォルト設定のまま運用するのは絶対に避けるべきです。デフォルトでは、Valkeyにはパスワードが設定されておらず、localhostのみをリッスンしています。メインの設定ファイルを開いて適切な設定を行いましょう:

sudo nano /etc/valkey/valkey.conf

1. ネットワーク範囲の制限と認証の有効化

サービスのリッスンは内部プライベートIP(例:10.0.0.15)のみに限定し、パブリックインターネットには絶対に公開しないでください。あわせて、十分強固なパスワードを設定します:

# localhostおよびアプリケーションクラスタのプライベートIPをリッスン
bind 127.0.0.1 10.0.0.15

# 保護モードを有効化
protected-mode yes

# 標準ポート
port 6379

# ランダムな32文字以上の強力なパスワード
requirepass vK9#mQ2$xL8!pZ4@wE7*rT1^yU5&iO3(

2. メモリ上限の設定とエビクションポリシー

Valkeyに無制限にメモリを消費させると、LinuxのOOM Killerによってプロセスが強制終了される典型的な原因になります。複数のワーカープロセスが同居する16GB RAMのサーバーでは、安全な上限値を明示的に割り当てておく必要があります:

# キャッシュ用に4GBのハードリミットを設定
maxmemory 4gb

# メモリ上限到達時に最も使われていないキーを自動削除
maxmemory-policy allkeys-lru

3. 永続化(Persistence)メカニズムの設定

ユーザーセッションのキャッシュなどでは、再起動後もデータを保持する必要があります。定期的なRDBスナップショットとAOF(Append-Only File)を組み合わせるのが効果的です:

# 書き込み操作を逐次ログ記録するためにAOFを有効化
appendonly yes
appendfilename "appendonly.aof"

# IOPSのボトルネックを防ぐため、1秒ごとにディスクへ同期
appendfsync everysec

4. OSカーネルのチューニング

Linux環境でValkeyを起動すると、仮想メモリやレイテンシに関する警告ログが出力されることがあります。特によくあるのが、vm.overcommit_memoryの設定不足と、レイテンシを0.5msから数十msへと急増させる要因となるTransparent Huge Pages(THP)の有効化です。カーネルパラメータを設定して根本的に解決しましょう:

# RDBスナップショット保存時のプロセスforkエラーを防止
echo 'vm.overcommit_memory = 1' | sudo tee /etc/sysctl.d/99-valkey.conf
sudo sysctl --system

OS起動時にTransparent Huge Pagesを無効化するためのsystemdサービスを作成します:

sudo nano /etc/systemd/system/disable-thp.service

サービス設定の内容:

[Unit]
Description=Disable Transparent Huge Pages (THP) for Valkey
DefaultDependencies=no
After=sysinit.target local-fs.target
Before=valkey.service

[Service]
Type=oneshot
ExecStart=/bin/sh -c 'echo never > /sys/kernel/mm/transparent_hugepage/enabled && echo never > /sys/kernel/mm/transparent_hugepage/defrag'

[Install]
WantedBy=basic.target

サービスを有効化して起動します:

sudo systemctl daemon-reload
sudo systemctl enable --now disable-thp.service

5. 内部サブネット向けファイアウォール設定

Fedora Serverではデフォルトでfirewalldが有効になっています。全体に無制限に開放するのではなく、アプリケーションサーバーのサブネット(例:10.0.0.0/24)に対してのみポート6379を開放します:

sudo firewall-cmd --permanent --zone=internal --add-source=10.0.0.0/24
sudo firewall-cmd --permanent --zone=internal --add-port=6379/tcp
sudo firewall-cmd --reload

テストと実際のパフォーマンス検証

サービスを起動し、OS再起動時の自動起動を有効にします:

sudo systemctl enable --now valkey
sudo systemctl status valkey

サービスがactive (running)状態になったら、CLIを使って直接接続テストを行います:

valkey-cli -a "vK9#mQ2$xL8!pZ4@wE7*rT1^yU5&iO3("

基本的な操作をテストします:

127.0.0.1:6379> PING
PONG
127.0.0.1:6379> SET auth_token:user_4892 "active_session" EX 3600
OK
127.0.0.1:6379> GET auth_token:user_4892
"active_session"
127.0.0.1:6379> TTL auth_token:user_4892
(integer) 3594

メモリ使用状況とレイテンシのモニタリング

以下のコマンドでメモリ割り当て状況を確認します:

127.0.0.1:6379> INFO memory

特に注視すべき3つの主要指標は以下の通りです:

  • used_memory_human: 実際のデータが消費しているメモリ量。
  • maxmemory_human: 設定したメモリ上限値(この例では4GB)。
  • mem_fragmentation_ratio: メモリ断片化率。通常は1.0〜1.3の範囲が理想的であり、1.5を超える場合は物理メモリの断片化が進んでいることを示します。

リアルタイム統計モードを使用して、アプリケーションからの実際のトラフィックを計測します:

valkey-cli -a "vK9#mQ2$xL8!pZ4@wE7*rT1^yU5&iO3(" --stat

このツールはクライアント接続数、キー総数、RAM使用量、1秒あたりのリクエスト数(RPS)を毎秒出力します。valkey-benchmark -q -n 100000 -c 50コマンドでベンチマークを実行したところ、ノードは約92,000 RPSを記録し、p99レイテンシは0.8ms未満を維持しました。こうしてRedisからValkeyへの移行は迅速に完了し、ライセンスリスクを根本的に解消しつつ、優れたパフォーマンスを維持することができました。

Share: