redis-cli の --cluster オプション解説

# これは何？

Redis のCLIツールである redis-cli には、Redis クラスタを操作するための --cluster オプションがあります。

この記事では、redis-cli の --cluster オプションについて解説します。

以前のRedisバージョンではredis-trib.rbというRuby製のスクリプトでクラスタを操作できましたが、それを置き換えたものだと思ってください。(redis-trib.rbはRedis 5.0でdeprecatedになりました)

バージョンは基本的に Redis 7.2 を想定しています。

# 基本的な使い方

```
$ redis-cli --cluster <Command> <host>:<port> [Options]
```
以下のように、redis-cliの他のオプションも併用できるので、必要に応じて指定してください。
```
$ redis-cli --user <user> --a <password> --tls --cluster <Command> <host>:<port> [Options]
```

# コマンド解説

## 共通オプション

* --cluster-yes
プロンプトに yes と入力して先に進むコマンドに対して、自動でyesを入力した扱いになります。

## create

複数指定したRedisホスト・ポートのRedis クラスタを作成します。
実行すると作成予定のクラスタの構成が出力され、確認のプロンプトが出るので、問題なければyesを入力して作成します。

使用するRedisノードは、あらかじめ cluster-enabled yes のオプションで起動しておく必要があります。
createコマンドでRedisクラスタを作成するには最低3つのmasterノードが必要です。
createコマンドを使用せずに手動でクラスタを作成する場合は2つのmasterノードで作成することも可能ですが、2master構成は1masterのダウンで過半数のmasterによるfailoverの合意ができなくなるなど可用性が不十分なため推奨されません。

* 引数
  * \<host1>:\<port1> \<host2>:\<port2> ...
クラスタに参加する全ノードのホストとポートの組を指定します。
* オプション
  * --cluster-replicas \<num>
master1ノードに紐づくreplicaの数を指定します。
指定しない場合は、replicaはなしで、全ノードがmasterノードになります。

```bash:書式
 $ redis-cli --cluster create <host1>:<port1> <host2>:<port2> ... [--cluster-replicas <num>]  
```

<details><summary>create使用例</summary>

```bash
## master3ノード+replica3ノードの計6ノードのクラスタを作成
$ redis-cli --cluster create 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 127.0.0.1:7006 --cluster-replicas 1
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 127.0.0.1:7005 to 127.0.0.1:7001
Adding replica 127.0.0.1:7006 to 127.0.0.1:7002
Adding replica 127.0.0.1:7004 to 127.0.0.1:7003
>>> Trying to optimize slaves allocation for anti-affinity
[WARNING] Some slaves are in the same host as their master
M: f376c33f688f7ea1559eaa75388e9f715d9f0647 127.0.0.1:7001
   slots:[0-5460] (5461 slots) master
M: 050eaa06fccfb9af34946097e0a7c50a9871aae0 127.0.0.1:7002
   slots:[5461-10922] (5462 slots) master
M: 04d8bc176f75e5d5282e4cc0a84b098386568515 127.0.0.1:7003
   slots:[10923-16383] (5461 slots) master
S: 25932d5c629f85c13dee3eff58c0df474d550fab 127.0.0.1:7004
   replicates f376c33f688f7ea1559eaa75388e9f715d9f0647
S: 2c13690333d8c77c9858a4bf565e3993e9ab9d74 127.0.0.1:7005
   replicates 050eaa06fccfb9af34946097e0a7c50a9871aae0
S: 9d40a2d225fcd390dc38924c6c06bf645593c2a2 127.0.0.1:7006
   replicates 04d8bc176f75e5d5282e4cc0a84b098386568515
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join

>>> Performing Cluster Check (using node 127.0.0.1:7001)
M: f376c33f688f7ea1559eaa75388e9f715d9f0647 127.0.0.1:7001
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
M: 050eaa06fccfb9af34946097e0a7c50a9871aae0 127.0.0.1:7002
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
M: 04d8bc176f75e5d5282e4cc0a84b098386568515 127.0.0.1:7003
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
S: 2c13690333d8c77c9858a4bf565e3993e9ab9d74 127.0.0.1:7005
   slots: (0 slots) slave
   replicates 050eaa06fccfb9af34946097e0a7c50a9871aae0
S: 25932d5c629f85c13dee3eff58c0df474d550fab 127.0.0.1:7004
   slots: (0 slots) slave
   replicates f376c33f688f7ea1559eaa75388e9f715d9f0647
S: 9d40a2d225fcd390dc38924c6c06bf645593c2a2 127.0.0.1:7006
   slots: (0 slots) slave
   replicates 04d8bc176f75e5d5282e4cc0a84b098386568515
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
```
</details>

## info

指定したRedisホスト・ポートに接続して、クラスタの情報を取得します。
masterノードと保持しているキー数、slot数、replicaノードの数を確認できます。

* 引数
  * \<host>:\<port> or \<host> \<port>
対象クラスタのいずれかのノードのホスト・ポートを":"(コロン)か" "(スペース)区切りで指定します。

```bash:書式
$ redis-cli --cluster info <host>:<port>
```

<details><summary>info使用例</summary>

```bash
## masterノードと保持しているキー数、slot数、replicaの数を確認
$ redis-cli --cluster info 127.0.0.1:7001.nodes.conf
127.0.0.1:7001 (f376c33f...) -> 0 keys | 5461 slots | 1 slaves.
127.0.0.1:7002 (050eaa06...) -> 0 keys | 5462 slots | 1 slaves.
127.0.0.1:7003 (04d8bc17...) -> 0 keys | 5461 slots | 1 slaves.
[OK] 0 keys in 3 masters.
0.00 keys per slot on average.
```
</details>

## check

指定したRedisホスト・ポートに接続して、クラスタ情報の取得とクラスタ全体の構成をチェックします。
infoコマンドではクラスタ情報の取得と表示のみ行いますが、checkコマンドではそれに加えて構成のチェックが実行されます。
クラスタ全体で同じconfigを持っているか、移動中のslotがあるかをチェックします。
reshardの途中や直後などで一時的にエラーが表示されることはありますが、継続してエラー状態のクラスタはfixコマンドなどで対処が必要です。

* 引数
  * \<host>:\<port> or \<host> \<port>
対象クラスタのいずれかのノードのホスト・ポートを":"(コロン)か" "(スペース)区切りで指定します。
* オプション
  * --cluster-search-multiple-owners
複数のノードが同じslotの所有者になっていないかチェックします。

```bash:書式
$ redis-cli --cluster check <host>:<port> [--cluster-search-multiple-owners]
```

<details><summary>check使用例</summary>

