Redis クラスタ管理

RedisBeginner
オンラインで実践に進む

はじめに

この実験 (lab) では、Redis クラスタの管理方法を学びます。この実験 (lab) では、クラスタの初期化、ノードの追加、クラスタの健全性チェック、およびスロットのリシャーディングなど、重要なクラスタ管理タスクに焦点を当てています。

まず、redis-cli --cluster コマンドを使用して Redis クラスタを初期化します。これにより、初期設定が自動化されます。次に、CLUSTER MEET を使用して新しいノードを追加する方法を学びます。その後、CLUSTER INFO でクラスタの健全性を確認します。最後に、CLUSTER SETSLOT を使用してノード間でスロットをリシャーディングし、クラスタのバランスを取ります。

Redis クラスタの初期化

このステップでは、redis-cli --cluster create コマンドを使用して Redis クラスタを初期化します。このコマンドは、機能的な Redis クラスタのセットアッププロセスを簡素化します。

Redis クラスタとは? (What is a Redis Cluster?)

Redis クラスタは、複数の Redis ノードにデータを自動的に分散する分散型セットアップです。これにより、Redis のデプロイメントを水平方向にスケールし、単一の Redis インスタンスで処理できるよりも大きなデータセットを管理できます。

redis-cli --cluster create を使用する理由 (Why use redis-cli --cluster create?)

redis-cli --cluster create コマンドは、Redis クラスタの作成、管理、および操作を行うための簡単な方法を提供します。初期設定とノードの検出を自動化し、クラスタの作成を容易にします。

