ホームページ >データベース >Redis >Redis の高い同時実行性を確保する方法をご存知ですか?

Redis の高い同時実行性を確保する方法をご存知ですか?

藏色散人
藏色散人転載
2020-11-10 14:52:252541ブラウズ

次のコラム Redis チュートリアル では、Redis の高い同時実行性を確保する方法を紹介します。

スタンドアロン Redis が 100,000 を超える QPS (通常は数万) を持つことはほとんど不可能です。

マシンのパフォーマンスが特に優れている、構成が特に高度である、物理マシンが適切に保守されている、全体的な操作がそれほど複雑でないなど、特別な状況がない限り。

Redis はマスター/スレーブ アーキテクチャを通じて読み取りと書き込みの分離を実現しており、マスター ノードはデータの書き込みと同期を担当します。スレーブ ノードが読み取りを担当するため、高い同時実行性が実現されます。

Redis は高い同時実行性を備えていますが、大量のデータ (1 つのマスターと複数のスレーブ) に対応する必要もあり、各インスタンスは完全なデータに対応します。 、redis マスター 10G のメモリでは、実際には 10G のデータしか保持できません。キャッシュが数十ギガバイト、さらには数百ギガバイト、あるいは数トンに達する大量のデータを収容する必要がある場合は、redis クラスターが必要です。redis クラスターを使用すると、1 秒あたり数十万のデータを提供できます。読み取りと書き込みを同時に実行します。

レプリケーションの中心的なメカニズム

Redis は非同期モードを使用してデータをただし、redis 2.8 以降、スレーブ ノードはコピーされるデータの量を毎回定期的に確認します。
マスター ノードは複数のスレーブ ノードで構成できます
スレーブ ノード 他のスレーブ ノードに接続することもできます。
スレーブ ノードがレプリケートするとき、マスター ノードの通常の作業をブロックしません。
スレーブ ノードがレプリケートするとき、レプリケートします。自身のクエリ操作はブロックされません。古いデータ セットを使用してサービスを提供します。ただし、コピーが完了したら、古いデータ セットを削除し、新しいデータ セットをロードする必要があります。このとき、外部サービスは
スレーブ ノードは主に水平方向の拡張と読み取りと書き込みの分離に使用され、拡張されたスレーブ ノードにより読み取りスループットが向上します。
## マスター/スレーブ アーキテクチャのセキュリティにおけるマスター永続性の重要性

##マスター/スレーブ アーキテクチャを採用する場合、マスターノードの電源をオンにする必要があります。

スレーブ ノードをマスター ノードのデータ ホット バックアップとして使用することはお勧めできません。その場合、マスターの永続性をオフにすると、データが失われる可能性があります。マスターがクラッシュして再起動すると空になるため、スレーブ ノードのデータはコピーされるとすぐに失われる可能性があります。

次に、マスターに対してさまざまなバックアップ計画を実行しますか?すべてのローカル ファイルが失われた場合に備えて、バックアップから rdb を選択してマスターを復元します。これにより、マスターの起動時にデータが存在することが保証されます。

マスターがスレーブにデータを同期するプロセス

スレーブ ノードを起動すると、マスターに PSYNC コマンドが送信されます。ノード

# これがマスター ノードに再接続するスレーブ ノードである場合、マスター ノードは欠落したデータのみをスレーブにコピーします。それ以外の場合、スレーブ ノードがマスター ノードに接続する場合は、初めて完全再同期がトリガーされます

完全再同期を開始すると、マスターはバックグラウンド スレッドを開始し、RDB スナップショット ファイルの生成を開始します。クライアントから受信したコマンドはメモリにキャッシュされます。

RDB ファイルが生成された後、マスターは RDB をスレーブに送信し、スレーブはまずローカル ディスクに RDB を書き込み、次にローカル ディスクからメモリにロードします。 。次に、マスターはメモリにキャッシュされた書き込みコマンドをスレーブに送信し、スレーブもデータを同期します。

スレーブ ノードがマスター ノードとのネットワーク障害により切断された場合、自動的に再接続されます。マスターは、複数のスレーブ ノードが再接続していることを検出した場合、rdb 保存操作のみを開始し、データのコピーを使用してすべてのスレーブ ノードにサービスを提供します。

マスター/スレーブ レプリケーションのブレークポイントを再開します

Redis 2.8 以降、マスター/スレーブ レプリケーションのブレークポイント再開がサポートされています。マスター/スレーブ レプリケーション プロセス中にネットワーク接続が切断された場合でも、レプリケーションを作成する代わりに、最後のレプリケーション ポイントからレプリケーションを続行できます。最初からコピー

マスター ノードはメモリ内にバックログを持ちます。マスターとスレーブの両方がレプリカ オフセットとマスター ID を保存します。オフセットはバックログに保存されます。

マスターとスレーブの間のネットワーク接続が切断された場合、スレーブはマスターに最後のレプリカ オフセット

からレプリケーションを継続させます。しかし、一致しない場合は、対応するオフセットが見つかった場合、再同期が実行されます。

ディスクレス コピー

マスターは、再同期を実行します。メモリに直接配置する rdb を作成してスレーブに送信する ディスクはローカルに配置されません