```bash
## 正常なクラスタ
$ redis-cli --cluster check 127.0.0.1:7001
127.0.0.1:7001 (f376c33f...) -> 0 keys | 5461 slots | 1 slaves.
127.0.0.1:7002 (050eaa06...) -> 0 keys | 5462 slots | 1 slaves.
127.0.0.1:7003 (04d8bc17...) -> 0 keys | 5461 slots | 1 slaves.
[OK] 0 keys in 3 masters.
0.00 keys per slot on average.
>>> Performing Cluster Check (using node 127.0.0.1:7001)
M: f376c33f688f7ea1559eaa75388e9f715d9f0647 127.0.0.1:7001
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
S: 2c13690333d8c77c9858a4bf565e3993e9ab9d74 127.0.0.1:7005
   slots: (0 slots) slave
   replicates 050eaa06fccfb9af34946097e0a7c50a9871aae0
M: 050eaa06fccfb9af34946097e0a7c50a9871aae0 127.0.0.1:7002
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
M: 04d8bc176f75e5d5282e4cc0a84b098386568515 127.0.0.1:7003
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
S: 25932d5c629f85c13dee3eff58c0df474d550fab 127.0.0.1:7004
   slots: (0 slots) slave
   replicates f376c33f688f7ea1559eaa75388e9f715d9f0647
S: 9d40a2d225fcd390dc38924c6c06bf645593c2a2 127.0.0.1:7006
   slots: (0 slots) slave
   replicates 04d8bc176f75e5d5282e4cc0a84b098386568515
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

## 935,3300,4998のslotが移動中のクラスタ
$ redis-cli --cluster check 127.0.0.1:7001
127.0.0.1:7001 (f376c33f...) -> 0 keys | 5461 slots | 1 slaves.
127.0.0.1:7003 (04d8bc17...) -> 0 keys | 5461 slots | 1 slaves.
127.0.0.1:7002 (050eaa06...) -> 0 keys | 5462 slots | 1 slaves.
[OK] 0 keys in 3 masters.
0.00 keys per slot on average.
>>> Performing Cluster Check (using node 127.0.0.1:7001)
M: f376c33f688f7ea1559eaa75388e9f715d9f0647 127.0.0.1:7001
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
M: 04d8bc176f75e5d5282e4cc0a84b098386568515 127.0.0.1:7003
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
M: 050eaa06fccfb9af34946097e0a7c50a9871aae0 127.0.0.1:7002
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
S: 25932d5c629f85c13dee3eff58c0df474d550fab 127.0.0.1:7004
   slots: (0 slots) slave
   replicates f376c33f688f7ea1559eaa75388e9f715d9f0647
S: 9d40a2d225fcd390dc38924c6c06bf645593c2a2 127.0.0.1:7006
   slots: (0 slots) slave
   replicates 04d8bc176f75e5d5282e4cc0a84b098386568515
S: 2c13690333d8c77c9858a4bf565e3993e9ab9d74 127.0.0.1:7005
   slots: (0 slots) slave
   replicates 050eaa06fccfb9af34946097e0a7c50a9871aae0
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
[WARNING] Node 127.0.0.1:7003 has slots in importing state 935,3300,4998.
[WARNING] Node 127.0.0.1:7002 has slots in importing state 935,3300,4998.
[WARNING] The following slots are open: 4998,935,3300.
>>> Check slots coverage...
[OK] All 16384 slots covered.
```
</details>

## fix

クラスタの構成を修正します。

移動中のまま止まっているslot、複数のノードが所有者になっているslotを修正します。

* 引数
  * \<host>:\<port> or \<host> \<port>
対象クラスタのいずれかのノードのホスト・ポートを":"(コロン)か" "(スペース)区切りで指定します。
* オプション
  * --cluster-search-multiple-owners
複数のノードが同じslotの所有者になっていないかチェックし、修正します。
  * --cluster-fix-with-unreachable-masters
Redis 6.0から追加されたオプション。
応答不能のmasterがいる場合に、そのmasterのslotを別ノードに振り分けます。応答不能のmasterが保持していたデータはロストするので、注意が必要です。

```書式
$ redis-cli --cluster fix <host>:<port> [--cluster-search-multiple-owners] [--cluster-fix-with-unreachable-masters]
```

<details><summary>fix使用例</summary>

