ハードコアなやつ! Redis 分散クラスタの展開の実践

ハードコアなやつ! Redis 分散クラスタの展開の実践

[[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 環境サポートをインストールします。

  1. yum -y ruby​​ ruby​​gemsをインストール

Yumはバージョン2.0.0をインストールしますが、gemはバージョン2.2.2以上が必要なので、コンパイルを選択します。

Ruby 環境をダウンロードしてインストールします。

  1. https://cache.ruby-lang.org/pub/ruby/2.6/ruby-2.6.1.tar.gz を取得します。
  2. tar xf ruby​​-2.6.1.tar.gz && cd ruby​​-2.6.1/
  3. ./configure --prefix=/usr/local/ruby  
  4. make && make install && echo $?
  5. echo 'export PATH=$PATH:/usr/local/ruby/bin' >> /etc/profile
  6. ソース /etc/profile

gemツールの国内ソースを変更します。

  1. # gemツールのソースアドレスを表示する
  2. gem ソース -l
  3. # Alibaba Cloud gemツールソースを追加する
  4. gem ソース -a http://mirrors.aliyun.com/rubygems/
  5. # gemツールのデフォルトの外部ソースを削除する
  6. gem ソース--remove https://rubygems.org/  
  7. # クラスタープラグインの最新バージョンをダウンロードする
  8. gem をインストール redis -v 4.1.0

クラスターノードの準備:

  1. mkdir /data/700{0..5}

ポート 7000 インスタンスを構成します。

  1. vim /data/7000/redis.conf
  2. ポート 7000
  3. 悪魔化する はい
  4. pidファイル /data/7000/redis.pid
  5. ログレベル通知
  6. ログファイル"/data/7000/redis.log"  
  7. dbファイル名 dump.rdb
  8. ディレクトリ /data/7000
  9. 保護モードなし 
  10. クラスタ対応 はい
  11. クラスター構成ファイル nodes.conf
  12. クラスターノードタイムアウト 5000
  13. 追加のみ はい

他のポートインスタンスをコピーします:

  1. # 設定ファイルをコピーする
  2. cp /data/7000/redis.conf /data/7001/
  3. cp /data/7000/redis.conf /data/7002/
  4. cp /data/7000/redis.conf /data/7003/
  5. cp /data/7000/redis.conf /data/7004/
  6. cp /data/7000/redis.conf /data/7005/
  7.  
  8. # 設定ファイルの内容を変更する
  9. sed -i 's#7000#7001#g' /data/7001/redis.conf
  10. sed -i 's#7000#7002#g' /data/7002/redis.conf
  11. sed -i 's#7000#7003#g' /data/7003/redis.conf
  12. sed -i 's#7000#7004#g' /data/7004/redis.conf
  13. sed -i 's#7000#7005#g' /data/7005/redis.conf

すべてのインスタンスを起動します:

  1. redis サーバー /data/7000/redis.conf
  2. redis サーバー /data/7001/redis.conf
  3. redis サーバー /data/7002/redis.conf
  4. redis サーバー /data/7003/redis.conf
  5. redis サーバー /data/7004/redis.conf
  6. redis サーバー /data/7005/redis.conf

コマンド ソフト リンクを作成します。

(このコマンドは古いので、現在は redis-cli コマンドを使用してください) (オプションの実行コマンド)

  1. ln -s /usr/ローカル/redis-5.0.2/src/redis-trib.rb /usr/sbin/

プロセスを表示:

  1. ps -ef |grep redis-server

すべてのインスタンス ノードをクラスター管理に追加します。

  1. # --replicas 1"、1は各マスターに1つのスレーブがあることを意味し、その後にすべてのノードのアドレスとポート情報が続きます。  
  2. redis-cli --cluster 作成 --cluster-replicas 1 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  

分散マスター/スレーブ ルールでは、最初の 3 つのインスタンス ノードがマスターであり、対応する 3 つのインスタンス ノードがスレーブ ノードになります。レプリカが 2 つある場合は、インスタンス ノードをさらに 3 つ追加します。

マスターノードのステータスを確認します。

  1. redis-cli -p 7000 クラスターノード|grep マスター

スレーブノードのステータスを確認します。

  1. redis-cli -p 7000 クラスターノード|grep スレーブ

Redis 分散クラスタ (管理)

クラスター ノードを追加するための準備:

  1. mkdir /data/700{6..7}
  2.  
  3. 他のポートインスタンスをコピーします:
  4.  
  5. # 設定ファイルをコピーする
  6. cp /data/7000/redis.conf /data/7006/
  7. cp /data/7000/redis.conf /data/7007/
  8.  
  9. # 設定ファイルの内容を変更する
  10. sed -i 's#7000#7006#g' /data/7006/redis.conf
  11. sed -i 's#7000#7007#g' /data/7007/redis.conf

新しいノードインスタンスを開始します。

  1. redis サーバー /data/7006/redis.conf
  2. redis サーバー /data/7007/redis.conf

プロセスを表示:

  1. ps -ef |grep redis-server

マスターノードを追加します: (7000 インスタンスは管理ノードです)

  1. #'インスタンス 7000 のマスター ノードが配置されているクラスターにインスタンス 7006 を追加します (この時点ですでに 4 つのマスター ノードがあります)
  2. redis-cli --cluster ノードを追加 127.0.0.1:7006 127.0.0.1:7000  

マスターノードのステータスを確認します。

  1. redis-cli -p 7000 クラスターノード|grep マスター

転送スロット(再シャード):

  1. #'クラスタ管理ノードを操作して再割り当てし、対話型インターフェースでシャードサイズを指定してシャードを受け取るノードIDを選択します
  2. redis-cli --cluster reshard 127.0.0.1:7000  
  3.  
  4. スロットをいくつにたいですか?  移動 1から16384まで)? 4096
  5. #データシャードの合計サイズをマスターノードの数で割って手動で計算します
  6.  
  7. 受信ノードIDはですか? 2129d28f0a86fc89571e49a59a0739812cff7953
  8. #データシャードを受け取るノードIDを選択します(これは新しく追加されたノード7006インスタンスのID番号です)
  9.  
  10. ソースノード #1:すべて 
  11. #新しいマスターノードに再シャーディングするソースマスターノードを選択します( allはすべてのノードです)
  12.  
  13. 提案されたリシャード計画続行します(はい/いいえ)?はい
  14. #上記の変更を確認してください

マスターノードのステータスを再確認します: (クラスターデータの再シャーディングを確認できます)

  1. redis-cli -p 7000 クラスターノード|grep マスター

スレーブノードを追加します。

  1. #'7007インスタンスノードを7006インスタンスマスターノードに追加し、対応する7006インスタンスマスターノードをクラスターの管理ノードに配置するように指定します
  2. redis-cli --cluster add-node 127.0.0.1:7007 127.0.0.1:7000 --cluster-slave --cluster-master-id 2129d28f0a86fc89571e49a59a0739812cff7953  

スレーブノードのステータスを確認します。

  1. redis-cli -p 7000 クラスターノード|grep スレーブ

クラスターノードの削除準備:

削除するノードのデータ シャードを移動します。

  1. #'クラスタ管理ノードを操作して再割り当てし、対話型インターフェースでシャードサイズを指定してシャードを受け取るノードIDを選択します
  2. redis-cli --cluster reshard 127.0.0.1:7000  
  3.  
  4. #方法は、シャードの場所に応じてマスターノードを削除し、1つのグループを1つのノードに移動するか、すべてのデータスライスを1つのノードに直接移動することです。
  5.  
  6. スロットをいくつにたいですか?  移動 1から16384まで)? 1365
  7. #データシャードの合計サイズを手動で確認する
  8.  
  9. 受信ノードIDはですか? e64f9074a3733fff7baa9a4848190e56831d5447
  10. #データシャードを受け取るノードIDを選択します(これは新しく追加されたノード7006インスタンスのID番号です)
  11.  
  12. ソースノード #1: 2129d28f0a86fc89571e49a59a0739812cff7953
  13. #新しいマスターノードに再シャーディングするソースマスターノードを選択します(これは削除するマスターノードのID番号です)
  14.  
  15. ソースノード #2: 完了
  16. #これは終了コマンドです
  17.  
  18. 提案されたリシャード計画続行します(はい/いいえ)?はい
  19. #上記操作の変更を確認する

