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

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

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

推薦する

racknerd: イースター、VPS は年間 12.5 ドルから、KVM/1G メモリ/20g ハードディスク/3T トラフィック/ロサンゼルス最適化回線

racknerd では「イースターセール」のプロモーションを 2 回実施しており、2 年分まとめて購...

簡潔な分析: 二級都市と三級都市のオンラインメディアが直面する共通のジレンマ

3G や 4G に不満を言い続ける時代に生きている人たちは、ダイヤルアップ インターネット アクセス...

weloveservers-ホスティング評価のための 30% 割引コード

weloveserversのVPSに興味がありますか?割引コード: zhujimao 、このサイトの...

クラウド コンピューティングは誇大宣伝を生き延びたのでしょうか?

2010 年と 2011 年には、クラウド コンピューティングの明るい未来についての予測がニュースの...

フィリップ・コトラー:新しいテクノロジーの時代にはどのようなマーケティングのルールが変わりましたか?

はじめに: マーケティングは死んだのか? 最近の演説で、マーケティングの創始者はこれを否定しました。...

母子ブランドマーケティングの3つの戦略

優れたケース分析事例名: [Keyoubi & babycare & Pigeon]...

Baidu入札プロモーションの成功に影響を与える重要なスキル

検索エンジンの急速な発展に伴い、多くの企業が検索エンジン広告に参入し、インターネットを通じて事業を拡...

バックリンク戦略の共有

外部リンクはまさに​​諸刃の剣です。外部リンクを上手に行う人は専門家であり、下手に行う人は不正行為者...

詳細が成功と失敗を決定づける: ウェブサイト上のリンク切れの検出と処理

ウェブサイトの最適化において、デッドリンクはウェブサイトのイメージに影響を与える重要なポイントです。...

Weiboマーケティングを行うには?この記事を読んでみてください

ショートビデオ、セルフメディア、インフルエンサーのためのワンストップサービスファン経済の時代では、W...

雷軍の年次演説「生中継」全文!

8月10日19時30分、小米集団の創始者・雷軍氏は、小米の新製品発表会を兼ねた「私の夢、私の選択 ...

クラウンクラウド - $7/Kvm/2g メモリ/30g ハードディスク/3T トラフィック/ロサンゼルス/QR データセンター

CrownCloud は設立から 2 年で、常に控えめな姿勢を貫いています。同社の製品は非常に堅実で...

Huawei Cloud TechWave Cloud Native 2.0 Special Dayが開催間近、GaussDBがアップグレードされて再デビュー

データは企業のデジタル変革の中核要素の 1 つであり、データベースはデータのライフラインをサポートす...

hostvy: cn2 gia ネットワーク、KVM+SSD、高速、高性能、ウェブサイト VPS の構築に推奨

Hostvy が正式に設立され、cn2 gia 回線を使用した VPS に注力しています。通信会社は...

SEO 実践者の妨げとなっているものは何でしょうか?

みなさんこんにちは。謝凱です。 SEO 実践者はキャリア上の困難に陥ることがよくあります。私の同僚や...