```bash
## 935,3300,4998のslotが移動中であることを確認
$ redis-cli --cluster check 127.0.0.1:7001
127.0.0.1:7001 (f376c33f...) -> 0 keys | 5461 slots | 1 slaves.
127.0.0.1:7003 (04d8bc17...) -> 0 keys | 5461 slots | 1 slaves.
127.0.0.1:7002 (050eaa06...) -> 0 keys | 5462 slots | 1 slaves.
[OK] 0 keys in 3 masters.
0.00 keys per slot on average.
>>> Performing Cluster Check (using node 127.0.0.1:7001)
M: f376c33f688f7ea1559eaa75388e9f715d9f0647 127.0.0.1:7001
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
M: 04d8bc176f75e5d5282e4cc0a84b098386568515 127.0.0.1:7003
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
M: 050eaa06fccfb9af34946097e0a7c50a9871aae0 127.0.0.1:7002
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
S: 25932d5c629f85c13dee3eff58c0df474d550fab 127.0.0.1:7004
   slots: (0 slots) slave
   replicates f376c33f688f7ea1559eaa75388e9f715d9f0647
S: 9d40a2d225fcd390dc38924c6c06bf645593c2a2 127.0.0.1:7006
   slots: (0 slots) slave
   replicates 04d8bc176f75e5d5282e4cc0a84b098386568515
S: 2c13690333d8c77c9858a4bf565e3993e9ab9d74 127.0.0.1:7005
   slots: (0 slots) slave
   replicates 050eaa06fccfb9af34946097e0a7c50a9871aae0
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
[WARNING] Node 127.0.0.1:7003 has slots in importing state 935,3300,4998.
[WARNING] Node 127.0.0.1:7002 has slots in importing state 935,3300,4998.
[WARNING] The following slots are open: 4998,935,3300.
>>> Check slots coverage...
[OK] All 16384 slots covered.

## 修正
$ redis-cli --cluster fix 127.0.0.1:7001
127.0.0.1:7001 (f376c33f...) -> 0 keys | 5461 slots | 1 slaves.
127.0.0.1:7003 (04d8bc17...) -> 0 keys | 5461 slots | 1 slaves.
127.0.0.1:7002 (050eaa06...) -> 0 keys | 5462 slots | 1 slaves.
[OK] 0 keys in 3 masters.
0.00 keys per slot on average.
>>> Performing Cluster Check (using node 127.0.0.1:7001)
M: f376c33f688f7ea1559eaa75388e9f715d9f0647 127.0.0.1:7001
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
M: 04d8bc176f75e5d5282e4cc0a84b098386568515 127.0.0.1:7003
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
M: 050eaa06fccfb9af34946097e0a7c50a9871aae0 127.0.0.1:7002
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
S: 25932d5c629f85c13dee3eff58c0df474d550fab 127.0.0.1:7004
   slots: (0 slots) slave
   replicates f376c33f688f7ea1559eaa75388e9f715d9f0647
S: 9d40a2d225fcd390dc38924c6c06bf645593c2a2 127.0.0.1:7006
   slots: (0 slots) slave
   replicates 04d8bc176f75e5d5282e4cc0a84b098386568515
S: 2c13690333d8c77c9858a4bf565e3993e9ab9d74 127.0.0.1:7005
   slots: (0 slots) slave
   replicates 050eaa06fccfb9af34946097e0a7c50a9871aae0
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
[WARNING] Node 127.0.0.1:7003 has slots in importing state 935,3300,4998.
[WARNING] Node 127.0.0.1:7002 has slots in importing state 935,3300,4998.
[WARNING] The following slots are open: 4998,935,3300.
>>> Fixing open slot 4998
Set as importing in: 127.0.0.1:7003,127.0.0.1:7002
>>> Case 2: Moving all the 4998 slot keys to its owner 127.0.0.1:7001
Moving slot 4998 from 127.0.0.1:7003 to 127.0.0.1:7001:
>>> Setting 4998 as STABLE in 127.0.0.1:7003
Moving slot 4998 from 127.0.0.1:7002 to 127.0.0.1:7001:
>>> Setting 4998 as STABLE in 127.0.0.1:7002
>>> Fixing open slot 935
Set as importing in: 127.0.0.1:7003,127.0.0.1:7002
>>> Case 2: Moving all the 935 slot keys to its owner 127.0.0.1:7001
Moving slot 935 from 127.0.0.1:7003 to 127.0.0.1:7001:
>>> Setting 935 as STABLE in 127.0.0.1:7003
Moving slot 935 from 127.0.0.1:7002 to 127.0.0.1:7001:
>>> Setting 935 as STABLE in 127.0.0.1:7002
>>> Fixing open slot 3300
Set as importing in: 127.0.0.1:7003,127.0.0.1:7002
>>> Case 2: Moving all the 3300 slot keys to its owner 127.0.0.1:7001
Moving slot 3300 from 127.0.0.1:7003 to 127.0.0.1:7001:
>>> Setting 3300 as STABLE in 127.0.0.1:7003
Moving slot 3300 from 127.0.0.1:7002 to 127.0.0.1:7001:
>>> Setting 3300 as STABLE in 127.0.0.1:7002
>>> Check slots coverage...
[OK] All 16384 slots covered.

## 修正されたことを確認
$ redis-cli --cluster check 127.0.0.1:7001
127.0.0.1:7001 (f376c33f...) -> 0 keys | 5461 slots | 1 slaves.
127.0.0.1:7003 (04d8bc17...) -> 0 keys | 5461 slots | 1 slaves.
127.0.0.1:7002 (050eaa06...) -> 0 keys | 5462 slots | 1 slaves.
[OK] 0 keys in 3 masters.
0.00 keys per slot on average.
>>> Performing Cluster Check (using node 127.0.0.1:7001)
M: f376c33f688f7ea1559eaa75388e9f715d9f0647 127.0.0.1:7001
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
M: 04d8bc176f75e5d5282e4cc0a84b098386568515 127.0.0.1:7003
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
M: 050eaa06fccfb9af34946097e0a7c50a9871aae0 127.0.0.1:7002
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
S: 25932d5c629f85c13dee3eff58c0df474d550fab 127.0.0.1:7004
   slots: (0 slots) slave
   replicates f376c33f688f7ea1559eaa75388e9f715d9f0647
S: 9d40a2d225fcd390dc38924c6c06bf645593c2a2 127.0.0.1:7006
   slots: (0 slots) slave
   replicates 04d8bc176f75e5d5282e4cc0a84b098386568515
S: 2c13690333d8c77c9858a4bf565e3993e9ab9d74 127.0.0.1:7005
   slots: (0 slots) slave
   replicates 050eaa06fccfb9af34946097e0a7c50a9871aae0
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
```
</details>

## reshard

クラスタの2つのmaster間でslotを指定した数だけ移動させます。

* 引数
  * \<host>:\<port> or \<host> \<port>
対象クラスタのいずれかのノードのホスト・ポートを":"(コロン)か" "(スペース)区切りで指定します。
* オプション
  * --cluster-from \<node-id> 
移動元のmasterのnode idを指定します。
  * --cluster-to \<node-id> 
移動先のmasterのnode idを指定します。
  * --cluster-slots \<num> 
移動するslotの数を指定します。
  * --cluster-timeout \<int(milliseconds)>
キー移動のタイムアウト（ミリ秒）を指定します。
  * --cluster-pipeline \<num>
キー移動時に並列で一回に移動させるキー数を指定します。一回に移動させるキー数が多いと移動の完了が早くなりますが、Redisに負荷がかかる可能性があります。
  * --cluster-replace
移動先に同じキーが既に存在していたら置き換えます。このオプションを指定しなければ、同じキーが既に存在していたら処理が停止します。

```bash:書式
$ redis-cli --cluster reshard <host>:<port> --cluster-from <node-id> --cluster-to <node-id> --cluster-slots <num> [--cluster-yes] [--cluster-timeout <int(milliseconds)>] [--cluster-pipeline <num>] [--cluster-replace]
```

<details><summary>reshard使用例</summary>

