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

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

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

推薦する

speedykvm-20% オフ/KVM/$36/年/1g メモリ/50g SSD/1.5T トラフィック/Windows

incero.com データセンター傘下の KVM ベースの VPS ブランドである speedyk...

chicagovps-ssd vps シンプルレビュー

chicagovps は過去にデータ損失を経験しており、solusvm の脆弱性によりメンバーのデー...

デジタルトランスフォーメーションでDevOpsを保護する方法

最近のテクノロジー業界で最もホットな流行語は「デジタルトランスフォーメーション」です。これは、企業が...

分散トレーニング入門: PyTorch を使用してマルチ GPU 分散トレーニングを実装する方法

具体的には、この記事ではまず、分散コンピューティングの基本概念と、分散コンピューティングがディープラ...

百度は検索体験を重視しており、背景や技術のない小規模ウェブマスターの将来は心配だ

今年6月末から、百度は検索エンジンのアルゴリズムを大幅に調整し、いくつかの大規模サイトを相次いで禁止...

最適化環境が悪いときにウェブサイトへのトラフィックを増やす方法

百度の最近の暴発により、国内の最適化環境は混乱し、非常に悪化しています。通常、ランキングを獲得するた...

周寧:ローカル Web サイトがユーザーを維持する方法を分析するための 6 つの側面とは?

ローカルウェブサイトの分野では、注目に値する現象がいくつかあります。ローカルウェブサイトの主な形態は...

SEO 技術と SEO 雇用開発の見通しはどうですか?

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

ウェブマスターネットワークからの毎日のレポート: BMC モデルは疎外され、12306 は麻痺しています

1.12306 チケット予約ウェブサイトのシステムが3日間で2回麻痺した新浪科技新聞は12月26日午...

「Souhuohufang.com」の1年間の運営経験をシェア

友人からモバイルハウス業界のことを教えてもらい、「Sou Mobile House Network」...

SEOテクノロジーの最適化の成功または失敗は詳細によって決まります

SEO 技術は言うのは簡単ですが、実行するのは非常に困難です。特に、特定の SEO 技術を使用する場...

皆様、建国記念日おめでとうございます!

一年で珍しい長い休日です。今年の建国記念日は7日間です。皆さんが楽しい時間を過ごせますように!当分の...

クラウド バックアップ ソリューションが解決できるビジネス上の問題

大量のデータを保有することは、法的に義務付けられており、組織にとっての責任でもあります。多くの組織は...

SEO ウェブサイト最適化: オフサイト記事の編集方法とテクニック

現在、SEOの最適化は、ユーザーエクスペリエンスの観点から、ウェブサイト全体のプロモーションの70%...