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

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

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

推薦する

5G時代のクラウドコンピューティング開発における5つの新たなトレンド

Amazon AWS が 2006 年に初めてクラウド サービスを開始して以来、クラウド コンピュー...

sparkedhost: マイアミの AMD 高性能 VPS、100G の高防御、月額 10 ドル、2G メモリ/1 コア/25g NVMe/1.5T トラフィック

sparkedhost は 2011 年 7 月に米国コネチカット州で登録されました。同社は 201...

ミクロの時代にミクロの専門家になるにはどうすればいいのでしょうか?

いわゆるマイクロ時代について私が理解しているのは、Weibo、WeChat、マイクロムービーのことで...

愛展と中国浙江省の百度重量計算方法の徹底分析

近年、百度の重みを計算するサードパーティツールがいくつかの企業によってリリースされ、多くのウェブマス...

Pacificrack: ロサンゼルスに最適化されたライン VPS、年間 7.25 ドルから、512 MB のメモリ/10 g SSD/500 g の帯域幅

Pacificrack は、年間支払額がわずか 7.25 ドルの 3 つの新しい安価な VPS モデ...

ポストデスクトップ時代、寡占競争はどのような考え方や価値観を持つべきか(上)

インターネット上の競争は白熱した段階に達しており、このような特別な時期には、市場で最も人気があるWe...

究極のパフォーマンスを追求するために、Kafkaには11の主要な最適化があります

Kafka はパフォーマンスを最適化するためにどのような対策を講じましたか?これは Kafka の面...

Qianzhan.com ドメイン名盗難事件: Xinnet の虚偽の声明を非難するために再度発言

eName.cnは5月16日、最近Qianzhan.comのドメイン名が盗まれ、数億元の損失をもたら...

WeChatマーケティングの最大の魅力:不確実性がユーザーを「中毒」にする

2018年最もホットなプロジェクト:テレマーケティングロボットがあなたの参加を待っていますもし紅包が...

boltvm - 年間 8 ドル / 256 MB メモリ / 10 GB SSD / 250 GB トラフィック / 優れたコンピュータ ルーム

boltvm には、SSD ハード ドライブを搭載した、年間 8 ドルの特別な VPS があります。...

ウェブマスターネットワークからの毎日のレポート:Facebookが株式公開し、Tencentが再編

ナスダックは、フェイスブックが今夜23時頃に取引を開始すると発表北京時間5月18日早朝、ナスダックは...

おすすめ: photonvps-エンタープライズ VPS 50% オフ プロモーション (中国語 + Alipay をサポート)

何ということでしょう?チャンスは一瞬です、ハハハ! photonvps(通称ライスバケット)では、現...

企業のウェブサイトの価値を高めますか?コンテンツ構築から始める

インターネットの発展と普及に伴い、ますます多くのウェブサイトが登場し、オンラインの世界が構築されてき...

ビジネスシナリオに基づくコンテナ脱出技術

導入近年、コンテナは、あらゆる環境で実行できること、オーバーヘッドが低いこと、数秒で起動できること、...