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

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

[[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の変革の軌跡を見る

推薦する

オラクルとRunlian Technologyが戦略的提携を締結

オラクル・コーポレーションは、2019 Oracle Cloud Conferenceにおいて、深セ...

年末総括:私たちが作成した中国語の外部リンクのリスト

最近最も話題になっているのは電車の切符、年末ボーナス、年次休暇などであり、年末の雰囲気はますます熱を...

#黑5# changeip: 30% オフ、Shark データセンター VPS、無制限のトラフィック + 20Gbps の高防御、Windows 搭載

Changeip は長い間登場していないようです。Shark Data Center の VPS は...

ウェブサイトのホームページタイトルの書き方——考え方を変えた方がいいかもしれない

企業の Web サイトの場合、ホームページのタイトルは、2 つまたは 3 つのコアキーワード + 会...

Baidu 入札で除外する必要がある IP アドレスはどれですか?

ご存知のとおり、Baidu 入札バックグラウンドには「IP 除外」という機能があります。この機能は主...

ウェブサイトのSEO最適化プロセスにおけるコンテンツ構築の思考方向の分析と解釈

ご存知のとおり、ウェブサイトの SEO 最適化のプロセスでは、コンテンツが第一の要素です。コンテンツ...

ウェブサイトのランキングを最適化するにはどのくらいの時間がかかり、最適化サイクルが効果を発揮するにはどのくらいの時間がかかりますか?

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

草の根ウェブサイトが他のウェブサイトより目立つ方法

今日のウェブサイト市場はますます飽和状態になりつつあります。さまざまなウェブサイトが次々と登場します...

絶妙な内部リンク構築を行い、ウェブサイトを繁栄させましょう

現在、ウェブマスターは内部リンクの構築について話すとき、しばしば混乱しているように見えます。これは、...

IoTとクラウドコンピューティングの潜在的な関係を明らかにする

今日、周りを見渡すと、モノのインターネット (IoT) が家庭でも職場でも私たちの日常生活に大きな変...

akkocloud: 夕方のピーク時にクラッシュせず、Naifeのブロックを解除できるドイツのcn2 gia VPS(1Gbps帯域幅)の簡単なレビュー

市場にはドイツの cn2 gia 回線を備えた VPS は比較的少なく、1Gbps の帯域幅を提供す...

中国での優れたSEOは井の中の蛙ではない

みなさんこんにちは。私の名前はLiang Lei、オンライン名はStoneです。初心者にとって、SE...

flipperhost - $5.75/4 コア/4g メモリ/125g ハードドライブ/10T トラフィック/ロサンゼルス

Flipperhost は 6 年前に登録された会社です。主な事業は仮想ホスティング、VPS、サーバ...

ローカルウェブサイトの人材ジレンマは、ローカルウェブサイトの現在の人材問題を要約しています。

まだ初期段階にあるローカル Web サイトにとって、人材の問題は実は開発における最大のボトルネックで...

「技術的負債」を解消するにはどうすればいいでしょうか?効率的な DevOps チームのための 6 つの核兵器

[51CTO.com からのオリジナル記事] 現在、Netflix、Etsy、Flickr などの企...