なぜCentOS Stream 9でRedisなのか?
CentOS 7(EOL済み)からCentOS Stream 9へシステムを移行する際、よくある間違いを目にします。多くのエンジニアがいわゆる「とりあえずインストール」の状態で、インストール後にポートを開けるだけで運用を始めてしまいます。この方法は検証環境(Lab)であれば問題ありません。しかし、RHEL/CentOSのような厳格な環境の本番サーバー(Production)では、SELinuxやFirewalldのセキュリティの壁に即座にぶつかることになります。
Redis (Remote Dictionary Server) は、通常1ms未満という極めて低いレイテンシにより、キャッシュサーバーとして不動の選択肢となっています。CentOS Stream 9でスムーズに動作させるためには、より体系的なアプローチが必要です. 目標は単に「動く」ことではなく、「安全に動く」ことです。
デプロイ手法の比較
コマンドを打ち込む前に、実際のプロジェクトから導き出した3つのアプローチを比較してみましょう:
1. ソースコードからのインストール
- メリット: 最新のRedis 7.2+を即座に利用でき、コンパイルオプションを細かくカスタマイズ可能。
- デメリット: アップデート管理が煩雑で、systemdとの自動統合が行われない。
2. Dockerによるデプロイ
- メリット: 環境の隔離が容易で、一瞬でデプロイ可能。
- デメリット: 設定により5〜10%程度のネットワークオーバーヘッドが発生する。また、Docker経由でのRedis Cluster管理は複雑になりがち。
3. AppStreamからのインストール(推奨)
- メリット: 非常に安定しており、Red Hatによって最適化されている。
dnfによるアップデートが容易で、SELinuxポリシーも組み込み済み。 - デメリット: バージョンが本家より数ヶ月遅れることがある。
私の選択: 長期的な安定性が必要なシステムには、AppStreamを優先します。これにより、将来のメンテナンス(保守)が大幅に楽になります。
本番環境向けRedis構築ステップ
ステップ1:公式リポジトリからのインストール
CentOS Stream 9では、Redisはデフォルトのリポジトリで提供されています。以下のコマンドを実行するだけです:
sudo dnf makecache
sudo dnf install redis -y
インストール後、バージョンを確認してください。リポジトリの更新時期によりますが、通常はRedis 6.2または7.0がインストールされます:
redis-server --version
ステップ2:最適化とセキュリティ設定
設定ファイル /etc/redis/redis.conf を開きます。デフォルトのままにせず、以下のパラメータを変更しましょう:
sudo vi /etc/redis/redis.conf
- アクセスセキュリティ: 他のアプリケーションサーバーからRedisを呼び出す必要がある場合は、
bind 127.0.0.1をサーバーのプライベートIPに変更します。ファイアウォールがない状態でここを空欄にすることは絶対に避けてください。 - パスワードの設定:
requirepassの行を探します。32文字以上の長いパスワードを設定してください。Redisは毎秒15万リクエストを処理できるため、短いパスワードはブルートフォース攻撃で容易に突破されます。 - メモリ制限: Redisがリソースを使い果たしてシステムがハングアップ(OOM)するのを防ぎます。
maxmemory 2gb # サーバーの搭載RAMに合わせて調整 maxmemory-policy allkeys-lru
ステップ3:SELinuxの「飼い慣らし」
安易に setenforce 0 を実行してはいけません。SELinuxを無効化するのは、システムセキュリティに対する無責任な行為です。デフォルトポートを変更する場合(例:6380)、SELinuxにその旨を伝えます:
# 管理ツールが未インストールの場合はインストール
sudo dnf install policycoreutils-python-utils -y
sudo semanage port -a -t redis_port_t -p tcp 6380
ダンプファイル(RDB)の保存先ディレクトリを変更した場合は、新しいディレクトリのコンテキストを更新します:
sudo chcon -Rt svirt_sandbox_file_t /var/lib/redis_custom
ステップ4:Firewalldの適切な設定
CentOS Stream 9はデフォルトですべてのインバウンド接続をブロックします。ポートを全世界に開放してはいけません。rich-rules を使用して、アプリケーションサーバーのIPのみにアクセスを許可します:
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.0.0.50" port protocol="tcp" port="6379" accept'
sudo firewall-cmd --reload
この方法により、万が一パスワードが漏洩しても、外部からRedisポートに接続されるのを防げます。
実践的な課題:Transparent Huge Pages (THP) と Overcommit の修正
Redisのログ(journalctl -u redis)を確認すると、THPに関する警告が表示されることがあります。このLinuxカーネル機能は大きなメモリ管理には役立ちますが、Redisにとっては深刻な遅延(レイテンシスパイク)の原因となります。
マシン起動時にTHPを完全に無効化するサービスを作成しましょう:
sudo vi /etc/systemd/system/disable-thp.service
ファイルの内容:
[Unit]
Description=Disable Transparent Huge Pages (THP)
[Service]
Type=oneshot
ExecStart=/bin/sh -c 'echo never > /sys/kernel/mm/transparent_hugepage/enabled'
[Install]
WantedBy=multi-user.target
同時に、/etc/sysctl.conf に vm.overcommit_memory = 1 を追加し、Redisが仮想メモリ不足エラーを起こさずにディスクへのデータ保存(fork)を行えるようにします。
有効化と動作確認
いよいよ成果を確認する時です:
sudo systemctl enable --now redis disable-thp.service
sudo redis-cli -a Your_Password ping
結果として PONG が返ってくれば、システムは毎秒数万のリクエストを処理する準備が整っています。
実戦的なまとめ
CentOS Stream 9でのRedis構築自体は難しくありません。難しいのは、エンタープライズ環境でいかに安全に共存させるかです。SELinuxやFirewalldのルール遵守には追加で10分ほどの設定時間がかかりますが、それによって予期せぬリスクからデータを守ることができます。システムの最適化、ぜひ成功させてください!
