redis クラスターの拡張

背景紹介

e コマース プロジェクトのダブル 11 期間中は、通常、より多くの同時実行性があり、redis 要求に対するプレッシャーが急増し、外部サービスを提供するためにより多くの redis が必要になります. しかし、ダブル 11 の後、redis に対するプレッシャーは急激に低下します.コスト、一部のパーツは redis サービスを撤回する必要があります! Redis クラスター ノードを追加および削除することで、Redis クラスターの動的な拡張と縮小を実現し、Redis クラスターの高可用性を向上させることができます。
元のクラスター (下の図を参照) は 6 つのノードで構成され、6 つのノードは 3 つのマシン (このケースは 1 つのマシンでのみ示されています!) に分散され、3 つのマスターと 3 つのスレーブのモードを採用しています。
ここに画像の説明を挿入
クラスタ拡張をシミュレートするために、元のクラスタをベースに、マスター (8007) とスレーブ (8008) を追加します. ノードを追加した後のクラスタについては、下の図を参照してください. クラスタを作成し、クラスタの状態が正常かどうかを観察します
ここに画像の説明を挿入
.正常であれば、容量を増減できます。
起動が成功したら、cluster nodesコマンドでノードのステータスを確認します
ここに画像の説明を挿入
. 上の図からわかるように、クラスタ全体が正常に動作しています. 3 つのマスター ノードと 3 つのスレーブ ノードがあります. ポート 8001 のインスタンス ノードは、からのハッシュ スロットを格納しますポート 8002 のインスタンス ノードは 5461 ~ 10922 のハッシュ スロットを格納し、ポート 8003 のインスタンス ノードはこれらのハッシュ スロット 10923 ~ 16383 を格納します。これら 3 つのマスター ノードによって格納されるすべてのハッシュ スロットは、redis のストレージ スロットを形成します。クラスタであり、スレーブ ポイントは、ストレージ スロットを表示するのではなく、各マスター ノードのバックアップ スレーブ ノードです。

2. Redis クラスターの拡張

元のクラスターが起動し、正常であることが確認されたら、元のクラスターにマスター (8007) とスレーブ (8008) を追加して、クラスターの拡張を実現します。手順は次のとおりです。

2.1 redis インスタンスの追加

/usr/local/redis-cluster の下にフォルダー 8007 および 8008 を作成し、フォルダー 8001 の下の redis.conf ファイルをフォルダー 8007 および 8008 にコピーします。具体的な手順は次のとおりです。

mkdir 8007 8008
cd 8001
cp redis.conf /usr/local/redis-cluster/8007/
cp redis.conf /usr/local/redis-cluster/8008/

# 修改8007文件夹下的redis.conf配置文件
vim /usr/local/redis-cluster/8007/redis.conf
# 修改如下内容:
port:8007
dir /usr/local/redis-cluster/8007/
cluster-config-file nodes-8007.conf
pidfile /var/run/redis_8007.pid


# 修改8008文件夹下的redis.conf配置文件
vim /usr/local/redis-cluster/8008/redis.conf
修改内容如下:
port:8008
dir /usr/local/redis-cluster/8008/
cluster-config-file nodes-8008.conf
pidfile /var/run/redis_8008.pid

# 启动8007和8008俩个服务并查看服务状态
/usr/local/redis-5.0.3/src/redis-server /usr/local/redis-cluster/8007/redis.conf
/usr/local/redis-5.0.3/src/redis-server /usr/local/redis-cluster/8008/redis.conf
ps -el | grep redis

起動が完了した後、2 つのノード 8007 と 8008 はまだ空き状態であり、まだ redis クラスターに参加していません!

2.2 8007 をマスター ノードとして構成する

redis-cli の add-node コマンドを使用して、新しいマスター ノード 8007 (マスター) を追加します。前の ip:port は新しいノードであり、後者の ip:port はクラスター内の既存のノードです。

src/redis-cli --cluster add-node 192.168.100.100:8007 192.168.100.100:8001

このプロセスは、ゴシップ プロトコルの会議コマンドを通じて操作されます。

meet:某个节点发送meet给新加入的节点,让新节点加入集群中,然后新节点就会开始与其他节点进行通信;

最後に、ログの最後に「[OK] New node added successfully.」というプロンプトが表示されるので、新しいノードが正常に追加されたことを意味します
ここに画像の説明を挿入
。注
ここに画像の説明を挿入
: ノードが正常に追加された場合、新しく追加されたノードにはデータがありません。スロット (ハッシュ スロット) が割り当てられていないため、新しいノードには手動でハッシュ スロットを割り当てる必要があります。redis-cli の rehash コマンドを使用して 8007 のハッシュ スロットを割り当て、クラスター内の任意のマスター ノードを見つけて再シャーディングします。

src/redis-cli --cluster reshard 192.168.100.100:8001

上記のコマンドを実行すると、スロットを手動で割り当てるプロセスに入ります。割り当ての詳細は次のとおりです。