```bash
## slotの移動
$ redis-cli --cluster reshard 127.0.0.1:7001 --cluster-from f376c33f688f7ea1559eaa75388e9f715d9f0647 --cluster-to 050eaa06fccfb9af34946097e0a7c50a9871aae0 --cluster-slots 1000
>>> Performing Cluster Check (using node 127.0.0.1:7001)
M: f376c33f688f7ea1559eaa75388e9f715d9f0647 127.0.0.1:7001
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
M: 04d8bc176f75e5d5282e4cc0a84b098386568515 127.0.0.1:7003
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
M: 050eaa06fccfb9af34946097e0a7c50a9871aae0 127.0.0.1:7002
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
S: 25932d5c629f85c13dee3eff58c0df474d550fab 127.0.0.1:7004
   slots: (0 slots) slave
   replicates f376c33f688f7ea1559eaa75388e9f715d9f0647
S: 9d40a2d225fcd390dc38924c6c06bf645593c2a2 127.0.0.1:7006
   slots: (0 slots) slave
   replicates 04d8bc176f75e5d5282e4cc0a84b098386568515
S: 2c13690333d8c77c9858a4bf565e3993e9ab9d74 127.0.0.1:7005
   slots: (0 slots) slave
   replicates 050eaa06fccfb9af34946097e0a7c50a9871aae0
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

Ready to move 1000 slots.
  Source nodes:
    M: f376c33f688f7ea1559eaa75388e9f715d9f0647 127.0.0.1:7001
       slots:[0-5460] (5461 slots) master
       1 additional replica(s)
  Destination node:
    M: 050eaa06fccfb9af34946097e0a7c50a9871aae0 127.0.0.1:7002
       slots:[5461-10922] (5462 slots) master
       1 additional replica(s)
  Resharding plan:
    Moving slot 0 from f376c33f688f7ea1559eaa75388e9f715d9f0647
    Moving slot 1 from f376c33f688f7ea1559eaa75388e9f715d9f0647
    Moving slot 2 from f376c33f688f7ea1559eaa75388e9f715d9f0647
    Moving slot 3 from f376c33f688f7ea1559eaa75388e9f715d9f0647
    Moving slot 4 from f376c33f688f7ea1559eaa75388e9f715d9f0647
    Moving slot 5 from f376c33f688f7ea1559eaa75388e9f715d9f0647
    Moving slot 6 from f376c33f688f7ea1559eaa75388e9f715d9f0647
    Moving slot 7 from f376c33f688f7ea1559eaa75388e9f715d9f0647
    Moving slot 8 from f376c33f688f7ea1559eaa75388e9f715d9f0647
    Moving slot 9 from f376c33f688f7ea1559eaa75388e9f715d9f0647
    Moving slot 10 from f376c33f688f7ea1559eaa75388e9f715d9f0647
...
    Moving slot 990 from f376c33f688f7ea1559eaa75388e9f715d9f0647
    Moving slot 991 from f376c33f688f7ea1559eaa75388e9f715d9f0647
    Moving slot 992 from f376c33f688f7ea1559eaa75388e9f715d9f0647
    Moving slot 993 from f376c33f688f7ea1559eaa75388e9f715d9f0647
    Moving slot 994 from f376c33f688f7ea1559eaa75388e9f715d9f0647
    Moving slot 995 from f376c33f688f7ea1559eaa75388e9f715d9f0647
    Moving slot 996 from f376c33f688f7ea1559eaa75388e9f715d9f0647
    Moving slot 997 from f376c33f688f7ea1559eaa75388e9f715d9f0647
    Moving slot 998 from f376c33f688f7ea1559eaa75388e9f715d9f0647
    Moving slot 999 from f376c33f688f7ea1559eaa75388e9f715d9f0647
Do you want to proceed with the proposed reshard plan (yes/no)? yes
Moving slot 0 from 127.0.0.1:7001 to 127.0.0.1:7002:
Moving slot 1 from 127.0.0.1:7001 to 127.0.0.1:7002:
Moving slot 2 from 127.0.0.1:7001 to 127.0.0.1:7002:
Moving slot 3 from 127.0.0.1:7001 to 127.0.0.1:7002:
Moving slot 4 from 127.0.0.1:7001 to 127.0.0.1:7002:
Moving slot 5 from 127.0.0.1:7001 to 127.0.0.1:7002:
Moving slot 6 from 127.0.0.1:7001 to 127.0.0.1:7002:
Moving slot 7 from 127.0.0.1:7001 to 127.0.0.1:7002:
Moving slot 8 from 127.0.0.1:7001 to 127.0.0.1:7002:
Moving slot 9 from 127.0.0.1:7001 to 127.0.0.1:7002:
Moving slot 10 from 127.0.0.1:7001 to 127.0.0.1:7002:
...
Moving slot 990 from 127.0.0.1:7001 to 127.0.0.1:7002:
Moving slot 991 from 127.0.0.1:7001 to 127.0.0.1:7002:
Moving slot 992 from 127.0.0.1:7001 to 127.0.0.1:7002:
Moving slot 993 from 127.0.0.1:7001 to 127.0.0.1:7002:
Moving slot 994 from 127.0.0.1:7001 to 127.0.0.1:7002:
Moving slot 995 from 127.0.0.1:7001 to 127.0.0.1:7002:
Moving slot 996 from 127.0.0.1:7001 to 127.0.0.1:7002:
Moving slot 997 from 127.0.0.1:7001 to 127.0.0.1:7002:
Moving slot 998 from 127.0.0.1:7001 to 127.0.0.1:7002:
Moving slot 999 from 127.0.0.1:7001 to 127.0.0.1:7002:


## slotが移動していることを確認
$ redis-cli --cluster check 127.0.0.1:7001
127.0.0.1:7001 (f376c33f...) -> 0 keys | 4461 slots | 1 slaves.
127.0.0.1:7003 (04d8bc17...) -> 0 keys | 5461 slots | 1 slaves.
127.0.0.1:7002 (050eaa06...) -> 0 keys | 6462 slots | 1 slaves.
[OK] 0 keys in 3 masters.
0.00 keys per slot on average.
>>> Performing Cluster Check (using node 127.0.0.1:7001)
M: f376c33f688f7ea1559eaa75388e9f715d9f0647 127.0.0.1:7001
   slots:[1000-5460] (4461 slots) master
   1 additional replica(s)
M: 04d8bc176f75e5d5282e4cc0a84b098386568515 127.0.0.1:7003
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
M: 050eaa06fccfb9af34946097e0a7c50a9871aae0 127.0.0.1:7002
   slots:[0-999],[5461-10922] (6462 slots) master
   1 additional replica(s)
S: 25932d5c629f85c13dee3eff58c0df474d550fab 127.0.0.1:7004
   slots: (0 slots) slave
   replicates f376c33f688f7ea1559eaa75388e9f715d9f0647
S: 9d40a2d225fcd390dc38924c6c06bf645593c2a2 127.0.0.1:7006
   slots: (0 slots) slave
   replicates 04d8bc176f75e5d5282e4cc0a84b098386568515
S: 2c13690333d8c77c9858a4bf565e3993e9ab9d74 127.0.0.1:7005
   slots: (0 slots) slave
   replicates 050eaa06fccfb9af34946097e0a7c50a9871aae0
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
```
</details>

## rebalance

クラスタのmaster全体でslotの数が均一に近づくように移動させます。
reshardコマンドはslotが移動するノードやslot数を明示的に指定するのに対して、rebalanceコマンドは自動で計算してslotを移動させます。

* 引数
  * \<host>:\<port> or \<host> \<port>
対象クラスタのいずれかのノードのホスト・ポートを":"(コロン)か" "(スペース)区切りで指定します。
* オプション
  * --cluster-weight \<node-id-1=weight-1 > ... \<node-id-N=weight-N>
スペース区切りで、ノードIDとノード毎のウェイトを指定します。指定しなければ全ノードで同じウェイトになります。
  * --cluster-use-empty-masters
slotの移動に空のmasterを含めます。
  * --cluster-timeout \<int(milliseconds)>
キー移動のタイムアウト（ミリ秒）を指定します。
  * --cluster-simulate
いわゆるdryrun機能です。指定するとrebalanceが行われるノードとslot数を確認できます。
  * --cluster-pipeline \<int>
キー移動時に並列で一回に移動させるキー数を指定します。一回に移動させるキー数が多いと移動の完了が早くなりますが、Redisに負荷がかかる可能性があります。
  * --cluster-threshold \<float>
ノード間で、slot数の差が何パーセント以内になるようにするか指定します。デフォルトは2.0%です。
  * --cluster-replace
移動先に同じキーが既に存在していたら置き換えます。オプションを指定していなければ処理が停止します。

