Redisのスケーリング:Redis Clusterの設定ガイド

高可用性と水平スケーリングのためのRedis Clusterの設定と管理方法を学びます。このステップバイステップガイドでは、インストール、複数のRedisノードの設定、redis-trib.rbを使用したクラスターの作成、耐障害性のためのレプリカの追加、および基本的な管理コマンドについて説明します。Redisデプロイメントのスケーリングに不可欠な情報です。

Redisのスケーリング: Redisクラスター設定ガイド

Redisクラスターは、1つのRedisインスタンスではデータサイズ、トラフィック、または可用性目標に対応できなくなった場合に役立ちます。キーを複数のプライマリノードにシャーディングし、プライマリが障害を起こした場合にレプリカを昇格させることができます。

このガイドでは、現在のredis-cli --clusterワークフロー、ローカルの6ノードの例、およびクラスターの実行後に必要な管理コマンドを示します。

Redisクラスターの概念を理解する

Redisクラスターは、いくつかの実用的なアイデアに基づいて構築されています。

  • シャーディング: Redisクラスターはキースペースを16,384のハッシュスロットに分割します。各プライマリノードはスロットの範囲を所有し、クラスター対応クライアントはキーのスロットを所有するノードにコマンドをルーティングします。
  • レプリケーション: 各プライマリは1つ以上のレプリカを持つことができます。プライマリが障害を起こし、クラスターが依然としてクォーラムに達することができる場合、レプリカを昇格させることができます。
  • クラスターバス: ノードはクライアントポートとクラスターバスポート(通常はクライアントポートに10000を加えたもの)で相互に通信します。ポート7000の場合、バスポートは17000になります。
  • クライアントサポート: アプリケーションクライアントは、MOVEDASKなどのRedisクラスターリダイレクションをサポートする必要があります。クラスター対応でないクライアントは、キーが異なるノードに存在する場合に適切に動作しません。

前提条件

プロダクションスタイルのクラスターの場合、少なくとも6つのRedisノード(3つのプライマリと各プライマリに1つのレプリカ)を計画します。練習のために1台のマシンで以下の例を実行することもできますが、プロダクションノードはホストまたはアベイラビリティゾーン全体に分散させる必要があります。

また、Redisがインストールされ、redis-cliが利用可能であり、すべてのノード間でRedisクライアントポートとクラスターバスポートの両方でネットワークアクセスが可能である必要があります。可能であれば、現在サポートされているRedisリリースを使用してください。

Redisクラスターの段階的なセットアップ

この例では、ポート7000から7005までの6つのローカルRedisプロセスを使用します。

1. Redisのインストール

DebianまたはUbuntuでは、パッケージのインストールは次のようになります。

sudo apt update
sudo apt install redis-server

パッケージのバージョンはディストリビューションによって異なります。新しいRedisリリースが必要な場合は、公式のRedisパッケージまたはプラットフォームのマネージドRedisサービスを使用してください。

2. クラスターモード用のRedisインスタンスの設定

Redisプロセスごとに1つのディレクトリと1つの設定ファイルを作成します。

mkdir cluster
cd cluster

for port in 7000 7001 7002 7003 7004 7005; do
  mkdir "$port"
  cp /etc/redis/redis.conf "$port/redis.conf"
done

redis.confを編集し、ポート固有の値を設定します。7000/redis.confの場合は、以下を使用します。

port 7000
cluster-enabled yes
cluster-config-file nodes-7000.conf
cluster-node-timeout 5000
appendonly yes
bind 127.0.0.1

7001から7005についても、portcluster-config-fileの両方を変更して同じパターンを繰り返します。nodes-7000.confファイルはRedisによって管理されます。手動で編集しないでください。

リモートサーバーの場合は、127.0.0.1の代わりにプライベートネットワークインターフェースにバインドし、Redisビルドまたはサービスでサポートされている場合は、ファイアウォール、認証、TLSを使用してアクセスを保護します。

3. Redisインスタンスの起動

各インスタンスを独自の設定で起動します。

for port in 7000 7001 7002 7003 7004 7005; do
  redis-server "$port/redis.conf"
done

