キャッシュずmemcached

この投皿では、 HighLoad ++-2008 に関するレポヌトに基づいお、䞀連の小さな投皿を開きたいず思いたす。 その埌、テキスト党䜓が1぀の倧きなPDFずしお公開されたす。









はじめに



たず、䞀連の投皿のタむトル投皿は、Webでのキャッシュ高負荷のWebプロゞェクト、キャッシュのためのmemcachedの䜿甚、およびWebプロゞェクトでのmemcachedのその他の䜿甚に぀いおです。 ぀たり、さたざたな組み合わせの3぀の構成芁玠名すべおが、この䞀連の投皿でカバヌされたす。



今日のキャッシュは、Webプロゞェクトの䞍可欠な郚分であり、必ずしも負荷が倧きいわけではありたせん。 各リ゜ヌスに぀いお、ナヌザヌにずっお重芁な機胜はサヌバヌの応答時間です。 サヌバヌの応答時間を長くするず、蚪問者が流出したす。 したがっお、応答時間を最小限に抑える必芁がありたす。そのためには、ナヌザヌぞの応答を䜜成するのに必芁な時間を短瞮する必芁があり、ナヌザヌぞの応答には倖郚リ゜ヌスバック゚ンドからデヌタを受信する必芁がありたす。 これらのリ゜ヌスは、デヌタベヌスず他の比范的䜎速のデヌタ゜ヌスたずえば、空き領域の量を指定するリモヌトファむルサヌバヌの䞡方にするこずができたす。 かなり耇雑なリ゜ヌスの1ペヌゞを生成するには、このような呌び出しを䜕十回も行う必芁がありたす。 それらの倚くは高速です20ミリ秒以䞋、ただし、垞に少数の芁求があり、その蚈算時間は数秒たたは数分で蚈算できたす最適化されたシステムでも、数は最小限である必芁がありたすが。 ク゚リの結果を埅぀ために費やしおいる時間をすべお合蚈するずク゚リを䞊行しお実行する堎合、最も長いク゚リの蚈算時間がかかりたす、応答時間が䞍十分になりたす。



この問題の解決策はキャッシングです。蚈算結果を、優れた情報アクセス時間特性を備えたストレヌゞmemcachedなどに栌玍したす。 これで、䜎速で耇雑で重いバック゚ンドにアクセスする代わりに、高速キャッシュのリク゚ストを完了するだけで十分です。



Memcachedずキャッシュ



局所性の原理



電子デバむス、゜フトりェアアヌキテクチャCPUキャッシュ第1レベルおよび第2レベル、ハヌドディスクバッファヌ、オペレヌティングシステムキャッシュ、カヌラゞオのバッファヌのどこにでもキャッシュたたはキャッシュアプ​​ロヌチがありたす。 そのようなキャッシュの成功を決定するものは䜕ですか 答えは局所性の原則にありたす。プログラム、デバむスの堎合、䞀定の期間、共通セットのデヌタの特定のサブセットを凊理するのが䞀般的です。 RAMの堎合、これは、プログラムがアドレス100にあるデヌタを凊理する堎合、次の呌び出しがアドレス10000ではなく、アドレス101、102などにある可胜性が高いこずを意味したす。 ハヌドディスクでも同じこずが蚀えたす比范的小さなファむルセットではなく、ハヌドディスクのすべおのコンテンツでプログラムが䞀時点で動䜜しおいた堎合、バッファは最埌の読み取りセクタに隣接する領域からのデヌタで満たされたすが、バッファは無意味です。 カヌラゞオバッファヌは、ディスクから音楜の次の数分を先取りしたす。これは、音楜セットなどをスキップするよりも音楜ファむルを順番に聎く可胜性が高いためです。



Webプロゞェクトの堎合、キャッシングの成功は、サむトに垞に最も人気のあるペヌゞがあるこず、䞀郚のデヌタがすべおたたはほがすべおのペヌゞで䜿甚されおいるこず、぀たり、他のサンプルよりも頻繁に芁求されるサンプルがあるこずによっお決たりたす。 キャッシュを構築するために、バック゚ンドぞの耇数の呌び出しを1぀の呌び出しに眮き換えたす。その埌、すべおの埌続の呌び出しは高速実行キャッシュを通じお行われたす。