```bash:書式
$ redis-cli --cluster rebalance <host>:<port> [--cluster-weight <node-id-1=weight-1> ... <node-id-N=weightN>] [--cluster-use-empty-masters] [--cluster-timeout <int(milliseconds)>] [--cluster-simulate] [--cluster-pipeline <int>] [--cluster-threshold <float>] [--cluster-replace]
```

<details><summary>rebalance使用例</summary>

```bash
## rebalance前のノード間でスロット数に偏りがある状態
$ redis-cli --cluster info 127.0.0.1:7001
127.0.0.1:7001 (f376c33f...) -> 1 keys | 4461 slots | 1 slaves.
127.0.0.1:7002 (050eaa06...) -> 3 keys | 6462 slots | 1 slaves.
127.0.0.1:7003 (04d8bc17...) -> 1 keys | 5461 slots | 1 slaves.
[OK] 5 keys in 3 masters.
0.00 keys per slot on average.


## --cluster-simulateを指定して、rebalanceが行われるノードとslot数を確認
$ redis-cli --cluster rebalance 127.0.0.1:7001 --cluster-simulate
>>> Performing Cluster Check (using node 127.0.0.1:7001)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
>>> Rebalancing across 3 nodes. Total weight = 3.00
Moving 1001 slots from 127.0.0.1:7002 to 127.0.0.1:7001
#################################################################################...

## rebalanceの実行
$ redis-cli --cluster rebalance 127.0.0.1:7001
>>> Performing Cluster Check (using node 127.0.0.1:7001)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
>>> Rebalancing across 3 nodes. Total weight = 3.00
Moving 1001 slots from 127.0.0.1:7002 to 127.0.0.1:7001
#################################################################################...

## rebalanceで偏りが解消されたことを確認
$ redis-cli --cluster info 127.0.0.1:7001
127.0.0.1:7001 (f376c33f...) -> 2 keys | 5462 slots | 1 slaves.
127.0.0.1:7002 (050eaa06...) -> 2 keys | 5461 slots | 1 slaves.
127.0.0.1:7003 (04d8bc17...) -> 1 keys | 5461 slots | 1 slaves.
[OK] 5 keys in 3 masters.
0.00 keys per slot on average.


## --cluster-weightオプションを使用する例。スロット数を2:1:1の割合にする場合
$ redis-cli --cluster rebalance 127.0.0.1:7001 --cluster-weight f376c33f688f7ea1559eaa75388e9f715d9f0647=2 050eaa06fccfb9af34946097e0a7c50a9871aae0=1  04d8bc176f75e5d5282e4cc0a84b098386568515=1
>>> Performing Cluster Check (using node 127.0.0.1:7001)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
>>> Rebalancing across 3 nodes. Total weight = 4.00
Moving 1365 slots from 127.0.0.1:7003 to 127.0.0.1:7001
#################################################################################...
Moving 1365 slots from 127.0.0.1:7002 to 127.0.0.1:7001
#################################################################################...

## スロット数が2:1:1の割合になっていることを確認
$ redis-cli --cluster info 127.0.0.1:7001
127.0.0.1:7001 (f376c33f...) -> 2 keys | 8192 slots | 1 slaves.
127.0.0.1:7002 (050eaa06...) -> 2 keys | 4096 slots | 1 slaves.
127.0.0.1:7003 (04d8bc17...) -> 1 keys | 4096 slots | 1 slaves.
[OK] 5 keys in 3 masters.
0.00 keys per slot on average.
```
</details>

## add-node

クラスタに新しいノードを追加します。

* 引数
  * \<new_host>:\<new_port>
新しく追加されるノードのホスト・ポートを":"(コロン)区切りで指定します。
  * \<existing_host>:\<existing_port>
既存クラスタのいずれかのノードのホスト・ポートを":"(コロン)区切りで指定します。
* オプション
  * --cluster-slave
replicaノードとしてクラスタに追加します。
  * --cluster-master-id <id>
masterノードのidを指定すると、指定したmasterノードのreplicaとしてクラスタに追加します。idを指定しなければ、自動で選択されたmasterノードのreplicaとしてクラスタに追加します。

```bash:書式
$ redis-cli --cluster add-node <new_host>:<new_port> <existing_host>:<existing_port> [--cluster-slave [--cluster-master-id <node-id>]]
```

<details><summary>add-node使用例</summary>

```bash
## 127.0.0.1:7007のノードreplicaとして追加
$ redis-cli --cluster add-node 127.0.0.1:7007 127.0.0.1:7001 --cluster-slave --cluster-master-id 050eaa06fccfb9af34946097e0a7c50a9871aae0
>>> Adding node 127.0.0.1:7007 to cluster 127.0.0.1:7001
>>> Performing Cluster Check (using node 127.0.0.1:7001)
M: f376c33f688f7ea1559eaa75388e9f715d9f0647 127.0.0.1:7001
   slots:[0-5461] (5462 slots) master
   1 additional replica(s)
S: 9d40a2d225fcd390dc38924c6c06bf645593c2a2 127.0.0.1:7006
   slots: (0 slots) slave
   replicates 04d8bc176f75e5d5282e4cc0a84b098386568515
M: 050eaa06fccfb9af34946097e0a7c50a9871aae0 127.0.0.1:7002
   slots:[5462-10922] (5461 slots) master
   1 additional replica(s)
S: 25932d5c629f85c13dee3eff58c0df474d550fab 127.0.0.1:7004
   slots: (0 slots) slave
   replicates f376c33f688f7ea1559eaa75388e9f715d9f0647
S: 2c13690333d8c77c9858a4bf565e3993e9ab9d74 127.0.0.1:7005
   slots: (0 slots) slave
   replicates 050eaa06fccfb9af34946097e0a7c50a9871aae0
M: 04d8bc176f75e5d5282e4cc0a84b098386568515 127.0.0.1:7003
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
>>> Send CLUSTER MEET to node 127.0.0.1:7007 to make it join the cluster.
Waiting for the cluster to join

>>> Configure node as replica of 127.0.0.1:7002.
[OK] New node added correctly.


## ノードが追加されたことを確認
$ redis-cli --cluster check 127.0.0.1:7001
127.0.0.1:7001 (f376c33f...) -> 0 keys | 5462 slots | 1 slaves.
127.0.0.1:7002 (050eaa06...) -> 0 keys | 5461 slots | 2 slaves.
127.0.0.1:7003 (04d8bc17...) -> 0 keys | 5461 slots | 1 slaves.
[OK] 0 keys in 3 masters.
0.00 keys per slot on average.
>>> Performing Cluster Check (using node 127.0.0.1:7001)
M: f376c33f688f7ea1559eaa75388e9f715d9f0647 127.0.0.1:7001
   slots:[0-5461] (5462 slots) master
   1 additional replica(s)
S: 9d40a2d225fcd390dc38924c6c06bf645593c2a2 127.0.0.1:7006
   slots: (0 slots) slave
   replicates 04d8bc176f75e5d5282e4cc0a84b098386568515
M: 050eaa06fccfb9af34946097e0a7c50a9871aae0 127.0.0.1:7002
   slots:[5462-10922] (5461 slots) master
   2 additional replica(s)
S: 25932d5c629f85c13dee3eff58c0df474d550fab 127.0.0.1:7004
   slots: (0 slots) slave
   replicates f376c33f688f7ea1559eaa75388e9f715d9f0647
S: 2c13690333d8c77c9858a4bf565e3993e9ab9d74 127.0.0.1:7005
   slots: (0 slots) slave
   replicates 050eaa06fccfb9af34946097e0a7c50a9871aae0
M: 04d8bc176f75e5d5282e4cc0a84b098386568515 127.0.0.1:7003
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
S: 88329eab80f2cda8cf38e1643e81aae12cebaf52 127.0.0.1:7007
   slots: (0 slots) slave
   replicates 050eaa06fccfb9af34946097e0a7c50a9871aae0
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
```
</details>