... ...
How many slots do you want to move (from 1 to 16384)? 600
(ps:需要多少个槽移动到新的节点上,自己设置,比如600个hash槽)
What is the receiving node ID? 2728a594a0498e98e4b83a537e19f9a0a3790f38
(ps:把这600个hash槽移动到哪个节点上去,需要指定节点id)
Please enter all the source node IDs.(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.(输入'all'以使用所有节点作为散列槽的源节点。输入所有源节点id后,键入'done')
Source node 1:all
(ps:输入all为从所有主节点(8001,8002,8003)中分别抽取相应的槽数指定到新节点中,抽取的总槽数为600个)
 ... ...
Do you want to proceed with the proposed reshard plan (yes/no)? yes
(ps:输入yes确认开始执行分片任务)
... ...

スロットの割り当てが完了したら、クラスター ノード コマンドを再度実行して、次のようにノードのステータスを表示します。
ここに画像の説明を挿入
注: スロットが移行されると、対応するスロットのデータも移行されます。
ここのところ!8007Master ノードが正常にクラスターに参加しました!

2.3 8007 のスレーブ ノードとして 8008 を構成する

8008 ノードを繰り返してクラスター コマンド add-node に参加します。

src/redis-cli --cluster add-node 192.168.100.100:8008 192.168.100.100:8001

cluster nodes コマンドを使用して、ノードの状態を表示します
ここに画像の説明を挿入
。8008 にもスロットが割り当てられていないことがわかりますが、8008 ノードは 8007 のスレーブ ノードになるため、8008 ノードにスロットを割り当てる必要はありません。8008 ノードのマスター/スレーブ関係を構成するには、8008 ノードのクライアントに接続し、クラスター コマンドの複製を使用して、現在の 8008 (スレーブ) ノードをマスター ノード (以前に作成した 8007 マスター ノード) に割り当てる必要があります。ノードはここで使用されます)、コマンドは次のとおりです。

# 进入8008的客户端
[root@CentOS7 redis-6.0.9]# src/redis-cli  -p 8008

# 在8008客户端下指定8008节点的主从关系
# 4b339ad25b4884c2ff6de8a8ec2bc8766f8faf0b 是8007节点的id
127.0.0.1:8008> cluster replicate 4b339ad25b4884c2ff6de8a8ec2bc8766f8faf0b

次に、cluster nodes コマンドでノードのステータスを確認すると、
ここに画像の説明を挿入
8008 が 8007 のスレーブ ノードになり、クラスタ ノードの拡張が完了したことがわかります。

3. Redis クラスターの縮小

Redis クラスターの縮小は、実際にはいくつかのクラスター ノードを削除することです. ここでは、上で追加した 8007 と 8008 で構成されるクラスター ノードを削除して、クラスターの縮小をテストします!

3.1 最初にスロットデータを返す

マスター ノード 8007 にはハッシュ スロットが割り当てられているため、まず 8007 のハッシュ スロットを他の使用可能なマスター ノードに配置し、次にノードを削除する必要があります。そうしないと、データの損失が発生します (現在、マスターのデータは 1 つのノードにのみ移行できます)。ノード、一時的に平均分散機能を実行できません)、実行コマンドは次のとおりです。

src/redis-cli  --cluster reshard 192.168.100.100:8007
 ... ...
How many slots do you want to move (from 1 to 16384)? 600
What is the receiving node ID? baf0c2f3afde2410e34351a8261a703f1394cee9
(ps:这里是需要把数据移动到哪?8001的主节点id)
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:4b339ad25b4884c2ff6de8a8ec2bc8766f8faf0b
(ps:这里是需要数据源,也就是我们的8007节点id)
Source node 2:done
(ps:这里直接输入done 开始生成迁移计划)
 ... ...
Do you want to proceed with the proposed reshard plan (yes/no)? Yes
(ps:这里输入yes开始迁移)

これまでのところ、8007 マスター ノードのデータを 8001 に正常に移行しました。下の図に示すように、現在のクラスター ステータスを確認できます。8007 の下にハッシュ スロットがないことがわかります。これは、それを証明しています。移行は成功しました。
ここに画像の説明を挿入

3.2 ノード 8007 の削除

最後に、del-node コマンドを直接使用して、8007 マスター ノードを削除できます。

src/redis-cli  --cluster del-node 192.168.100.100:8007 4b339ad25b4884c2ff6de8a8ec2bc8766f8faf0b

最後にcluster nodesコマンドでノードの状態を確認し、元の状態に戻っていれば縮小成功です!

4. Redis - reshard のバグを解決: Syntax error, try CLIENT (LIST|KILL|GETNAME|SETNAME|PAUSE|REPLY)

キー値を持つスロットを移行する場合、redis-trib.rb reshardコマンドを実行するとエラーが発生します:
エラーの内容は次のとおりです: Syntax error, try CLIENT (LIST|KILL|GETNAME|SETNAME|PAUSE|REPLY)
but when mirating a slot without without Key-Value は正常に実行されます。これは、キー値の存在に問題があることを示しています。

解決

rb ファイルの移行ステートメントを
次のように変更するだけです。 : keys,*keys])
source.r.call(["migrate",target.info[:host],target.info[:port],"",0,@timeout,:replace,:keys,*keys ] )
つまり、clientCommand を実行せずに、migrateCommand を直接実行します。

おすすめ

転載: blog.csdn.net/yzx3105/article/details/130484920