1. ホーム
  2. データベース
  3. レディス

Redisクラスタのマスターノードとスレーブノードを縮小する詳細チュートリアル

2022-01-20 13:23:16

Redisクラスタのマスターノードとスレーブノードを縮小する

1. クラスター縮小の概念

プロジェクトの圧力が高すぎるときは、ノードを追加して負荷を上げる必要があり、プロジェクトの圧力があまり高くないときは、他のプロジェクトに対してクラスタを縮小できるようにもしたい、そのためにクラスタの縮小を利用することになる

クラスターシュリンクの操作は、クラスターエクスパンションと同じで、方向を逆にするだけです。

拡張は1回実行すればスロット移行が成功しますが、縮小はマスターノードが複数ある場合、例えばオフラインにするノードを削除してマスターノードが3台ある場合は3回実行する必要があり、移行するためのスロット充填数も3で割って、各ノードにも均等に分散させる必要があります。

縮小する場合、まず分割するスロット数を記入し、次に分割する相手を記入し、最後に分割元を記入する。一般に、いくつのスロットを分割するかは、オフラインにするホストにいくつのスロットがあるかによって決まり、それをクラスタマスターノードの数で割って、各ホストポイントに同じ数のスロットを割り当てるようにします。誰に割り当てるかを記入する場合、1回目は第1マスターノードのIDを記入し、2回目は第2マスターノードのIDを記入する。誰に割り当てるかを記入する場合、1回目は第1マスターノードのIDを記入し、2回目は第2マスターノードのIDを記入し、最後にスロット提供ノードのID(下流ノードのID番号)を記入する。

クラスタが縮小してスロットを拡張しても、データに影響はありません。

クラスタ縮小のソース側はオフラインになるマスターノードで、ターゲット側はオンラインになるマスターノード(割り当て先のノード)です。
はっきり言って、マスターノードしかスロットを持っていないので、それならマスターノードのスロットを他のマスターノードに割り当てる必要があり、スロットがクリアされたら、このホストノードはオフラインになることができるのです。

シュリンククラスターのビフォーアフター比較

クラスターシュリンクの操作手順。

1. reshardコマンドを実行して、オフラインにする必要があるマスターノードをスロット分散させます。

2. 2. 複数のマスターノードに対して reshard コマンドを数回実行し、最初に分散させるスロット数を記入し、次に誰に、最後にどこから分散させるか記入します。

3. スロット分散が完了し、オフラインにするマスターノードにデータがない場合、そのノードはクラスタから削除されます。

クラスター情報

現在、クラスタは4つのマスターと4つのスレーブの8つのノードを持っています。このクラスタを3マスター、3スレーブに変更し、他のプログラムが使用できるように2ノードを縮小する必要があります。

2. クラスタから6390マスターノードを縮小する

2.1. 各ノードに割り当てる必要のあるスロット数を計算する

6390ノードには4096のスロットがあり、オフラインにする6390ノードを削除しても、マスターノードが3つあることがわかります。4096を3で割ると1365となり、スロットを割り当てる際、各ノードに1365スロットを均等に割り当てることができます。

2.2. 192.168.81.210 のノード 6380 に 1365 スロットを割り当てる。

192.168.81.240 のノード 6390 から 192.168.81.210 のノード 6380 へ 1365 スロットを割り当てる必要があります。

192.168.81.210の6380のノードIDとして、割り当てられたスロットが誰に行くかを参照しながら、受信ノードIDは何かと記入するだけです。

次に送信元ノードには、192.168.81.240の6390ノードのIDを記入します。これは1365スロットを他のノードに割り当てるノードを意味します。

[root@redis-1 /data/redis_cluster/redis-3.2.9/src]# . /redis-trib.rb reshard 192.168.81.210:6380
How many slots do you want to move (from 1 to 16384)? 1365 # How many slots are allocated

What is the receiving node ID? 80e256579658eb256c5b710a3f82c439665794ba #assign the slot to that node

Please enter all the source node IDs.
  Type 'all' to use all the nodes as source nodes for the hash slots.
  Type 'done' once you entered all the source nodes IDs.
Source node #1:6bee155f136f40e28e1f60c8ddec3b158cd8f8e8 # from which node the slots are split
Source node #2:done

Do you want to proceed with the proposed reshard plan (yes/no)? yes #enter yes to continue

以下は、ノードを縮小する過程のスクリーンショットです。

データ移行作業。

スロット分割移行に成功しました。

2.3. 192.168.81.220 のノード 6380 に 1365 スロットを割り当てます。

[root@redis-1 /data/redis_cluster/redis-3.2.9/src]# . /redis-trib.rb reshard 192.168.81.210:6380
How many slots do you want to move (from 1 to 16384)? 1365 # How many slots are allocated

What is the receiving node ID? 10dc7f3f9a753140a8494adbbe5a13d0026451a1 #assign the slot to that node

Please enter all the source node IDs.
  Type 'all' to use all the nodes as source nodes for the hash slots.
  Type 'done' once you entered all the source nodes IDs.
Source node #1:6bee155f136f40e28e1f60c8ddec3b158cd8f8e8 # from which node the slots are split
Source node #2:done

Do you want to proceed with the proposed reshard plan (yes/no)? yes #enter yes to continue


シュリンクの様子を撮影した画面。



