キャッシュの背後にある「破壊の種」

キャッシュの背後にある「破壊の種」

[[332833]]

キャッシュアバランチ

「キャッシュ ミス」という用語については何度も言及しており、「キャッシュ ミス」は DB とキャッシュ間のデータの一貫性をより確実にするために使用されています。

しかし、すべての物事には二面性があります。 「キャッシュ ミス」は便利ですが、潜在的なリスクも伴います。

このリスクが「キャッシュ雪崩」です。

図の 2 番目のステップでは、多数のリクエストが同時に発生し、ここでの「キャッシュ ミス」によって「キャッシュ アバランシェ」が発生する可能性があります。

ただし、「キャッシュ ミス」は「キャッシュ アバランチ」を引き起こす可能性がありますが、「キャッシュ アバランチ」は「キャッシュ ミス」によってのみ発生するわけではありません。

「雪崩」という言葉は「雪崩効果」に由来しており、「優勢なドミノ」のような連鎖反応を指します。前方を支えられなかったため、後方に衝撃が伝わり、事態は瞬く間に拡大した。 (雪崩の対処法の詳細については、前回の記事(記事末尾のリンク)を参照してください)

したがって、「キャッシュアバランシェ」の根本的な問題は、何らかの理由でキャッシュが期待されるバッファリング効果を達成できず、すべてのリクエストがデータベースに流れ、データベースに過度の負荷がかかることです。

したがって、トラフィックの急増、高同時実行時のキャッシュの有効期限切れ、さらにはキャッシュ システムのクラッシュによって、「キャッシュ アバランシェ」問題が発生する可能性があります。

この問題を解決するにはどうすればいいでしょうか?ダウンタイムは高可用性を実現することで解決できます(前回の記事、記事末尾のリンクを参照してください)。 「トラフィックの急増」と「高同時実行時のキャッシュの有効期限切れ」という 2 つのシナリオでは、解決方法も 2 つあります。

ロックキュー

ロックまたはキューイング メカニズムを使用して、データベースを読み取り、キャッシュに書き込むスレッドの数を制限します。たとえば、次の疑似コードは、特定のキーを入力できるスレッドを 1 つだけに許可した場合の効果を示しています。

  1. キー= "aaa" ;
  2. varcacheValue = cache.read ( key );
  3. キャッシュnullの場合
  4. キャッシュ値を返します
  5. }
  6. それ以外{
  7. ロック(キー) {
  8. cacheValue = cache.read (キー);
  9. キャッシュnullの場合
  10. キャッシュ値を返します
  11. }
  12. それ以外{
  13. cacheValue = db.read (キー);
  14. cache.set (キー、cacheValue);
  15. }
  16. }
  17. キャッシュ値を返します
  18. }

これはわかりやすいので、時間を無駄にしません。

キャッシュ時間はランダムな値で増加します

これは主に、「キャッシュの期限切れ」メカニズムによる難しい解決策を目的としています。その目的は、複数のキャッシュ キーが同時に失敗して、より集中した圧力がかかるのを回避することです。

たとえば、キーが 10 個あり、その有効期限が 30 分の場合、30 分後には、これら 10 個のキーに対するすべてのリクエストが同時に DB に送信されます。

ここで述べる方法は、これら 10 個のキーの有効期限をシャッフルし、たとえば有効期限を 25、26、27、…、34 分に設定して、圧力が分散され、1 分間に 1 つのキーのみが期限切れになるようにすることです。

最も単純かつ残酷な方法は、「有効期限」を設定するときに乱数を追加することです。

キャッシュを設定します(キー、キャッシュ値、30+ランダム())

一般的に、前者の方が後者よりも適用性が高いため、Brother Z は、デフォルトの一般的なソリューションとして「ロックされたキュー」を使用することをお勧めします。これは良い選択です。

「キャッシュ侵入」と「キャッシュアバランチ」の違いが分かりませんか?

「キャッシュ ペネトレーション」という言葉を聞いたことがある人は、「キャッシュ アバランシェとキャッシュ ペネトレーションは同じですか?」と疑問に思うかもしれません。

効果は同じですが、プロセスは異なります。

