ハードコアなやつ! 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 に設定します

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

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

推薦する

「中国Vバレー」馬欄山がグリーンデータセンターを建設、アリババクラウドの液体冷却技術が初めて輸出

サーバーを水に浸す単相浸漬液冷却技術は、グリーン データ センターの新しい標準になりつつあります。 ...

古くなった冗長なウェブサイトコンテンツは削除すべきでしょうか?

インターネット社会では、誰もがトラフィックを獲得し、ユーザーの好みに応えるために時間と競争しています...

WeChatのパブリックプラットフォームポリシーは不明確で、多数の草の根WeChatアカウントがブロックされている

私は昨年8月20日に正式にWeChatパブリックプラットフォームを使い始めました。当時、パブリックプ...

Dewu クラウドネイティブ フルリンク トラッキング Trace2.0 コレクション

0xcc の紹介2020年3月、Dewu技術チームは3か月で取引システム全体の再構築を完了し、Wuc...

ハイブリッドクラウドを安全にする方法: IT プロフェッショナルが知っておくべきこと

企業のハイブリッド クラウド環境を保護するのは簡単ではありません。 SANS アナリストが、パブリッ...

ライブストリーミングeコマース、トップシェアを獲得

ライブストリーミングのトップインフルエンサーの失踪により、ライブストリーミング電子商取引業界が再び注...

A5プラットフォームウェブマスターの成功の出発点である、最初のA5提出体験について語る

私は 3 年前に A5 プラットフォーム、A5 ダウンロード、A5 フォーラム、A5 トランザクショ...

nodeserv-new hen、$13/年/512MB メモリ/100GB ハード ドライブ/1TB トラフィック

nodeserv.com は 2009 年に設立され、独自の IP (AS19757) を持っていま...

自動車会社はどのようにして1兆ドル規模のスマートトラベル市場に参入できるのでしょうか?

周知のとおり、自動車産業はここ数年、100年ぶりの大変革を迎え、2つの分野で徹底的な「進化」を遂げて...

ウェブサイトURL変更による最適化と対策への影響に関するデータ分析

ショートビデオ、セルフメディア、インフルエンサーのためのワンストップサービスSEO を行う人は、ウェ...

イノベーションはウェブサイトの魂です

今日のウェブマスターは皆、ウェブサイトのコア価値を反映する必要があることを知っています。そして、ウェ...

sharktech: クラウド サーバーが 35% オフ、年間 33 ドル、60 GB の高防御、2 GB メモリ/1 コア/40 GB SSD/4 TB トラフィック

高度防御ビジネスに特化したシャークデータセンターのSharktechでは、現在、クラウドサーバー「パ...

王大智佳は30GのDDoS攻撃を受け、ハッカーは数百万ドルの報酬で雇われたと主張した

3月20日、中国最大かつ最も影響力のあるP2Pオンライン融資業界ポータルである王大智佳は、ウェブサイ...