## del-node

クラスタからノードを削除します。

削除後も削除されたノードのRedisプロセスは動作しているので、必要に応じて別途プロセスを停止してください。

* 引数
  * \<host>:\<port>
対象クラスタのいずれかのノードのホスト・ポートを":"(コロン)区切りで指定します。
  * \<node_id>
削除するノードのIDを指定します。

```bash:書式
$ redis-cli --cluster del-node <host>:<port> <node_id>
```

<details><summary>del-node使用例</summary>

```bash
## ノード削除
$ redis-cli --cluster del-node 127.0.0.1:7007 88329eab80f2cda8cf38e1643e81aae12cebaf52
>>> Removing node 88329eab80f2cda8cf38e1643e81aae12cebaf52 from cluster 127.0.0.1:7007
>>> Sending CLUSTER FORGET messages to the cluster...
>>> Sending CLUSTER RESET SOFT to the deleted node.


## 削除されたことを確認
$ redis-cli --cluster check 127.0.0.1:7001
127.0.0.1:7001 (f376c33f...) -> 0 keys | 5462 slots | 1 slaves.
127.0.0.1:7002 (050eaa06...) -> 0 keys | 5461 slots | 1 slaves.
127.0.0.1:7003 (04d8bc17...) -> 0 keys | 5461 slots | 1 slaves.
[OK] 0 keys in 3 masters.
0.00 keys per slot on average.
>>> Performing Cluster Check (using node 127.0.0.1:7001)
M: f376c33f688f7ea1559eaa75388e9f715d9f0647 127.0.0.1:7001
   slots:[0-5461] (5462 slots) master
   1 additional replica(s)
S: 9d40a2d225fcd390dc38924c6c06bf645593c2a2 127.0.0.1:7006
   slots: (0 slots) slave
   replicates 04d8bc176f75e5d5282e4cc0a84b098386568515
M: 050eaa06fccfb9af34946097e0a7c50a9871aae0 127.0.0.1:7002
   slots:[5462-10922] (5461 slots) master
   1 additional replica(s)
S: 25932d5c629f85c13dee3eff58c0df474d550fab 127.0.0.1:7004
   slots: (0 slots) slave
   replicates f376c33f688f7ea1559eaa75388e9f715d9f0647
S: 2c13690333d8c77c9858a4bf565e3993e9ab9d74 127.0.0.1:7005
   slots: (0 slots) slave
   replicates 050eaa06fccfb9af34946097e0a7c50a9871aae0
M: 04d8bc176f75e5d5282e4cc0a84b098386568515 127.0.0.1:7003
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
```
</details>

## call

クラスタの各ノードに対してコマンドを実行します。

KEYSコマンドでクラスタ内のkey一覧を取得するなど、複数のノードに対してコマンドを実行したいときに使うと便利です。

:::note warn
KEYSコマンドは大量のキーが格納されている環境で実行するとRedisの高負荷を引き起こします。本番環境ではSCANコマンドで代替するなどして、KEYSは使用しないようにしてください。
:::

* 引数
  * \<host>:\<port>
対象クラスタのいずれかのノードのホスト・ポートを":"(コロン)区切りで指定します。
  * \<command> \<arg1> \<arg2> ...
実行するコマンドを指定します。
* オプション
  * --cluster-only-masters
Redis 6.0.8から追加されたオプション。
masterノードのみにコマンドを実行します。
  * --cluster-only-replicas
Redis 6.0.8から追加されたオプション。
replicaノードのみにコマンドを実行します。

```bash:書式
$ redis-cli --cluster call <host>:<port> <command> <arg1> <arg2> ... [--cluster-only-masters] [--cluster-only-replicas]
```

<details><summary>call使用例</summary>

```bash
## keysでキー一覧を確認
$ redis-cli --cluster call 127.0.0.1:7001 keys \* --cluster-only-masters
>>> Calling keys *
127.0.0.1:7001: key2
key3
127.0.0.1:7002: key5
key1
127.0.0.1:7003: key4

## 全ノードのコンフィグ変更と確認
$ redis-cli --cluster call 127.0.0.1:7001 config set maxmemory-policy allkeys-lru
>>> Calling config set maxmemory-policy allkeys-lru
127.0.0.1:7001: OK
127.0.0.1:7006: OK
127.0.0.1:7002: OK
127.0.0.1:7004: OK
127.0.0.1:7005: OK
127.0.0.1:7003: OK
$ redis-cli --cluster call 127.0.0.1:7001 config get maxmemory-policy
>>> Calling config get maxmemory-policy
127.0.0.1:7001: maxmemory-policy
allkeys-lru
127.0.0.1:7006: maxmemory-policy
allkeys-lru
127.0.0.1:7002: maxmemory-policy
allkeys-lru
127.0.0.1:7004: maxmemory-policy
allkeys-lru
127.0.0.1:7005: maxmemory-policy
allkeys-lru
127.0.0.1:7003: maxmemory-policy
allkeys-lru

## クラスタの全データ削除
$ redis-cli --cluster call 127.0.0.1:7001 flushall async --cluster-only-masters
>>> Calling flushall async
127.0.0.1:7001: OK
127.0.0.1:7002: OK
127.0.0.1:7003: OK
```
</details>

## set-timeout

クラスタの各ノードにcluster-node-timeoutを設定し、configファイルを上書きします。

cluster-node-timeoutは100ms以上に設定する必要があります。

:::note info
cluster-node-timeoutは、その間応答がないとノードがダウンしたとみなされる時間です。
masterノードであれば、この時間応答がないとフェイルオーバーが行われます。
:::

:::note info
特定のconfigを変更するためにredis-cliに用意されているのはset-timeoutコマンドのみですが、他のconfigを書き換えたい場合はcallコマンドの使用などで変更できます。
:::

* 引数
  * \<host>:\<port>