例を挙げてみましょう。これらの例は完全に架空のものなので、その信憑性についてはあまり心配する必要はありません。

10,000マイルのエリアに、経験豊富な携帯電話修理工は1人しかいません。彼は、仕事のプレッシャーを少しでも軽減してくれることを期待して、弟子を雇いました。ここでのマスターは DB とみなすことができ、見習いはキャッシュとみなすことができます。

師匠は弟子に、もしやり方が分からないことがあったら、私に聞きに来なさい、と言いました。

すると、顧客が来て、衛星電話の修理を依頼してきました。弟子は師匠に助けを求めに行きましたが、師匠はやり方が分からないと言って、とりあえず断りました。

しかし、次に衛星電話を修理している人に出会ったときにどうすればよいか教えてもらえなかったため、その客は質問し続け、そのたびに弟子は師匠にアドバイスを求めに行った。結局、弟子は衛星電話の修理で師匠のストレスを軽減する手助けをすることができず、死ぬほどイライラしてしまいました。

上記の話は「キャッシュ侵入」のようなものです。

「キャッシュアバランチ」に関しては、弟子は若くて体力があり、エネルギーがたっぷりあるため、1時間で20台の携帯電話を修理できますが、古い師匠は10台しか修理できません(ただし、彼の技術はより優れており、洗練されています)。

ある日、弟子は休暇を申し出たのですが、その日はたまたま2,000人もの人が携帯電話を修理に来たため、全員を修理できず師匠は疲れ果ててしまいました。

したがって、「キャッシュ侵入」と「キャッシュ雪崩」の最終的な影響は同じであり、大量のリクエストが DB に流れ込み、DB をダウンさせます (前の話の古いマスターのように)。

両者の最大の違いは、「キャッシュ アバランシェ」問題は、データが DB 内で見つかり、キャッシュに入れられる限り (見習いが休暇から戻る)、正常な状態に回復できるのに対し、「キャッシュ ペネトレーション」は、必要なデータが DB 内にまったく存在しない状況を指す (古いマスターも修正できない) ことです。また、DB にデータが存在しないので、毎回キャッシュから見つけることは当然不可能です (弟子はそれを修正する方法を知りません)。

2 つの違いがわかったところで、「キャッシュ侵入」に対処する一般的な方法について説明しましょう。

キャッシュ侵入

「キャッシュ侵入」は「キャッシュ破壊」とも呼ばれることがあります。論理的なプロセスは次のとおりです。常に点線の範囲内で流れます。

このシナリオでは、キャッシュはまったく役に立たず、すべてのリクエストが DB に「侵入」します。

なぜ DB にデータが存在しないケースがこれほど多いのか疑問に思うかもしれません。実際、この問題は、クエリに外部パラメータに依存するあらゆる場所に存在する可能性があります。たとえば、テキスト入力ボックスにユーザー名を入力できるはずですが、誤ってパスワードを入力してしまうと、当然データを見つけることができません。さらに重要な問題は、悪意のある要素がこのメカニズムを使用してシステムを攻撃し、キャッシュに侵入してデータベースをダウンさせ、システム全体に障害を引き起こす可能性があることです。

この問題を解決する方法も 2 つあります。

ブルームフィルタ

ブルーム フィルターは、非常に長いバイナリ ベクトルと一連のランダム マッピング関数で構成されます。存在しないと判断されたデータはフィルターに組み込まれ、リクエストをフィルターするために使用されます。ここでは写真を載せるだけにして、詳細は省きます。これについては後で説明します (興味がある場合は、まず検索エンジンで「許容エラーによるハッシュコーディングの空間時間トレードオフ」を検索して、ブルームの元の論文を見つけてください)。

実装コードは実際にはそれほど複雑ではありません。論文やインターネット上の他の著者の実装を参考にして書くこともできます。

しかし、ブルーム フィルタの最大の欠点は、メモリを効率的に使用するための代償でもあり、100% の精度を保証できないことです。

したがって、シーンで 100% の精度が必要な場合は、次の方法のみを使用できます。

空のオブジェクトをキャッシュする

実際、DB から取得されたデータが「null」であっても、キャッシュ内で失われます。