手順 (Steps):

  1. Redis インスタンスの起動 (Start Redis Instances):

    まず、複数の Redis インスタンスを構成して起動する必要があります。この実験 (lab) では、7000 から 7005 までのポートで実行される 6 つのインスタンスを使用します。各インスタンスは、cluster-enabled yes で構成する必要があります。

    これを行うには、次のコマンドを使用して構成ファイルを作成し、Redis インスタンスを起動します。これらのコマンドはデモンストレーション用であることに注意してください。セットアップスクリプトは、これらのインスタンスをすでに構成して起動しています。

    REDIS_CONF="/etc/redis/redis.conf"
    for port in 7000 7001 7002 7003 7004 7005; do
      CONF_FILE="/etc/redis/redis-${port}.conf"
      sudo cp "$REDIS_CONF" "$CONF_FILE"
      sudo sed -i "s/^port 6379/port ${port}/g" "$CONF_FILE"
      sudo sed -i "s/^#cluster-enabled yes/cluster-enabled yes/g" "$CONF_FILE"
      sudo sed -i "s/^#cluster-config-file nodes.conf/cluster-config-file nodes-${port}.conf/g" "$CONF_FILE"
      sudo sed -i "s/^#cluster-node-timeout 15000/cluster-node-timeout 15000/g" "$CONF_FILE"
      sudo sed -i "s/^#appendonly no/appendonly yes/g" "$CONF_FILE"
      sudo redis-server "$CONF_FILE" &
    done
    sleep 5
  2. クラスタの作成 (Create the Cluster):

    次に、redis-cli --cluster create コマンドを使用してクラスタを作成します。このコマンドには、初期ノードの IP アドレスとポートが必要です。

    ターミナルを開き、次のコマンドを実行します。

    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-cli --cluster create: クラスタ作成プロセスを開始します。
    • 127.0.0.1:7000 127.0.0.1:7001 ... 127.0.0.1:7005: Redis インスタンスのアドレスとポート。
    • --cluster-replicas 1: 各マスターノードに 1 つのレプリカが必要であることを指定します。
  3. クラスタ作成の確認 (Confirm the Cluster Creation):

    redis-cli ツールは、クラスタの作成を確認するように求めます。「yes」と入力して Enter キーを押します。

    >>> Creating cluster
    >>> Performing hash slots allocation on 6 nodes...
    >>> Master[0] -> Slots 0 - 5460
    >>> Master[1] -> Slots 5461 - 10922
    >>> Master[2] -> Slots 10923 - 16383
    >>> Adding replica node to Master[0]
    >>> Adding replica node to Master[1]
    >>> Adding replica node to Master[2]
    >>> M: 49a4928719291928192819281928192819281928 127.0.0.1:7000
       slots:[0-5460] (5461 slots) master
    >>> M: 9281928192819281928192819281928192819281 127.0.0.1:7001
       slots:[5461-10922] (5462 slots) master
    >>> M: 19281928192819281928192819281928192819281 127.0.0.1:7002
       slots:[10923-16383] (5461 slots) master
    >>> S: 81928192819281928192819281928192819281928 127.0.0.1:7003
       replicates 49a4928719291928192819281928192819281928
    >>> S: 28192819281928192819281928192819281928192 127.0.0.1:7004
       replicates 9281928192819281928192819281928192819281
    >>> S: 928192819281928192819281928192819281928192 127.0.0.1:7005
       replicates 19281928192819281928192819281928192819281
    >>> Can I set the above configuration? (type 'yes' to accept): yes
    >>> Slots 0-5460 assigned to node 49a4928719291928192819281928192819281928
    >>> Slots 5461-10922 assigned to node 9281928192819281928192819281928192819281
    >>> Slots 10923-16383 assigned to node 19281928192819281928192819281928192819281
    >>> Adding replica 81928192819281928192819281928192819281928 to 49a4928719291928192819281928192819281928
    >>> Adding replica 28192819281928192819281928192819281928192 to 9281928192819281928192819281928192819281
    >>> Adding replica 928192819281928192819281928192819281928192 to 19281928192819281928192819281928192819281
    >>> [OK] All nodes agree about the cluster configuration.
    >>> >>> Check cluster info
    >>> >>> Nodes
    >>> M: 49a4928719291928192819281928192819281928 127.0.0.1:7000
       slots:[0-5460] (5461 slots) master
       1 additional replica(s)
    >>> M: 9281928192819281928192819281928192819281 127.0.0.1:7001
       slots:[5461-10922] (5462 slots) master
       1 additional replica(s)
    >>> M: 19281928192819281928192819281928192819281 127.0.0.1:7002
       slots:[10923-16383] (5461 slots) master
       1 additional replica(s)
    >>> S: 81928192819281928192819281928192819281928 127.0.0.1:7003
       replicates 49a4928719291928192819281928192819281928
    >>> S: 28192819281928192819281928192819281928192 127.0.0.1:7004
       replicates 9281928192819281928192819281928192819281
    >>> S: 928192819281928192819281928192819281928192 127.0.0.1:7005
       replicates 19281928192819281928192819281928192819281
    >>> [OK] All nodes agree about the cluster configuration.
    >>> All 16384 slots covered.

    この出力は、各マスターノードへのスロットの割り当てと、レプリカの割り当てを示しています。

  4. クラスタへの接続 (Connect to the Cluster):

    redis-cli を使用して Redis クラスタに接続します。これにより、クラスタに対してコマンドを実行できます。

    redis-cli -h 127.0.0.1 -p 7000
  5. redis-cli の終了 (Exit redis-cli):

    コマンドがログに記録されるように、redis-cli セッションを終了します。

    exit

これで、Redis クラスタが正常に初期化されました。次のステップでは、ノードの追加、クラスタの健全性の確認、およびスロットのリシャーディングの方法について説明します。

クラスタへの新しいノードの追加

このステップでは、CLUSTER MEET コマンドを使用して、既存の Redis クラスタに新しいノードを追加する方法を学びます。このコマンドは、クラスタの容量を拡張し、高可用性を確保するために不可欠です。

CLUSTER MEET について (Understanding CLUSTER MEET)

CLUSTER MEET コマンドは、新しい Redis ノードをクラスタに導入します。ノードがこのコマンドを受信すると、指定されたノードへの接続を試み、クラスタの一部になるためのハンドシェイクプロセスを開始します。