2.4. 192.168.81.230 のノード 6380 に 1365 スロットを割り当てる。

[root@redis-1 /data/redis_cluster/redis-3.2.9/src]# . /redis-trib.rb reshard 192.168.81.210:6380
How many slots do you want to move (from 1 to 16384)? 1366 # how many slots to allocate

What is the receiving node ID? a4381138fdc142f18881b7b6ca8ae5b0d02a3228 #assign the slot to that node

Please enter all the source node IDs.
  Type 'all' to use all the nodes as source nodes for the hash slots.
  Type 'done' once you entered all the source nodes IDs.
Source node #1:6bee155f136f40e28e1f60c8ddec3b158cd8f8e8 # from which node the slots are split
Source node #2:done

Do you want to proceed with the proposed reshard plan (yes/no)? yes #enter yes to continue

シュリンクの様子を撮影した画面。


最後のノードがデータを移行すると、マスターノードのスロット数6390が0になります。

2.5. 現在のクラスタスロットの割り当てを表示

もうすぐオフラインになる6390台のホストからスロットとデータが移行されたので、クラスタの3つのマスターノードの現在のスロット数を見ることができます。

マスターノード1台あたりのスロット数が5461になったことがよくわかると思います。

あなたは、順序の後にスロットの再配置は非常に満足されていないと感じた場合は、reshardの実装では、スロットの他のノードは、6380の210は、スロットが0から16383であり、その後210スロットでノードが5461に分け、ノードの順序が同じである後に分割するように、6380に192.168.81.210に分かれています" 。

3. データ移行プロセスでデータの異常が発生していないことを確認する

データスロットの移行を行うためのウィンドウ、鍵の作成を続けるためのウィンドウ、鍵作成の進捗状況を見るためのウィンドウ、鍵のデータを見るためのウィンドウを、さらに複数開いてください。
継続的にテストした結果、データに例外はなく、すべてOKの表示でした。

4. オフラインのマスターノードをクラスタから削除する

4.1. ノードの削除

ノードを削除するには、redis-tribを使用します。ノードにレプリケーション関係がある場合、ノードが現在のノードをレプリケートしている場合、または現在のノードが他のノードのデータをレプリケートしている場合、redis-tribは自動的にレプリケーション関係を処理してからノードを削除し、ノードの削除によって対応するプロセスも停止させることができます。

削除する前に、ノードにスロットやデータがないことを確認する必要があり、そうでない場合は削除に失敗します。

コマンドを

. /redis-trib.rb del-node node IP:port ID
[root@redis-1 /data/redis_cluster/redis-3.2.9/src]# . /redis-trib.rb del-node 192.168.81.240:6390 6bee155f136f40e28e1f60c8ddec3b158cd8f8e8
>>> Removing node 6bee155f136f40e28e1f60c8ddec3b158cd8f8e8 from cluster 192.168.81.240:6390
>>> Sending CLUSTER FORGET messages to the cluster...
>>> SHUTDOWN the node.

[root@redis-1 /data/redis_cluster/redis-3.2.9/src]# . /redis-trib.rb del-node 192.168.81.240:6391 f6b9320dfbc929ad5a31cdb149360b0fd8de2e60
>>> Removing node f6b9320dfbc929ad5a31cdb149360b0fd8de2e60 from cluster 192.168.81.240:6391
>>> Sending CLUSTER FORGET messages to the cluster...
>>> SHUTDOWN the node.

[root@redis-1 ~]# redis-cli -h 192.168.81.230 -p 6381
192.168.81.230:6381> CLUSTER REPLICATE 80e256579658eb256c5b710a3f82c439665794ba
OK


4.2. マスター・スレーブ間のクロスレプリケーションを調整する

192.168.81.240 サーバーの 2 つの redis ノードを削除した後、192.168.81.210 サーバーの 6380 はレプリケーション関係がないため、192.168.81.230 の 6381 ノードを 192.168.81.210 の 6380 ノードにレプリケーションする必要があります。

[root@redis-1 /data/redis_cluster/redis-3.2.9/src]# . /redis-trib.rb del-node 192.168.81.220:6380 10dc7f3f9a753140a8494adbbe5a13d0026451a1
>>> Removing node 10dc7f3f9a753140a8494adbbe5a13d0026451a1 from cluster 192.168.81.220:6380
[Reshard data away and try again.

4.3. ノードが存在する場合、データを削除することはできません

[root@redis-1 /data/redis_cluster/redis-3.2.9/src]# . /redis-trib.rb del-node 192.168.81.220:6380 10dc7f3f9a753140a8494adbbe5a13d0026451a1
>>> Removing node 10dc7f3f9a753140a8494adbbe5a13d0026451a1 from cluster 192.168.81.220:6380
[Reshard data away and try again.

5. オフラインのホストからクラスタ情報を空にする

redis-tribはノードをクラスタから削除することはできますが、そのクラスタ情報を空にすることはできません。クラスタ情報が残っている場合、接地したホストは他のクラスタに参加できません。

オフラインのredisノードでcluster resetを使って、クラスタ情報を削除するだけです。

192.168.81.240:6390> CLUSTER reset

OK

Redis Cluster Shrinkのマスターノードとスレーブノードについての記事は以上です。Redis Cluster Shrinkの詳細については、過去の記事を検索するか、引き続き以下の記事を参照してください。