対象クラスタのいずれかのノードのホスト・ポートを":"(コロン)区切りで指定します。
  * \<int(milliseconds)>
cluster-node-timeout（単位：ミリ秒）を指定します。

```bash:書式
$ redis-cli --cluster set-timeout <host>:<port> <int(milliseconds)>
```

<details><summary>set-timeout使用例</summary>

```bash
## 20000ミリ秒に設定
$ redis-cli --cluster set-timeout 127.0.0.1:7001 20000
>>> Reconfiguring node timeout in every cluster node...
*** New timeout set for 127.0.0.1:7001
*** New timeout set for 127.0.0.1:7006
*** New timeout set for 127.0.0.1:7005
*** New timeout set for 127.0.0.1:7002
*** New timeout set for 127.0.0.1:7003
*** New timeout set for 127.0.0.1:7004
>>> New node timeout set. 6 OK, 0 ERR.
```
</details>

## import

別のRedisからデータをimportします。

import元はCluster構成ではないRedisである必要があります。

内部的にはMIGRATEコマンドを使用してimportしています。

:::note warn
importに成功した場合、import元のノードのキーは削除されます。これを防ぎたい場合は、--cluster-copyオプションを指定してください。
:::

* 引数
  * \<target_host>:\<target_port>
import先クラスタのいずれかのノードのホスト・ポートを":"(コロン)区切りで指定します。
* オプション
  * --cluster-from \<source_host>:\<source_port>
import元のノード情報を指定します。
  * --cluster-from-user \<username>
Redis 6.0から追加されたオプション。
import元のユーザ名を指定します。
  * --cluster-from-pass \<password>
Redis 6.0から追加されたオプション。
import元のパスワードを指定します。
  * --cluster-from-askpass
Redis 6.0から追加されたオプション。
コマンドラインでパスワードを指定する代わりに、実行時にプロンプトでパスワードを入力します。
  * --cluster-copy
import元のデータを削除しないようにします。
  * --cluster-replace
import先に同じキーが既に存在していたら置き換えます。このオプションを指定しなければ、同じキーが既に存在していたら処理が停止します。

```bash:書式
$ redis-cli --cluster import <target_host>:<target_port> --cluster-from <source_host>:<source_port> [--cluster-from-user <username>] [--cluster-from-pass <password>] [--cluster-from-askpass] [--cluster-copy] [--cluster-replace]
```

<details><summary>import使用例</summary>

```bash
## データのインポート
$ redis-cli --cluster import 127.0.0.1:7001 --cluster-from 127.0.0.1:7007
>>> Importing data from 127.0.0.1:7007 to cluster 127.0.0.1:7001
>>> Performing Cluster Check (using node 127.0.0.1:7001)
M: f376c33f688f7ea1559eaa75388e9f715d9f0647 127.0.0.1:7001
   slots:[0-5461] (5462 slots) master
   1 additional replica(s)
M: 04d8bc176f75e5d5282e4cc0a84b098386568515 127.0.0.1:7003
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
M: 050eaa06fccfb9af34946097e0a7c50a9871aae0 127.0.0.1:7002
   slots:[5462-10922] (5461 slots) master
   1 additional replica(s)
S: 25932d5c629f85c13dee3eff58c0df474d550fab 127.0.0.1:7004
   slots: (0 slots) slave
   replicates f376c33f688f7ea1559eaa75388e9f715d9f0647
S: 2c13690333d8c77c9858a4bf565e3993e9ab9d74 127.0.0.1:7005
   slots: (0 slots) slave
   replicates 050eaa06fccfb9af34946097e0a7c50a9871aae0
S: 9d40a2d225fcd390dc38924c6c06bf645593c2a2 127.0.0.1:7006
   slots: (0 slots) slave
   replicates 04d8bc176f75e5d5282e4cc0a84b098386568515
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
*** Importing 5 keys from DB 0
Migrating key5 to 127.0.0.1:7002: OK
Migrating key3 to 127.0.0.1:7001: OK
Migrating key1 to 127.0.0.1:7002: OK
Migrating key2 to 127.0.0.1:7001: OK
Migrating key4 to 127.0.0.1:7003: OK
```
</details>

## backup

Redis 6.0から追加されたコマンドです。

クラスタのデータを指定したディレクトリ配下にバックアップします。

各masterノードのRDBファイルと、クラスタの構成情報が記載されたnodes.jsonファイルを作成します。

:::note warn
現時点でバックアップからrestoreするようなコマンドは実装されていません。

また、クラスタの完全なバックアップを保存する場合は、nodes.jsonの情報だけでは不十分で、別途redis.confやその他の設定ファイルもバックアップする必要があります。

そのため、このコマンドはローカルに各masterノードのRDBファイルを作成する用途だけに使うことを推奨します。
:::

* 引数
  * \<host>:\<port>
対象クラスタのいずれかのノードのホスト・ポートを":"(コロン)区切りで指定します。
  * \<backup_dir>
バックアップを作成するディレクトリを指定します。事前に作成しておく必要があります。

```bash:書式
$ redis-cli --cluster backup <host>:<port> <backup_dir>
```

<details><summary>backup使用例</summary>