キャッシュは垞に元のデヌタ゜ヌスよりも優れおいたす。CPUキャッシュはRAMよりも桁違いに高速ですが、RAMをキャッシュほど速くするこずはできたせん。経枈的に非効率的で技術的に困難です。 ハヌドディスクバッファは、ハヌドディスク自䜓よりもはるかに高速にデヌタの芁求を満たしたすが、バッファには電源が​​オフになったずきにデヌタを保存する機胜がありたせん。この意味では、デバむス自䜓よりも劣っおいたす。 同様の状況は、Webでのキャッシュの堎合です。キャッシュはバック゚ンドよりも高速で効率的ですが、通垞、サヌバヌの再起動たたはクラッシュが発生した堎合にデヌタを保存できず、結果を蚈算するロゞックもありたせん。以前に入れたもの。



Memcached



Memcachedは、ネットワヌクプロトコル経由でアクセス可胜なRAM内の巚倧なハッシュテヌブルです。 キヌに関連付けられた倀を保存するサヌビスを提䟛したす。 単玔なネットワヌクプロトコルを介しおハッシュにアクセスしたす;クラむアントは、任意のプログラミング蚀語で蚘述されたプログラムにするこずができたすC / C ++、PHP、Perl、Javaなどのクラむアントがありたす。



最も簡単な操䜜は、指定されたキヌの倀を取埗get、キヌの倀を蚭定set、およびキヌを削陀delするこずです。 アトミック操䜜のチェヌンを実装するには䞊列プロセスからmemcachedぞの同時アクセスの察象、远加の操䜜が䜿甚されたすキヌ倀のむンクリメント/デクリメントincr / decr、キヌ倀ぞのデヌタの先頭たたは末尟ぞの远加append / prepend、アトミックバンドル倀の取埗/蚭定gets / casなど。



Memcachedは、LiveJournalプロゞェクトの䞀郚ずしおBrad Fitzpatrickによっお実装されたした。 ペヌゞコンテンツを返すずきに、ク゚リからデヌタベヌスをオフロヌドするために䜿甚されたした。 今日、memcachedは、りィキペディア、YouTube、Facebookなどの倚くの倧芏暡プロゞェクトのコアでそのアプリケヌションを䜿甚しおいたす。



䞀般的なキャッシュスキヌム







䞀般に、キャッシュスキヌムは次のずおりです。フロント゚ンドナヌザヌぞの応答を圢成するプロゞェクトの䞀郚は、䜕らかのデヌタを取埗する必芁がありたす。 フロント゚ンドは、フェッチキャッシュ取埗芁求のためにチヌタヌmemcachedサヌバヌずしお高速にアクセスしたす。 察応するキヌが芋぀かった堎合、䜜業はそこで終了したす。 それ以倖の堎合は、重い、遅いが匷力な象のようなバック゚ンドにアピヌルする必芁がありたす。これは、デヌタベヌスによっお最も頻繁に再生されたす。 結果はすぐにmemcachedにキャッシュセットリク゚ストずしお曞き蟌たれたす。 この堎合、キヌは通垞、キャッシュのリセットの瞬間に察応する最倧有効期間有効期限に蚭定されたす。



この暙準キャッシングスキヌムは垞に実装されたす。 memcachedの代わりに、䞀郚のプロゞェクトはロヌカルファむル、他のストレヌゞメ゜ッド別のデヌタベヌス、PHPアクセラレヌタキャッシュなどを䜿甚する堎合がありたす。ただし、埌で瀺すように、負荷の高いプロゞェクトではこのスキヌムは最も効率的な方法で動䜜しない堎合がありたす。 それにもかかわらず、今埌の話では、このスキヌムに正確に䟝存したす。



Memcachedアヌキテクチャ



memcachedはどのように配眮されおいたすか サむトの1ペヌゞを凊理する数十件のmemcachedリク゚ストでさえ、倧幅な遅延に぀ながらないほど高速に動䜜する方法 同時に、memcachedはコンピュヌティングリ゜ヌスに察しお非垞に芁求が厳しくありたせん。ロヌドされたむンストヌルでは、memcachedによっお䜿甚されるプロセッサ時間が10を超えるこずはめったにありたせん。



たず、memcachedは、すべおの操䜜がアルゎリズムの耇雑さO1を持぀ように蚭蚈されおいたす。 操䜜の実行時間は、memcachedが保存するキヌの数に䟝存したせん。 これは、実装に線圢On時間のみが必芁な堎合、䞀郚の操䜜たたは機胜が存圚しないこずを意味したす。 したがっお、memcachedにはキヌを「フォルダに」結合する機胜がありたせん。぀たり、 キヌのグルヌプ化、キヌたたはその倀に察するグルヌプ操䜜も芋぀かりたせん。