パッケージマネージャーがポート6379でデフォルトのRedisサービスをすでに実行している場合は、このテストクラスターから分離するか、実験中は停止してください。

4. redis-cli --clusterを使用したクラスターの作成

redis-cli --cluster createを使用してスロットとレプリカを割り当てます。

redis-cli --cluster create \
  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 \
  --cluster-replicas 1

Redisは提案されたスロットレイアウトを表示し、確認を求めます。プライマリとレプリカの配置が正しそうであれば、yesと入力します。

5. クラスターの確認

任意のノードからクラスターを確認します。

redis-cli -c -p 7000 CLUSTER INFO
redis-cli -c -p 7000 CLUSTER NODES
redis-cli --cluster check 127.0.0.1:7000

CLUSTER INFOcluster_state:okを表示するはずです。-cフラグは、redis-cliにクラスターリダイレクションに従うように指示します。これは、別のノードに属するキーに対してコマンドをテストする場合に便利です。

基本的な書き込みと読み取りを試してみます。

redis-cli -c -p 7000 SET user:1 "Ada"
redis-cli -c -p 7001 GET user:1

キーが別のノードによって提供されるスロットに属している場合でも、クラスター対応クライアントはリダイレクトに従うことができます。

既存のクラスターへのレプリカの追加

すでにクラスターがあり、新しいレプリカを追加したい場合は、クラスターモードを有効にして新しいRedisインスタンスを起動します。次に、プライマリノードIDを見つけます。

redis-cli -p 7000 CLUSTER NODES

新しいノードをそのプライマリのレプリカとして追加します。

redis-cli --cluster add-node \
  127.0.0.1:7006 127.0.0.1:7000 \
  --cluster-slave \
  --cluster-master-id <master_node_id>

最初のアドレスは新しいノードです。2番目のアドレスは、既存のクラスター内の到達可能な任意のノードです。<master_node_id>CLUSTER NODESのIDに置き換えます。

クラスターの管理

一般的な管理タスクは次のとおりです。

  • ヘルスチェック: redis-cli --cluster check 127.0.0.1:7000
  • プライマリの追加: redis-cli --cluster add-node <new_host:port> <existing_host:port>
  • スロットのリシャーディング: redis-cli --cluster reshard <existing_host:port>
  • ノードの削除: ノードがプライマリの場合は最初にスロットを移動し、次にredis-cli --cluster del-node <existing_host:port> <node_id>を実行します
  • 手動フェイルオーバーテスト: プライマリではなくレプリカからCLUSTER FAILOVERを実行します

完全な移行シーケンスを理解していない限り、低レベルのコマンドで手動でスロットを移動しないでください。redis-cli --clusterヘルパーは、スロットが不整合な状態になる可能性を減らします。

Redisクラスターのベストプラクティス

  • 少なくとも6つのノードを使用する: 3つのプライマリと3つのレプリカにより、クラスターはプライマリ障害に耐える余地が生まれます。
  • レプリカを障害ドメイン全体に分散する: 可能な限り、プライマリとそのレプリカを同じホストまたはアベイラビリティゾーンに配置しないでください。
  • Redisを保護する: Redisを信頼できないネットワークに直接公開しないでください。プライベートネットワーキング、ファイアウォールルール、認証、および利用可能な場合はTLSを使用します。
  • プライマリごとのメモリを計画する: Redisクラスターはキーをシャーディングしますが、各プライマリは割り当てられたデータ、オーバーヘッド、および成長のために十分なメモリを必要とします。
  • クラスター対応クライアントを使用する: トラフィックを切り替える前に、クライアントライブラリがRedisクラスターをサポートしていることを確認します。
  • フェイルオーバーとスロットバランスを監視する: メモリ、レイテンシ、拒否された接続、レプリケーションラグ、およびクラスター状態を追跡します。

まとめ

実用的なRedisクラスターの場合、少なくとも3つのプライマリとプライマリごとに1つのレプリカから始め、redis-cli --cluster createでクラスターを作成し、CLUSTER INFOredis-cli --cluster checkで確認します。その後、日常の作業はメモリ、スロットバランス、フェイルオーバー動作、およびクライアントの互換性の監視になります。