マスターノードのステータスを再確認します: (クラスターデータの再シャーディングを確認できます)

  1. redis-cli -p 7000 クラスターノード|grep マスター

データ スライスの移動を続けます。

  1. #'クラスタ管理ノードを操作して再割り当てし、対話型インターフェースでシャードサイズを指定してシャードを受け取るノードIDを選択します
  2. redis-cli --cluster reshard 127.0.0.1:7000  
  3.  
  4. # 方法は、シャードの場所に応じてマスターノードを削除し、ノードのグループを削除することです。また、すべてのデータスライスをノードに直接移動することもできます。
  5.  
  6. スロットをいくつにたいですか?  移動 1から16384まで)? 1366 #データシャードの合計サイズを手動で確認する
  7.  
  8. 受信ノードIDはですか? f6c1aaea3a8c56e0c7dee8ad7ae17e26dd04244c
  9. #データシャードを受け取るノードIDを選択します(これは新しく追加されたノード7006インスタンスのID番号です)
  10.  
  11. ソースノード #1: 2129d28f0a86fc89571e49a59a0739812cff7953
  12. #新しいマスターノードに再シャーディングするソースマスターノードを選択します(これは削除するマスターノードのID番号です)
  13.  
  14. ソースノード #2: 完了
  15. #これは終了コマンドです
  16.  
  17. 提案されたリシャード計画続行します(はい/いいえ)?はい
  18. #上記操作の変更を確認する