前提条件 (Prerequisites):

  • 前のステップで説明したように初期化された Redis クラスタ。
  • クラスタの一部として実行および構成されているが、まだ接続されていない新しい Redis インスタンス。この実験 (lab) では、ポート 7006 で新しいインスタンスが実行されていると仮定します。このインスタンスは、cluster-enabled yes 構成オプションを使用して起動する必要があります。セットアップスクリプトは、このインスタンスをすでに構成して起動しています。

手順 (Steps):

  1. 既存のノードへの接続 (Connect to an Existing Node):

    redis-cli を使用して、クラスタ内の既存のノードのいずれかに接続します。CLUSTER MEET コマンドはクラスタ全体に情報を伝播するため、どのノードに接続してもかまいません。

    redis-cli -h 127.0.0.1 -p 7000
  2. CLUSTER MEET コマンドの使用 (Use the CLUSTER MEET Command):

    クラスタ内のノードに接続したので、CLUSTER MEET コマンドを使用して新しいノード (ポート 7006) を導入します。

    CLUSTER MEET 127.0.0.1 7006
    • CLUSTER MEET: 新しいノードを追加するコマンド。
    • 127.0.0.1: 新しいノードの IP アドレス。
    • 7006: 新しいノードのポート番号。

    次の出力が表示されるはずです。

    OK

    これは、コマンドが正常に送信されたことを示します。

  3. redis-cli の終了 (Exit redis-cli):

    コマンドがログに記録されるように、redis-cli セッションを終了します。

    exit

Redis クラスタに新しいノードが正常に追加されました。次のステップでは、クラスタの健全性を確認します。

クラスタのヘルスチェック

このステップでは、CLUSTER INFO コマンドを使用して、Redis クラスタの健全性とステータスを確認する方法を学びます。このコマンドは、クラスタの全体的な状態に関する貴重な情報を提供します。

CLUSTER INFO について (Understanding CLUSTER INFO)

CLUSTER INFO コマンドは、Redis クラスタに関する情報を返します。これは、クラスタの健全性を監視し、問題を診断するために使用できます。

前提条件 (Prerequisites):

  • 前のステップで説明したように、初期化され、新しいノードが追加された Redis クラスタ。

手順 (Steps):

  1. クラスタノードへの接続 (Connect to a Cluster Node):

    redis-cli を使用して、クラスタ内の任意のノードに接続します。

    redis-cli -h 127.0.0.1 -p 7000
  2. CLUSTER INFO コマンドの実行 (Execute the CLUSTER INFO Command):

    CLUSTER INFO コマンドを使用して、クラスタ情報を取得します。

    CLUSTER INFO

    次のような出力が表示されるはずです。

    cluster_state:ok
    cluster_slots_assigned:16384
    cluster_slots_ok:16384
    cluster_slots_pfail:0
    cluster_slots_fail:0
    cluster_known_nodes:7
    cluster_size:3
    cluster_current_epoch:7
    cluster_my_epoch:7
    ...
  3. 出力の解釈 (Interpreting the Output):

    いくつかの主要なメトリクス (metrics) の内訳を以下に示します。

    • cluster_state:ok: クラスタは正常な状態です。
    • cluster_slots_assigned:16384: ノードに割り当てられたスロットの数。
    • cluster_slots_ok:16384: 正常に機能しているスロットの数。
    • cluster_slots_pfail:0: 「潜在的に障害が発生している (potentially failing)」状態のスロットの数。
    • cluster_slots_fail:0: 「障害が発生している (failing)」状態のスロットの数。
    • cluster_known_nodes:7: 現在のノードが認識しているノードの総数。
    • cluster_size:3: クラスタ内のマスターノードの数。
  4. redis-cli の終了 (Exit redis-cli):

    コマンドがログに記録されるように、redis-cli セッションを終了します。

    exit

CLUSTER INFO コマンドを使用して、Redis クラスタの健全性を正常に確認できました。

新しいノードへのスロットのリシャーディング