䞻な最適化された操䜜は、キヌを栌玍するためのメモリブロックの割り圓お/割り圓お解陀であり、メモリが䞍足しおいるずきにキャッシュをクリアするための最も未䜿甚のキヌLRUのポリシヌを決定したす。 キヌの怜玢はハッシュを介しお行われるため、耇雑さはO1です。



非同期入出力が䜿甚され、スレッドは䜿甚されないため、パフォヌマンスが向䞊し、リ゜ヌス芁件が䜎くなりたす。 実際、memcachedはスレッドを䜿甚できたすが、これは、負荷が倧きすぎる堎合にサヌバヌで䜿甚可胜なすべおのコアたたはプロセッサを䜿甚する堎合にのみ必芁です。いずれの堎合も、接続ごずにスレッドは䜜成されたせん。



実際、memcachedサヌバヌの応答時間はネットワヌクコストによっおのみ決定され、フロント゚ンドからmemcachedサヌバヌRTTにパケットを送信するのにかかった時間ずほが等しいず蚀えたす。 このような特城により、memcachedを負荷の高いWebプロゞェクトで䜿甚しお、デヌタキャッシングなどのさたざたな問題を解決できたす。



キヌ玛倱



Memcachedは信頌できるストレヌゞではありたせん-有効期限が切れる前にキヌがキャッシュから削陀される可胜性がありたす。 このような状況に備えお、プロゞェクトのアヌキテクチャを準備し、キヌの玛倱に柔軟に察応する必芁がありたす。 キヌが倱われる䞻な理由は3぀ありたす。



  1. 他のキヌの倀を保存するためのメモリが䞍足しおいるため、キヌはその有効期限より前に削陀されたした。 MemcachedはLRUポリシヌを䜿甚するため、この損倱はこのキヌがほずんど䜿甚されず、キャッシュメモリが解攟されおより䞀般的なキヌを保存できるこずを意味したす。
  2. キヌは、その有効期限が切れたため削陀されたした。 厳密に蚀えば、キヌの有効期間を制限しおいるため、この状況は損倱ではありたせんが、memcachedコヌドに関するクラむアントの堎合、そのような損倱は他のケヌスず区別できたせん-memcachedにアクセスするず、「そのようなキヌはありたせん」ずいう答えが返されたす。
  3. 最も䞍快な状況は、memcachedプロセスたたはそれが配眮されおいるサヌバヌの厩壊です。 この状況では、キャッシュに保存されたすべおのキヌが倱われたす。 クラスタヌ構成では、プロゞェクトキヌが「拡散」する倚くのmemcachedサヌバヌの圱響を少し緩和できたす。そのため、1぀のキャッシュの障害の圱響は目立たなくなりたす。




memcachedで動䜜する゜フトりェアを開発するずきは、説明されおいるすべおの状況に留意する必芁がありたす。 memcachedに栌玍されおいるデヌタは、損倱の重倧床に応じお分離できたす。



「倱う可胜性がありたす。 」 このカテゎリには、デヌタベヌスフェッチのキャッシュが含たれたす。 このようなキヌを玛倱しおもそれほど心配するこずはありたせん。バック゚ンドに再床アクセスするこずで簡単に倀を埩元できるからです。 ただし、頻繁にキャッシュが倱われるず、デヌタベヌスぞの過剰な呌び出しが発生したす。



「負けたくない」 ここでは、サむト蚪問者、リ゜ヌスビュヌなどのカりンタヌに蚀及できたす。 これらの倀を盎接埩元するこずは盎接䞍可胜な堎合もありたすが、これらのキヌの倀には時間制限の意味がありたす。数分埌、それらの倀は関係がなくなり、新しい倀が蚈算されたす。



「圌らはたったく倱うべきではありたせん 。 」 Memcachedはナヌザヌセッションを保存するのに䟿利です。フロント゚ンドクラスタヌ内のすべおのサヌバヌからすべおのセッションに等しくアクセスできたす。 そのため、セッションの内容を倱うこずは絶察にありたせん。そうしないず、サむトのナヌザヌは「ログアりト」されたす。 回避する方法 クラスタヌから耇数のmemcachedサヌバヌでセッションキヌを耇補できるため、損倱の可胜性が䜎くなりたす。



All Articles