```bash
## バックアップ用ディレクトリ作成
$ mkdir tmp_bkup

## バックアップ実行
$ redis-cli --cluster backup 127.0.0.1:7001 tmp_bkup
>>> Performing Cluster Check (using node 127.0.0.1:7001)
M: f376c33f688f7ea1559eaa75388e9f715d9f0647 127.0.0.1:7001
   slots:[0-5461] (5462 slots) master
   1 additional replica(s)
M: 04d8bc176f75e5d5282e4cc0a84b098386568515 127.0.0.1:7003
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
M: 050eaa06fccfb9af34946097e0a7c50a9871aae0 127.0.0.1:7002
   slots:[5462-10922] (5461 slots) master
   1 additional replica(s)
S: 25932d5c629f85c13dee3eff58c0df474d550fab 127.0.0.1:7004
   slots: (0 slots) slave
   replicates f376c33f688f7ea1559eaa75388e9f715d9f0647
S: 2c13690333d8c77c9858a4bf565e3993e9ab9d74 127.0.0.1:7005
   slots: (0 slots) slave
   replicates 050eaa06fccfb9af34946097e0a7c50a9871aae0
S: 9d40a2d225fcd390dc38924c6c06bf645593c2a2 127.0.0.1:7006
   slots: (0 slots) slave
   replicates 04d8bc176f75e5d5282e4cc0a84b098386568515
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
>>> Node 127.0.0.1:7001 -> Saving RDB...
SYNC sent to master, writing 195 bytes to 'tmp_bkup/redis-node-127.0.0.1-7001-f376c33f688f7ea1559eaa75388e9f715d9f0647.rdb'
Transfer finished with success.
>>> Node 127.0.0.1:7003 -> Saving RDB...
SYNC sent to master, writing 187 bytes to 'tmp_bkup/redis-node-127.0.0.1-7003-04d8bc176f75e5d5282e4cc0a84b098386568515.rdb'
Transfer finished with success.
>>> Node 127.0.0.1:7002 -> Saving RDB...
SYNC sent to master, writing 195 bytes to 'tmp_bkup/redis-node-127.0.0.1-7002-050eaa06fccfb9af34946097e0a7c50a9871aae0.rdb'
Transfer finished with success.
Saving cluster configuration to: tmp_bkup/nodes.json
[OK] Backup created into: tmp_bkup


## バックアップディレクトリの中身
$ ls tmp_bkup/
nodes.json
redis-node-127.0.0.1-7001-f376c33f688f7ea1559eaa75388e9f715d9f0647.rdb
redis-node-127.0.0.1-7002-050eaa06fccfb9af34946097e0a7c50a9871aae0.rdb
redis-node-127.0.0.1-7003-04d8bc176f75e5d5282e4cc0a84b098386568515.rdb


## nodes.jsonの中身を確認
$ cat tmp_bkup/nodes.json
[
  {
    "name": "f376c33f688f7ea1559eaa75388e9f715d9f0647",
    "host": "127.0.0.1",
    "port": 7001,
    "replicate": null,
    "slots": [[0,5461]],
    "slots_count": 5462,
    "flags": "master",
    "current_epoch": 8
  },
  {
    "name": "04d8bc176f75e5d5282e4cc0a84b098386568515",
    "host": "127.0.0.1",
    "port": 7003,
    "replicate": null,
    "slots": [[10923,16383]],
    "slots_count": 5461,
    "flags": "master",
    "current_epoch": 3
  },
  {
    "name": "050eaa06fccfb9af34946097e0a7c50a9871aae0",
    "host": "127.0.0.1",
    "port": 7002,
    "replicate": null,
    "slots": [[5462,10922]],
    "slots_count": 5461,
    "flags": "master",
    "current_epoch": 7
  },
  {
    "name": "25932d5c629f85c13dee3eff58c0df474d550fab",
    "host": "127.0.0.1",
    "port": 7004,
    "replicate": "f376c33f688f7ea1559eaa75388e9f715d9f0647",
    "slots": [],
    "slots_count": 0,
    "flags": "slave",
    "current_epoch": 8
  },
  {
    "name": "2c13690333d8c77c9858a4bf565e3993e9ab9d74",
    "host": "127.0.0.1",
    "port": 7005,
    "replicate": "050eaa06fccfb9af34946097e0a7c50a9871aae0",
    "slots": [],
    "slots_count": 0,
    "flags": "slave",
    "current_epoch": 7
  },
  {
    "name": "9d40a2d225fcd390dc38924c6c06bf645593c2a2",
    "host": "127.0.0.1",
    "port": 7006,
    "replicate": "04d8bc176f75e5d5282e4cc0a84b098386568515",
    "slots": [],
    "slots_count": 0,
    "flags": "slave",
    "current_epoch": 3
  }
]
```
</details>

### バックアップしたデータの復旧

前述の通り、backupコマンド単体ではバックアップとして不完全ですが、取得したRDBファイルからデータを復旧する手順を記載します。

バックアップ前と同じRedisクラスタを構築している前提で、データを投入するだけの手順です。

<details><summary>backup復旧例</summary>

```bash
## バックアップディレクトリの中身
$ ls tmp_bkup/
nodes.json
redis-node-127.0.0.1-7001-f376c33f688f7ea1559eaa75388e9f715d9f0647.rdb
redis-node-127.0.0.1-7002-050eaa06fccfb9af34946097e0a7c50a9871aae0.rdb
redis-node-127.0.0.1-7003-04d8bc176f75e5d5282e4cc0a84b098386568515.rdb


## nodes.jsonの中身
$ cat tmp_bkup/nodes.json
[
  {
    "name": "f376c33f688f7ea1559eaa75388e9f715d9f0647",
    "host": "127.0.0.1",
    "port": 7001,
    "replicate": null,
    "slots": [[0,5461]],
    "slots_count": 5462,
    "flags": "master",
    "current_epoch": 8
  },
  {
    "name": "04d8bc176f75e5d5282e4cc0a84b098386568515",
    "host": "127.0.0.1",
    "port": 7003,
    "replicate": null,
    "slots": [[10923,16383]],
    "slots_count": 5461,
    "flags": "master",
    "current_epoch": 3
  },
  {
    "name": "050eaa06fccfb9af34946097e0a7c50a9871aae0",
    "host": "127.0.0.1",
    "port": 7002,
    "replicate": null,
    "slots": [[5462,10922]],
    "slots_count": 5461,
    "flags": "master",
    "current_epoch": 7
  },
  {
    "name": "25932d5c629f85c13dee3eff58c0df474d550fab",
    "host": "127.0.0.1",
    "port": 7004,
    "replicate": "f376c33f688f7ea1559eaa75388e9f715d9f0647",
    "slots": [],
    "slots_count": 0,
    "flags": "slave",
    "current_epoch": 8
  },
  {
    "name": "2c13690333d8c77c9858a4bf565e3993e9ab9d74",
    "host": "127.0.0.1",
    "port": 7005,
    "replicate": "050eaa06fccfb9af34946097e0a7c50a9871aae0",
    "slots": [],
    "slots_count": 0,
    "flags": "slave",
    "current_epoch": 7
  },
  {
    "name": "9d40a2d225fcd390dc38924c6c06bf645593c2a2",
    "host": "127.0.0.1",
    "port": 7006,
    "replicate": "04d8bc176f75e5d5282e4cc0a84b098386568515",
    "slots": [],
    "slots_count": 0,
    "flags": "slave",
    "current_epoch": 3
  }
]

## 事前にクラスタの各RedisノードでRedisを停止
$ redis-cli -h <host> -p <port> shutdown

## 各RDBファイルが対応するRedisノードを確認する
## RDBファイルの名前は redis-node-<host>-<port>-<node-id>.rdb の形式になっている
## node-id が、 nodes.json の中で、 name と一致する（flagがmasterの場合）か、replicate と一致する（flagがslaveの場合）、 host, port がそのRDBファイルの対応するノードとなる
## redis-node-127.0.0.1-7001-f376c33f688f7ea1559eaa75388e9f715d9f0647.rdb だと、host:port が 127.0.0.1:7001 と 127.0.0.1:7004 のノードが対応するノードとなる

## 対応するノードのRDBファイルのパスにバックアップファイルを移動する（別ホストに移動する場合はscpコマンドを使用する）
## RDBファイルのパスは、redis.confではdbfilenameの設定になる
$ cp tmp_bkup/<バックアップしたRDBファイル> <dbfilenameのパス>

## Redisを起動
$ redis-server <redis.confのパス>

## 復旧されているか確認（想定されるキーが入っていたらOK）
$ redis-cli  -h <host> -p <port> info keyspace
# Keyspace
db0:keys=2,expires=0,avg_ttl=0
```
</details>