こうすることで、キャッシュ内に空の値を持つデータが存在しても、少なくとも「データベース内で検索する必要がない」ことを示すことができます。

実際、このアイデアはブルーム フィルタに多少似ていますが、ブルーム フィルタはストレージにビットを使用するため、はるかに多くのメモリを消費します。ただし、この方法の利点は前述のとおりです。エラーは発生せず、ブルーム フィルタのエラー率は「ビット」の数が増えるにつれて減少し、0 に近づき続けますが、0 にはなりません。

要約する

では、一緒にまとめていきましょう。

今回、Z 兄弟は主に、キャッシュに隠された 2 つの「壊滅的な」シード、「キャッシュ雪崩」と「キャッシュ侵入」について、またこれら 2 つのシードに対処する一般的な方法についてお話ししました。

さらに、「キャッシュアバランシェ」と「キャッシュペネトレーション」の違いを区別するのに役立ちます。

それがあなたにインスピレーションを与えてくれることを願っています。

<<:  5Gは、国内のクラウドコンピューティング大手が国際的な大手を追い抜くための新たな跳躍台となるでしょうか?

>>:  2021年第1四半期の財務報告からClouderaの変革の軌跡を見る

推薦する

分散ストレージシステムの機能に関する簡単な説明

異常分類分散ストレージ システムが重点を置く例外の種類は、モノリシック システムの場合とは異なります...

エッジコンピューティングをクラウドコンピューティングアーキテクチャに統合することの利点と欠点

[[430276]]エッジ コンピューティングは、エッジ デバイス (エッジ ノードとも呼ばれます)...

bluevps - 1.99 ドル、無制限の KVM 仮想 VPS、オプションのデータセンター 6 つ

bluevps は、設立時期が不明な VPS ビジネスです。同社の Web サイトには英語版とロシア...

三国競争は単なる表面的な現象なのでしょうか?国内パブリッククラウド市場は活況を呈している

現在、クラウド コンピューティングはデジタル インフラストラクチャの重要な部分であり、デジタル経済の...

年間売上高10億円を超える大手飲食チェーンはO2Oをどのように捉えているのでしょうか?

私はこれまで Paidai で 10 本以上の O2O 記事を掲載してきたため、今朝、年間売上高 1...

インターネットの進歩と発展に影響を与えた20の主要なマイルストーンを振り返る

今日、人々はスマートフォン、自宅の高速ブロードバンド、インターネットに接続されたオフィスのコンピュー...

無駄な外部リンクを避け、最適化の意味合いを取り入れる

ウェブサイトの最適化の重要な形態として、外部リンクは今年のBaiduアルゴリズムの調整で多くのウェブ...

今日の中国におけるSEOの急速な発展の3つの主要な要因の解釈

中国で最も人気のあるオンラインプロモーションの方法は何ですか?と尋ねたら、私のウェブマスターの友人の...

A5ウェブマスターネットワーク初のオンライン入札収益トレーニングクラスが受講生募集を開始

1. オンライン入札とは何ですか?簡単に言えば、入札とは、Baidu、Google、Soso、Sog...

Jumei IPOの嘘:モバイルデータの49%は誇張されているが、競争力は偽り

Jumei IPOの嘘:モバイルデータの49%が誇張されていたファイナンシャルウィークリー研修記者 ...

クラウドコンピューティングとは何ですか?理解するための1つの記事

[[382681]] 「クラウド」という概念は私たちの生活の隅々まで浸透しています。 2021年の春...

事例分析: ウェブサイトの更新頻度が適切でないとウェブサイトの降格につながる

この問題の根本的な原因は、上司が出張中で、私が一週間何もせず、外部リンクを投稿せず、ニュースを更新し...

誤解: 301 リダイレクト エラーの泥沼から抜け出す

すべてのウェブマスター、特に SEO について予備的な知識を持っているウェブマスターにとって、301...

admin5フォーラム管理から学んだ運用の詳細

admin5フォーラムの投稿数は毎日5桁を超え、このような大量の投稿に基づくフォーラム全体は「秩序が...

CIO: マルチクラウド戦略を採用することの長所と短所、そしてアドバイス

パブリック クラウド市場における競争により、CIO はソフトウェアやインフラストラクチャをレンタルす...