# repl-diskless-sync
repl-ディスクレス同期遅延、より多くのスレーブが再接続するまで待つ必要があるため、レプリケーションを開始する前に一定時間待機します

期限切れのキーの処理

スレーブ キーは期限切れになりませんが、マスターがキーを期限切れにするまで待機します。

マスターがキーを期限切れにした場合、または LRU を通じてキーを削除した場合、del コマンドがシミュレートされてスレーブに送信されます。

レプリケーションの完全なプロセス

スレーブ ノードが起動し、情報のみが保存されます。マスターノードのホストとIP (redis.confのslaveofで構成)を含むマスターノードの情報ですが、レプリケーションプロセスは開始されていません。

内部にスケジュールされたタスクがあります。新しいデータがあるかどうかを毎秒チェックするスレーブ ノード マスター ノードは接続して複製する必要があります。見つかった場合は、マスター ノードとのソケット ネットワーク接続が確立されます。
スレーブ ノードは、マスター ノードへの ping コマンド
マスターの場合のパスワード認証 requirepass が設定されている場合、スレーブ ノードは認証のために masterauth パスワードを送信する必要があります
マスター ノードは次のことを実行します。初めて完全なレプリケーションを実行し、すべてのデータをスレーブ ノードに送信します。
マスター ノードは引き続きコマンドを書き込み、それをスレーブ ノードに非同期にコピーします。

データ同期に関連するコアメカニズム

##とは、つまり、スレーブが初めて msater に接続するときに、完全なコピーが実行されることを指します。そのプロセスには、いくつかの詳細なメカニズムがあります。

# (1) マスターとスレーブの両方がオフセットを維持します

マスターは継続的に蓄積します。スレーブは自身のオフセットを継続的に蓄積します。

スレーブは自身のオフセットを毎秒マスターに報告し、マスターは各スレーブのオフセットも保存します

これは、特に完全なレプリケーションに使用されるという意味ではありません。主な理由は、マスターとスレーブの両方が、それらの間のデータを認識するために、自身のデータのオフセットを知る必要があることです。状況

(2) バックログ

マスターノードにはバックログがあり、デフォルトのサイズは 1MB

マスター ノードがスレーブ ノードにデータをコピーすると、バックログにもデータのコピーが同期的に書き込まれます。
バックログは主に、完全レプリケーションが中断された場合の増分コピーに使用されます

(3)マスター実行 ID

情報サーバーでは、マスター実行 ID

を確認できます。ホスト IP に基づいてマスター ノードを見つけます。はい、信頼性がありません。マスター ノードが再起動するかデータが変更された場合、スレーブ ノードは異なる実行 ID に従って区別される必要があります。実行 ID が異なる場合は、完全なコピーを作成してください
run id を変更せずに redis を再起動する必要がある場合は、redis-cli デバッグ リロード コマンド

(4) psync

を使用できます。

スレーブ ノードは、psync を使用してマスター ノードからコピーします (psync runid offset)

マスター ノードは、自身の状況に応じて応答情報を返します。フル コピーをトリガーするか、CONTINUE で増分コピーをトリガーします。

フル コピー

マスターは bgsave を実行し、ローカルで rdb スナップショット ファイルを生成します。
マスター ノードは、rdb スナップショット ファイルをスレーブ ノードに送信します。 rdb コピー時間が 60 秒を超える場合 (repl -timeout) を指定すると、スレーブ ノードはコピーが失敗したと判断し、このパラメータを適切に調整できます。
ギガビット ネットワーク カードを搭載したマシンの場合、通常、1 秒あたり 100MB、6G のファイルが転送されます。 60 秒を超える可能性があります
マスター ノードが rdb を生成すると、すべての新しい書き込みコマンドがメモリにキャッシュされます。スレーブ ノードが rdb を保存した後、新しい書き込みコマンドをsalve node
client-output-buffer-limit smile 256MB 64MB 60. レプリケーション中にメモリ バッファが 64MB を超えて消費し続けるか、一度に 256MB を超える場合、レプリケーションは停止し、
スレーブ ノードは rdb 後、自身の古いデータをクリアし、rdb を自身のメモリにリロードし、同時に古いデータ バージョンに基づいて外部サービスを提供します
スレーブ ノードが AOF をオンにすると、BGREWRITEAOF がすぐに実行されます。 copy

完全コピーが進行中の場合、マスター - スレーブのネットワーク接続が切断された場合、スレーブがマスターに再接続すると、増分レプリケーションがトリガーされます

マスターは、失われたデータの一部を自身のバックログから直接取得し、スレーブ ノードに送信します。デフォルトのバックログは 1MB です

マスターは、バックログに基づいてバックログからデータを取得します。スレーブによって送信された psync のオフセット


heartbeat

マスター ノードとスレーブ ノードは相互にハートビート情報を送信します

# マスターはデフォルトで 10 秒ごとにハートビートを送信し、スレーブ ノードは 1 秒ごとにハートビートを送信します

非同期レプリケーション

マスターは書き込みコマンドを受信するたびに、内部でデータを書き込み、それをスレーブ ノードに非同期で送信します

以上がRedis の高い同時実行性を確保する方法をご存知ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcnblogs.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。