マスターノードのステータスを再確認します: (クラスターデータの再シャーディングを確認できます)

  1. redis-cli -p 7000 クラスターノード|grep マスター

データ スライスの最後の動き:

  1. #'クラスタ管理ノードを操作して再割り当てし、対話型インターフェースでシャードサイズを指定してシャードを受け取るノードIDを選択します
  2. redis-cli --cluster reshard 127.0.0.1:7000  
  3.  
  4. #方法は、シャードの場所に応じてマスターノードを削除し、1つのグループを1つのノードに移動するか、すべてのデータスライスを1つのノードに直接移動することです。
  5.  
  6. スロットをいくつにたいですか?  移動 1から16384まで)? 1365
  7. #データシャードの合計サイズを手動で確認する
  8.  
  9. 受信ノードIDはですか? 5a0df4ea0af5f35c1248e45e88d44c3f2e10169f
  10. ソースノード #1: 2129d28f0a86fc89571e49a59a0739812cff7953
  11. ソースノード #2: 完了

マスターノードのステータスを再確認します: (クラスターデータの再シャーディングを確認できます)

  1. redis-cli -p 7000 クラスターノード|grep マスター

データ スライスをクリアするには、マスター ノードを削除します。

  1. #'データが消去された7006インスタンスを削除します
  2. redis-cli --cluster del-node 127.0.0.1:7006 2129d28f0a86fc89571e49a59a0739812cff7953  
  3.  
  4. #マスターデータベースなしで7007インスタンスを削除します
  5. redis-cli --cluster del-node 127.0.0.1:7007 821bcf78c5e4c0b08aa7a5d514214b657ebec4ab  

その他の構成管理:

  1. メモリ情報ビュー
  2. redis-cli -p 6382 -a redhat 情報メモリ
  3.  
  4. #最大メモリ使用量を100MBに設定する
  5. redis-cli -p 6382 -a redhat config最大メモリを 102400000 に設定します

<<:  クラウド コンピューティング テスト - ソフトウェア テストの未来

>>:  サーバーレスがクラウドの未来である理由

推薦する

漫画サイトを運営するには?

アニメ ウェブサイトの増加に伴い、ますます多くのウェブマスターがコミック ウェブサイトに注目するよう...

ローコードデプロイメントで避けるべき7つの間違い

[[441390]]調査会社ガートナーによると、世界のローコード開発市場規模は2021年に138億米...

hudsonvalleyhost-$35/E3-1240V3/8G メモリ/120gSSD/10T トラフィック/1000M ポート

特別価格のサーバーが必要な友人はラッキーです。ColorCrossing 傘下の HudsonVal...

クルンはどうですか? 「Three Elite Networks」シリーズのサーバーについての簡単なレビュー

クルンはどうですか?クルンサーバーはどうですか? Kurunは国内IDC市場では比較的有名で、主に米...

10gbiz: ロサンゼルス cn2 gia 無制限トラフィック VPS は月額 3.58 ドルから、ロサンゼルス 200M cn2 gia 専用サーバーは月額 160 ドルから

10gbizは、米国ロサンゼルスのデータセンターでVPS・専用サーバー事業を中心に展開する新ブランド...

SEO 業界では、他の人ができることができない場合があります。

オンラインストアを開設したり、様々なプロジェクトを行っています。何かを初めてやるときに、それを早くや...

「火鍋レストラン」のゲーミフィケーションプライベートドメインコミュニティケースの解体

インターネット界ではプライベートドメインの概念はよく知られており、コンバージョン、リピート購入、ユー...

エッジコンピューティングによってもたらされる新たなセキュリティリスクを排除する方法

現在、エッジコンピューティングの適用範囲はますます広がっています。エッジ コンピューティング アプリ...

5種類のサーバー仮想化を理解する

仮想化により、ネットワーク、ストレージ、コンピューティング リソースが抽象化され、アプリケーション、...

ユーザーのアクセス履歴の追跡と最適化はウェブサイトの信頼性を反映する

ユーザー エクスペリエンス デザインでは、常に Web サイトのセキュリティとユーザーの信頼を重視し...

中国進出から1年、DataVisorはインターネット詐欺の問題を解決

[51CTO.com より引用] 現在、オンライン サービスの急速な成長により、インターネット ユー...

張勇:アリババは生成AIビッグモデルの構築に全力で投資し続ける

アリババグループは2月23日夜、2023年度第3四半期(2022年度第4四半期)の決算を発表した。業...

SAP、2021年第3四半期の財務レポートを発表: SAPクラウドビジネスの成長が大幅に加速、SAP導入が急増

• 現在のクラウドバックログは24%増加しました(為替レート一定では22%増加) • 現在のS/4H...