このステップでは、redis-cli --cluster reshard コマンドを使用して、Redis クラスタ内のスロットをリシャーディングする方法を学びます。これは、特に新しいノードを追加した後で、データを均等に分散するために重要です。

Redis スロットとリシャーディングについて (Understanding Redis Slots and Resharding)

Redis クラスタは、キースペースを 16384 個のスロットに分割します。各マスターノードは、これらのスロットのサブセットを担当します。新しいノードを追加しても、最初はどのスロットも所有していません。リシャーディングは、既存のノードから新しいノードにスロットを移動し、データとワークロードのバランスを取ります。

手順 (Steps):

  1. redis-cli --cluster を使用したクラスタへの接続 (Connect to the Cluster using redis-cli --cluster):

    リシャーディング操作を実行するには、redis-cli --cluster reshard コマンドを使用します。このコマンドは、クラスタ全体にスロットを再分散するためのインタラクティブな方法を提供します。

    ターミナルを開き、次のコマンドを実行します。

    redis-cli --cluster reshard 127.0.0.1:7000

    このコマンドは、127.0.0.1:7000 のノードを介して Redis クラスタに接続し、リシャーディングプロセスを開始します。

  2. 移動するスロット数の指定 (Specify the Number of Slots to Move):

    redis-cli ツールは、移動するスロットの数を入力するように求めます。この例では、101 個のスロットを新しいノードに移動しましょう。

    How many slots do you want to move? (default: all)

    101 と入力して Enter キーを押します。

  3. ターゲットノード ID の入力 (Enter the Target Node ID):

    次に、ツールはターゲットノードのノード ID を入力するように求めます。これは、前のステップで追加した新しいノード (ポート 7006) です。ノード ID を見つけるには、前のステップで示したように CLUSTER NODES コマンドを使用するか、次のコマンドを使用してノード ID を直接取得できます。

    redis-cli -h 127.0.0.1 -p 7006 cluster nodes | grep myself | awk '{print $1}'

    出力からノード ID をコピーします。redis-cli ツールは次のようにプロンプト (prompt) を表示します。

    What is the receiving node ID?

    ノード ID を貼り付けて Enter キーを押します。

  4. ソースノードの指定 (Specify the Source Nodes):

    ツールは、スロットを取得するソースノードを指定するように求めます。all と入力すると、既存のすべてのマスターノードからスロットが再分散されます。

    Please enter all the source node IDs.
      Type 'all' to use all the nodes as source nodes for the hash slots.
      Type 'done' to stop entering IDs.

    all と入力して Enter キーを押します。

  5. リシャーディング計画の確認 (Confirm the Resharding Plan):

    redis-cli ツールは、リシャーディング計画を表示し、確認を求めます。

    Do you want to proceed with the reshard plan? (type 'yes' to accept):

    yes と入力して Enter キーを押すと、リシャーディングプロセスが開始されます。

  6. リシャーディングの完了を待機 (Wait for Resharding to Complete):

    redis-cli ツールは、ソースノードからターゲットノードにスロットを移動します。このプロセスには、クラスタ内のデータ量に応じて時間がかかる場合があります。スロットが移動されると、進行状況メッセージが表示されます。

  7. redis-cli の終了 (Exit redis-cli):

リシャーディングが完了したら、redis-cli セッションを終了します。

```redis
exit
```

redis-cli --cluster reshard コマンドを使用して、Redis クラスタ内のスロットを正常にリシャーディングできました。これにより、新しいノードを含め、クラスタ全体でデータがより均等に分散されるようになります。

まとめ

この実験 (Lab) では、Redis クラスタの管理方法を学びました。まず、redis-cli --cluster create を使用してクラスタを初期化し、次に CLUSTER MEET で新しいノードを追加しました。CLUSTER INFO を使用してクラスタの健全性を確認し、最後に redis-cli --cluster reshard でスロットをリシャーディングしてクラスタのバランスを取りました。これらは、Redis クラスタを管理し、そのスケーラビリティ (scalability) と高可用性 (high availability) を確保するための不可欠なタスクです。