[[332217]] この記事は、Lao A が執筆した WeChat 公開アカウント「移民労働者の技術の道」から転載したものです。この記事を転載する場合は、移民労働者の技術の道の公開アカウントにご連絡ください。 原理: - Redis クラスターは、一貫性のあるハッシュ スロットを使用して、クラスター内の各マスター ノードに特定のハッシュ スロットを割り当て、書き込まれたデータをハッシュして、マスター ノードに割り当てて保存します。
- クラスターは、式 (CRC16 キー) & 16384 を使用して、そのスロットのキー データを計算します。
- 16384 個のスロットが各ノードに均等に分散されます。
- クラスター内の各マスターノードは、データが保存されるスロットの一部のメンテナンスを担当します。高可用性を実現するために、各マスター ノードには少なくとも 1 つのスレーブ ノードがあります。
ノード通信モード: - クラスター ノード間の通信と情報交換のためにポート番号 + 10000 を開きます。
- デフォルトでは、各ノードはランダムに 5 つのノードを選択し、1 秒あたり 10 回 ping メッセージを送信して、独自の情報と既知のクラスター情報を渡します。 ping メッセージを受信した後、応答として pong メッセージを返します。最終的に、このランダムなメッセージ交換を通じて、各ノードは最終的にすべての情報を取得します。
- マスター ノードがクラッシュすると、すべてのノードがマスター ノードがクラッシュしたことを認識します。マスター ノードのスレーブ ノードはマスター ノードの作業を引き継ぎ、マスターになったことを他のすべてのノードに通知します。このようにして、他の生き残ったノードはそれぞれが保持している情報テーブルを更新し、スレーブ ノードがマスターとして引き継ぎます。すべてが失敗した場合、クラスターはエラーを報告します。ノードから操作する場合、データは一貫性のあるハッシュ計算後にマスターノードの 1 つに保存され、スレーブノードはマスターのデータを同期します。
- Redis クラスターは分散化されています。クラスター内の各ノードは同等であり、各ノードは独自のデータとクラスター全体のステータスを保存します。すべてのノードは他のすべてのノードに接続されており、これらの接続はアクティブなままです。
- クラスターを構築すると、各シャードのマスター ノードに対応するスレーブ ノードが存在します。 slaveof機能を実装し、マスターノードがダウンした場合にsentinelの自動フェイルオーバー切り替え機能を実装する
Redis 分散クラスター (デプロイメント): ポート番号: 7000-7005 この分散シャーディング クラスターは単一の Linux システム上に構築でき、クラスター構成として複数のインスタンスをインストールするだけで済みます。 Ruby 環境サポートをインストールします。 - yum -y ruby rubygemsをインストール
Yumはバージョン2.0.0をインストールしますが、gemはバージョン2.2.2以上が必要なので、コンパイルを選択します。 Ruby 環境をダウンロードしてインストールします。 - https://cache.ruby-lang.org/pub/ruby/2.6/ruby-2.6.1.tar.gz を取得します。
- tar xf ruby-2.6.1.tar.gz && cd ruby-2.6.1/
- ./configure
- make && make install && echo $?
- echo 'export PATH=$PATH:/usr/local/ruby/bin' >> /etc/profile
- ソース /etc/profile
gemツールの国内ソースを変更します。 - # gemツールのソースアドレスを表示する
- gem ソース -l
- # Alibaba Cloud gemツールソースを追加する
- gem ソース -a http://mirrors.aliyun.com/rubygems/
- # gemツールのデフォルトの外部ソースを削除する
- gem ソース
- # クラスタープラグインの最新バージョンをダウンロードする
- gem をインストール redis -v 4.1.0
クラスターノードの準備: - mkdir /data/700{0..5}
ポート 7000 インスタンスを構成します。 - vim /data/7000/redis.conf
- ポート 7000
- 悪魔化する はい
- pidファイル /data/7000/redis.pid
- ログレベル通知
- ログファイル"/data/7000/redis.log"
- dbファイル名 dump.rdb
- ディレクトリ /data/7000
- 保護モードなし
- クラスタ対応 はい
- クラスター構成ファイル nodes.conf
- クラスターノードタイムアウト 5000
- 追加のみ はい
他のポートインスタンスをコピーします: - # 設定ファイルをコピーする
- cp /data/7000/redis.conf /data/7001/
- cp /data/7000/redis.conf /data/7002/
- cp /data/7000/redis.conf /data/7003/
- cp /data/7000/redis.conf /data/7004/
- cp /data/7000/redis.conf /data/7005/
-
- # 設定ファイルの内容を変更する
- sed -i 's#7000#7001#g' /data/7001/redis.conf
- sed -i 's#7000#7002#g' /data/7002/redis.conf
- sed -i 's#7000#7003#g' /data/7003/redis.conf
- sed -i 's#7000#7004#g' /data/7004/redis.conf
- sed -i 's#7000#7005#g' /data/7005/redis.conf
すべてのインスタンスを起動します: - redis サーバー /data/7000/redis.conf
- redis サーバー /data/7001/redis.conf
- redis サーバー /data/7002/redis.conf
- redis サーバー /data/7003/redis.conf
- redis サーバー /data/7004/redis.conf
- redis サーバー /data/7005/redis.conf
コマンド ソフト リンクを作成します。 (このコマンドは古いので、現在は redis-cli コマンドを使用してください) (オプションの実行コマンド) - ln -s /usr/ローカル/redis-5.0.2/src/redis-trib.rb /usr/sbin/
プロセスを表示: - ps -ef |grep redis-server
すべてのインスタンス ノードをクラスター管理に追加します。 - #
- redis-cli
分散マスター/スレーブ ルールでは、最初の 3 つのインスタンス ノードがマスターであり、対応する 3 つのインスタンス ノードがスレーブ ノードになります。レプリカが 2 つある場合は、インスタンス ノードをさらに 3 つ追加します。 マスターノードのステータスを確認します。 - redis-cli -p 7000 クラスターノード|grep マスター
スレーブノードのステータスを確認します。 - redis-cli -p 7000 クラスターノード|grep スレーブ
Redis 分散クラスタ (管理) クラスター ノードを追加するための準備: - mkdir /data/700{6..7}
-
- 他のポートインスタンスをコピーします:
-
- # 設定ファイルをコピーする
- cp /data/7000/redis.conf /data/7006/
- cp /data/7000/redis.conf /data/7007/
-
- # 設定ファイルの内容を変更する
- sed -i 's#7000#7006#g' /data/7006/redis.conf
- sed -i 's#7000#7007#g' /data/7007/redis.conf
新しいノードインスタンスを開始します。 - redis サーバー /data/7006/redis.conf
- redis サーバー /data/7007/redis.conf
プロセスを表示: - ps -ef |grep redis-server
マスターノードを追加します: (7000 インスタンスは管理ノードです) - #'インスタンス 7000 のマスター ノードが配置されているクラスターにインスタンス 7006 を追加します (この時点ですでに 4 つのマスター ノードがあります)
- redis-cli
マスターノードのステータスを確認します。 - redis-cli -p 7000 クラスターノード|grep マスター
転送スロット(再シャード): - #'クラスタ管理ノードを操作して再割り当てし、対話型インターフェースでシャードサイズを指定してシャードを受け取るノードIDを選択します
- redis-cli
-
- スロットをいくつにしたいですか? 移動( 1から16384まで)? 4096
- #データシャードの合計サイズをマスターノードの数で割って手動で計算します
-
- 受信ノードIDは何ですか? 2129d28f0a86fc89571e49a59a0739812cff7953
- #データシャードを受け取るノードIDを選択します(これは新しく追加されたノード7006インスタンスのID番号です)
-
- ソースノード #1:すべて
- #新しいマスターノードに再シャーディングするソースマスターノードを選択します( allはすべてのノードです)
-
- 提案されたリシャード計画を続行しますか(はい/いいえ)?はい
- #上記の変更を確認してください
マスターノードのステータスを再確認します: (クラスターデータの再シャーディングを確認できます) - redis-cli -p 7000 クラスターノード|grep マスター
スレーブノードを追加します。 - #'7007インスタンスノードを7006インスタンスマスターノードに追加し、対応する7006インスタンスマスターノードをクラスターの管理ノードに配置するように指定します
- redis-cli
スレーブノードのステータスを確認します。 - redis-cli -p 7000 クラスターノード|grep スレーブ
クラスターノードの削除準備: 削除するノードのデータ シャードを移動します。 - #'クラスタ管理ノードを操作して再割り当てし、対話型インターフェースでシャードサイズを指定してシャードを受け取るノードIDを選択します
- redis-cli
-
- #方法は、シャードの場所に応じてマスターノードを削除し、1つのグループを1つのノードに移動するか、すべてのデータスライスを1つのノードに直接移動することです。
-
- スロットをいくつにしたいですか? 移動( 1から16384まで)? 1365
- #データシャードの合計サイズを手動で確認する
-
- 受信ノードIDは何ですか? e64f9074a3733fff7baa9a4848190e56831d5447
- #データシャードを受け取るノードIDを選択します(これは新しく追加されたノード7006インスタンスのID番号です)
-
- ソースノード #1: 2129d28f0a86fc89571e49a59a0739812cff7953
- #新しいマスターノードに再シャーディングするソースマスターノードを選択します(これは削除するマスターノードのID番号です)
-
- ソースノード #2: 完了
- #これは終了コマンドです
-
- 提案されたリシャード計画を続行しますか(はい/いいえ)?はい
- #上記操作の変更を確認する
マスターノードのステータスを再確認します: (クラスターデータの再シャーディングを確認できます) - redis-cli -p 7000 クラスターノード|grep マスター
データ スライスの移動を続けます。 - #'クラスタ管理ノードを操作して再割り当てし、対話型インターフェースでシャードサイズを指定してシャードを受け取るノードIDを選択します
- redis-cli
-
- # 方法は、シャードの場所に応じてマスターノードを削除し、ノードのグループを削除することです。また、すべてのデータスライスをノードに直接移動することもできます。
-
- スロットをいくつにしたいですか? 移動( 1から16384まで)? 1366 #データシャードの合計サイズを手動で確認する
-
- 受信ノードIDは何ですか? f6c1aaea3a8c56e0c7dee8ad7ae17e26dd04244c
- #データシャードを受け取るノードIDを選択します(これは新しく追加されたノード7006インスタンスのID番号です)
-
- ソースノード #1: 2129d28f0a86fc89571e49a59a0739812cff7953
- #新しいマスターノードに再シャーディングするソースマスターノードを選択します(これは削除するマスターノードのID番号です)
-
- ソースノード #2: 完了
- #これは終了コマンドです
-
- 提案されたリシャード計画を続行しますか(はい/いいえ)?はい
- #上記操作の変更を確認する
マスターノードのステータスを再確認します: (クラスターデータの再シャーディングを確認できます) - redis-cli -p 7000 クラスターノード|grep マスター
データ スライスの最後の動き: - #'クラスタ管理ノードを操作して再割り当てし、対話型インターフェースでシャードサイズを指定してシャードを受け取るノードIDを選択します
- redis-cli
-
- #方法は、シャードの場所に応じてマスターノードを削除し、1つのグループを1つのノードに移動するか、すべてのデータスライスを1つのノードに直接移動することです。
-
- スロットをいくつにしたいですか? 移動( 1から16384まで)? 1365
- #データシャードの合計サイズを手動で確認する
-
- 受信ノードIDは何ですか? 5a0df4ea0af5f35c1248e45e88d44c3f2e10169f
- ソースノード #1: 2129d28f0a86fc89571e49a59a0739812cff7953
- ソースノード #2: 完了
マスターノードのステータスを再確認します: (クラスターデータの再シャーディングを確認できます) - redis-cli -p 7000 クラスターノード|grep マスター
データ スライスをクリアするには、マスター ノードを削除します。 - #'データが消去された7006インスタンスを削除します
- redis-cli
-
- #マスターデータベースなしで7007インスタンスを削除します
- redis-cli
その他の構成管理: - メモリ情報ビュー
- redis-cli -p 6382 -a redhat 情報メモリ
-
- #最大メモリ使用量を100MBに設定する
- redis-cli -p 6382 -a redhat config最大メモリを 102400000 に設定します
|