Redis のスケーリング: Redis Cluster セットアップガイド
強力なインメモリデータ構造ストアである Redis は、データベース、キャッシュ、メッセージブローカーとして広く利用されています。単一の Redis インスタンスでもかなりの負荷を処理できますが、多くのアプリケーションでは、データの増加やトラフィックの増大に対応するために、最終的により高い可用性と水平スケーリング機能が必要になります。Redis Cluster は、これら両方の目標を達成するためのネイティブなソリューションを提供します。
このガイドでは、Redis Cluster のセットアップ、構成、および管理のプロセスを順を追って説明します。基本的な概念を網羅し、インストールと構成のステップバイステップの手順を提供し、クラスターが堅牢で高性能な状態を保つために不可欠な管理タスクについて解説します。
Redis Cluster の概念を理解する
セットアップに入る前に、Redis Cluster を支える核となる概念を理解することが重要です。
- シャーディング (パーティショニング): Redis Cluster は、データセットを複数の Redis ノードに分割します。各ノードは、ハッシュスロットのサブセット(合計16384個)を担当します。クライアントがキーにアクセスする必要がある場合、クライアントライブラリは、そのキーがどのハッシュスロットに属するかを計算し、適切なノードにリクエストを転送します。
- レプリケーション: 高可用性を確保するために、クラスター内の各プライマリノードは、1つ以上のレプリカノードを持つことができます。プライマリノードが故障した場合、そのレプリカの1つが昇格してその役割を引き継ぐことができ、ダウンタイムを最小限に抑えます。
- ゴシッププロトコル: Redis Cluster のノードは、ゴシッププロトコルを使用して相互に通信します。これにより、ノードは互いを検出し、自身の状態に関する情報を交換し、障害を検出できます。
- コンセンサス (合意形成): プライマリノードが故障した場合、クラスターは残りのプライマリノード間で合意に達し、そのレプリカの中から新しいプライマリを選出する必要があります。このプロセスにより、クラスターの運用が維持されます。
前提条件
Redis Cluster をセットアップするには、以下が必要です。
- 複数のサーバーまたは仮想マシン(本番環境に対応したセットアップには、最低6ノードが推奨されます:プライマリ3台とレプリカ3台)。
- 各サーバーに Redis がインストールされていること。Redis バージョン 3.0 以降を使用していることを確認してください。
- すべてのノード間のネットワーク接続性。ノードは、クライアントポートとクラスターバスポート(クライアントポート + 10000)で相互に通信できる必要があります。
redis-cli(Redis コマンドラインインターフェース)。これには、クラスター作成のためのredis-trib.rbスクリプトが含まれています。
Redis Cluster のセットアップ:ステップバイステップ
このセクションでは、基本的な Redis Cluster を作成するための実用的なステップバイステップガイドを提供します。簡単にするため、ここでは単一のマシン上でノードごとに異なるポートを使用してクラスターをセットアップすることを想定します。本番環境では、通常、これらのノードを異なる物理マシンまたは仮想マシンに分散させます。
1. Redis のインストール
Redis がまだインストールされていない場合は、ご使用のオペレーティングシステム向けの公式 Redis インストールガイドに従ってください。例として、Debian/Ubuntu の場合:
sudo apt update
sudo apt install redis-server
2. クラスターモード用の Redis インスタンスの構成
クラスター内のノードごとに、個別の Redis 構成ファイルが必要です。各ノードのディレクトリを作成し、デフォルトの redis.conf ファイルをコピーします。
この最初のセットアップでは、レプリカを持たない3ノードのプライマリクラスターをセットアップすると想定します。ポート 7000、7001、7002 を使用します。
# 各ノードのディレクトリを作成
mkdir cluster
cd cluster
mkdir 7000 7001 7002
# redis.conf を各ディレクトリにコピー
cp /etc/redis/redis.conf ./7000/
cp /etc/redis/redis.conf ./7001/
cp /etc/redis/redis.conf ./7002/
次に、各ノードの構成ファイルを編集します。7000/redis.conf、7001/redis.conf、および 7002/redis.conf について、以下の変更を行います。
port 700X(X は 0、1、または 2)cluster-enabled yescluster-config-file nodes-700X.conf(このファイルは Redis 自体によって管理され、手動で編集しないでください。クラスターの状態が保存されます。)cluster-node-timeout 5000(ノードが故障したと見なされるまでの推奨タイムアウト(ミリ秒))appendonly yes(特に本番環境でのデータの永続性のために推奨)
7000/redis.conf の例:
port 7000
cluster-enabled yes
cluster-config-file nodes-7000.conf
cluster-node-timeout 5000
appendonly yes
# リモートマシンで実行している場合は、bind が 0.0.0.0 または正しい IP に設定されていることを確認してください
bind 0.0.0.0
これらの変更を 7001/redis.conf (ポート 7001) および 7002/redis.conf (ポート 7002) についても繰り返します。
3. Redis インスタンスの起動
特定の構成ファイルを使用して、各 Redis インスタンスを起動します。
redis-server ./7000/redis.conf
redis-server ./7001/redis.conf
redis-server ./7002/redis.conf
Redis をサービスとして実行している場合、デフォルトのインスタンスを停止し(sudo systemctl stop redis-server)、上記のように手動で起動するか、複数のサービスファイルを構成する必要があるかもしれません。
4. redis-trib.rb を使用したクラスターの作成
redis-trib.rb スクリプトは、Redis Cluster の作成を自動化するのに役立つ Ruby gem です。Redis ディストリビューションに含まれています。
redis-trib.rb が存在するディレクトリに移動します(通常、/usr/share/redis/ にあるか、Redis のインストール内で見つける必要がある場合があります)。Ruby が存在しない場合は、インストールする必要があるかもしれません(sudo apt install ruby-full)。
このスクリプトを実行して、3つのマスターノードを持つクラスターを作成します。
# クラスターディレクトリにいるか、フルパスを提供していることを確認してください
# ruby /path/to/redis/src/redis-trib.rb create --replicas 0 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002
# または redis-trib.rb が PATH に含まれている場合
redis-trib.rb create --replicas 0 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002
このコマンドの意味:
* create: redis-trib.rb に新しいクラスターを作成するように指示します。
* --replicas 0: マスターごとにレプリカを0個にすることを指定します。本番環境のセットアップでは、--replicas 1(またはそれ以上)を使用します。
* 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002: クラスターに参加するノードをリストします。
スクリプトは確認を求めます。続行するには yes と入力します。その後、各マスターノードにハッシュスロットを割り当て、クラスターを構成します。
5. クラスターの検証
redis-trib.rb が完了した後、任意のノードに接続してクラスターの状態を確認できます。
redis-cli -c -p 7000
CLUSTER INFO
CLUSTER NODES
CLUSTER INFO コマンドは cluster_state:ok を示すはずです。CLUSTER NODES コマンドは、クラスター内のすべてのノード、その役割、および割り当てられたスロットを一覧表示します。
ヒント: redis-cli で -c フラグ(redis-cli -c)を使用してクラスターモードを有効にしてください。これにより、ハッシュスロットの移行やリダイレクトが必要な場合に、redis-cli が自動的に正しいノードにコマンドをリダイレクトできます。
既存のクラスターへのレプリカの追加
高可用性のために、レプリカを追加する必要があります。ポート 7000 のノード(マスター)に対して、ポート 7003 にレプリカを追加しましょう。
- 新しいノードの構成: 新しいディレクトリ(例:
cluster/7003)を作成し、redis.confをコピーして、ポート 7003 用に更新し、クラスターモードを有効にして、cluster-config-fileを設定します。
ini port 7003 cluster-enabled yes cluster-config-file nodes-7003.conf cluster-node-timeout 5000 appendonly yes bind 0.0.0.0 - 新しいノードの起動:
redis-server ./7003/redis.conf -
redis-trib.rbを使用したレプリカの追加:redis-cli -c -p 7000を使用して既存のクラスターに接続し、CLUSTER REPLICATEコマンドを使用するか、再度redis-trib.rbを使用します。初期設定ではredis-trib.rbを使用する方が一般的に簡単です。```bash
redis-trib.rb を使用してノード 7000 のレプリカを追加する例
レプリケートしたいマスターのノード ID が必要です。
まず、ノード ID を取得します: redis-cli -p 7000 CLUSTER NODES
マスターノード ID が 'your_master_node_id' であると仮定します
redis-trib.rb --cluster-add-node 127.0.0.1:7003 --cluster-slave --cluster-master-id
127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002
`` *注*: ノードを追加するためのredis-trib.rbコマンドは少し複雑になることがあります。レプリカを追加するためのより簡単なアプローチは、まず新しいレプリカインスタンスを立ち上げ、次にredis-cli経由でマスターノードに接続し、CLUSTER REPLICATE` コマンドを発行することです。 あるいは、
redis-trib.rbを使用して、レプリカを持つ既存のクラスターを再構成することもできます。```bash
既存の 3 マスタークラスターにレプリカを追加する例
redis-trib.rb replace-node-master --replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005
```
このコマンドはより複雑で、追加のノード(7003、7004、7005)をレプリカとして構成済みであることを前提としています。
6. クラスターの管理
- ノードの追加/削除: クラスターをスケーリングするために、新しいマスターノードとレプリカを追加できます。
redis-trib.rbまたは手動コマンドを使用できます。ノードを削除するには、まずそのノードからスロットを移行する必要があります。 - フェイルオーバー: Redis Cluster はフェイルオーバーを自動的に処理します。マスターノードに到達できなくなった場合、そのレプリカは昇格を試みます。
CLUSTER FAILOVER(レプリカ上で実行) を使用するか、ノードを停止することで障害をシミュレートできます。 - スロットの移動:
CLUSTER SETSLOT <slot> IMPORTING/NODEおよびMIGRATEコマンドを使用して、マスターノード間でハッシュスロットを手動で移動できます。これは、クラスターのリバランスやノード削除の準備に役立ちます。
Redis Cluster のベストプラクティス
- 最低6ノードを使用する: フォールトトレランスのために、本番環境に対応したクラスターは、最低3つのマスターと3つのレプリカ(マスターごとに1つのレプリカ)を持つ必要があります。
- ノードをアベイラビリティゾーンに分散させる: クラウドデプロイメントの場合、ゾーンレベルの障害から保護するために、ノードを異なるアベイラビリティゾーンに配置してください。
- クラスターを監視する: Redis の監視ツールや外部監視システムを使用して、パフォーマンス、メモリ使用量、およびノードの健全性を追跡します。
protected-mode noを構成する: ネットワーク上で Redis Cluster を実行する場合、redis.confでprotected-mode noが設定されていることを確認し、ファイアウォールを使用してアクセスを制限してください。appendonly yesを使用する: データの永続性のために、追記専用ファイル(AOF)の永続化が有効になっていることを確認してください。- クライアントライブラリのサポート: 使用する Redis クライアントライブラリが Redis Cluster をサポートし、リダイレクトを正しく処理することを確認してください。
まとめ
Redis Cluster のセットアップは、高可用性と水平スケーラビリティを必要とするアプリケーションにとって重要なステップです。シャーディング、レプリケーション、クラスター通信のコアな概念を理解することで、堅牢な Redis Cluster を展開し、管理することができます。最適なパフォーマンスと信頼性を確保するために、クラスターのトポロジーを計画し、その健全性を監視し、ベストプラクティスに従うことを忘れないでください。