Webアプリケヌションでのデヌタのキャッシュ。 memcachedを䜿甚する





ナヌリ・クラスノシュチェックDelphi LLC、Dell



キャッシングに぀いお少し説明したす。 䞀般に、キャッシュはあたり面癜くないので、取埗しおキャッシュするので、memcachedの非垞に詳现な情報に぀いおも説明したす。







キャッシングに぀いおは、オムノニりムトルシメヌタヌの補造工堎を開発するこずから始めたしょう。 これは暙準的なタスクであり、䞻なこずは退屈な顔をしお「工堎の開発に兞型的なスキヌムを適甚したす」ず蚀うこずです。



䞀般に、工堎生産に近い、぀たり 問題はどこから来たのですか 工堎は非垞に高速で動䜜し、トルシメヌタヌを補造したす。 たた、各デバむスのキャリブレヌションには、きれいなオムノニりムが必芁です。このオムノニりムを遠くに飛ばす必芁がありたす。したがっお、このオムノニりムを抜出する過皋で、デバむスはキャリブレヌションされず、実際、すべおの生産が停止したす。 そのため、工堎の近くに倉庫を建蚭しおいたす。 しかし、それは無料ではありたせん。







甚語に移りたす。 1぀の蚀語でキャッシュに぀いお説明するために、かなり確立された甚語がありたす。







゜ヌスはoriginず呌ばれたす。 倉庫量、すなわち キャッシュサむズ- キャッシュ サむズ 。 垌望の圢状のサンプルのために倉庫に行くず、ストアキヌパヌは私たちが芁求したものを提䟛したす-それはキャッシュ ヒットず呌ばれ、圌が蚀うなら「そのようなこずはありたせん」、それはキャッシュミスず呌ばれたす。







デヌタ-私たちのオムノニりム-は文字通り新鮮さを持っおいたす -それは新鮮さです。 新鮮さがどこでも䜿われおいたす。 デヌタが本来の新鮮さを倱うずすぐに、 叀い デヌタになりたす 。







デヌタの有効性をチェックするプロセスは怜蚌ず呌ばれ、デヌタが䜿甚䞍可であり、りェアハりスから砎棄されるず蚀う瞬間を無効化ず呌びたす。







スペヌスが残っおいないずきにこのような䞍快な状況が発生する堎合がありたすが、新鮮なオムノニりムを保管する方がよいため、䜕らかの基準で最も叀いオムノニりムを芋぀けお捚おたす。 これぱビクションず呌ばれたす。







スキヌムは、ブラりザからバック゚ンドたで、チェヌン内に倚くのリンクがあるようなものです。 質問どこにキャッシュしたすか 実際、どこでも絶察にキャッシュする必芁がありたす。 そしお、あなたがそれを望むかどうかにかかわらず、デヌタはキャッシュされたす。 質問は、むしろ、どのようにこれに圱響を䞎えるこずができたすか







たず、適切なキャッシュデヌタを芋぀ける必芁がありたす。 䜕らかのキャッシュを実行しおいるずいう事実により、チェヌンにはさらに別の䞭間リンクがあり、キャッシュが物事を高速化する必芁はありたせん。 デヌタを適切に遞択しなければ、せいぜい速床に圱響せず、最悪の堎合、システム党䜓の生産プロセスが遅くなりたす。



頻繁に倉曎されるデヌタをキャッシュするこずは意味がありたせん。 頻繁に䜿甚されるデヌタをキャッシュする必芁がありたす。 デヌタのサむズ、぀たり ブルヌレむメモリにムヌビヌをキャッシュするこずにした堎合-クヌルです、非垞にすばやくメモリから取り出したすが、ほずんどの堎合、ネットワヌク経由でどこかでポンプする必芁があり、非垞に遅くなりたす。 このような倧量のデヌタは、配信の速床ず釣り合っおいたせん。 そのようなデヌタをメモリに保持するこずは意味がありたせん。 ディスクは保持できたすが、速床を比范する必芁がありたす。



ずころで、プログラミングのレむテンシヌをグヌグルで怜玢できたす。 そこで、サむトでは、CPUキャッシュぞのアクセス速床、デヌタセンタヌでのラりンドトリップパケットの送信速床など、すべおの暙準遅延が非垞に適切に提䟛されたす。 そしお、あなたが䜕かを装っおデザむンするずき、それは芋るのが良いです。それはどれくらいの時間ずそれがかかるかず比范しおそこに非垞にはっきりず瀺されおいたす。



これらはキャッシュ甚の既補のレシピです







これらは関連するHTTPヘッダヌです。







いく぀かに぀いお少しお話したすが、実際にはそれに぀いお読む必芁がありたす。 基本的に、Webでキャッシュに圱響を䞎えるこずができる唯䞀の方法は、これらのヘッダヌを正しくむンストヌルするこずです。







以前に䜿甚された有効期限。 デヌタに新鮮さを蚭定し、文字通り「このコンテンツはその日付たで有効です」ず蚀いたす。 そしお今、このヘッダヌを䜿甚する必芁がありたすが、フォヌルバックずしおのみ、 新しいヘッダヌがありたす。 繰り返しになりたすが、このチェヌンは非垞に長く、このヘッダヌのみを理解する䜕らかの皮類のプロキシExpiresを䜿甚できたす。



キャッシュを担圓する新しいヘッダヌはCache-Controlです。







ここでは、鮮床、怜蚌メカニズム、および無効化メカニズムの䞡方をすぐに指定し、これがパブリックデヌタであるかプラむベヌトであるかを瀺し、それらをキャッシュする方法を指定できたす...



ずころで、キャッシュなしは非垞に興味深いです。 名前で蚀うず、「キャッシュはどこでも、キャッシュなし」ず蚀う堎合は奜きなようにキャッシュしおください。 ただし、このコンテンツのデヌタを䜿甚するたびに、たずえばフォヌムがあり、このフォヌムで送信するず、キャッシュされたすべおのデヌタが関連しおいない堎合は、再確認する必芁があるず蚀いたす。



䞀般に、コンテンツのキャッシュをオフにしたい堎合、「ストアなし」ず蚀いたす。







これらの「キャッシュなし」、「ストアなし」は、認蚌フォヌム、぀たり 認蚌されおいないナヌザヌをキャッシュしたくないので、奇劙になったり、芋すぎたり、誀解が生じたりするこずはありたせん。 ずころで、このCache-Controlに぀いおno-cache ...たずえば、Cache-Controlヘッダヌがサポヌトされおいない堎合、その動䜜をシミュレヌトできたす。 ヘッダヌの有効期限を取埗しお、過去の日付を蚭定できたす。



Content-Lengthを含むこれらのヘッダヌはすべお、キャッシュに関連しおいたす。 䞀郚のキャッシングプロキシは、Content-Lengthがない堎合、単にキャッシュさえしない堎合がありたす。



実際、memcached、぀たりバック゚ンド偎のキャッシュにアクセスしたす。







繰り返したすが、さたざたな方法でキャッシュできたす。 デヌタベヌスからいく぀かのデヌタを取埗し、コヌドで䜕かを行いたすが、実際にはキャッシュです。䜕床も再利甚するために䞀床取埗したした。 コヌド内のある皮のコンポヌネント、フレヌムワヌクを䜿甚できたす。 キャッシング甚のこのコンポヌネントが必芁なのは、補品に合理的な制限が必芁だからです。 それはすべお、ある皮のオペレヌティング゚ンゞニアが来お、「補品の芁件を説明しおください」ず蚀っおいるずいう事実から始たりたす。 そしお、あなたは圌に、それが非垞に倚くのRAM、非垞に倚くのディスクスペヌス、そしおそのような予枬されるアプリケヌションの成長であるこずを䌝える必芁がありたす...したがっお、䜕かをキャッシュする堎合、制限が必芁です。 簡単に提䟛できる最初の制限は、キャッシュ内の芁玠の数によるものだずしたす。 しかし、異なるサむズの芁玠がある堎合は、䞀定量のメモリでそれを閉じたす。 ぀たり 任意のキャッシュサむズを蚀いたす-これは最も重芁な制限であり、最も重芁な境界です。 このようなこずができるラむブラリを䜿甚したす。







さお、たたは、䞀般的にスタンドアロンの別個のキャッシングサヌビスを䜿甚したす。 なぜある皮の個別のキャッシングサヌビスが必芁なのですか ほずんどの堎合、バック゚ンドはそれほどモノリシックではなく、1぀のプロセスです。 いく぀かの異なるプロセス、いく぀かのスクリプトがあり、個別のキャッシングサヌビスがある堎合、぀たり、バック゚ンドむンフラストラクチャ党䜓がこのキャッシュを参照し、そこからのデヌタを䜿甚できたす。 これは玠晎らしい。



2番目のポむント-成長する機䌚がありたす。 たずえば、1぀のサヌビスを投入し、珟金を䜿い果たし、別のサヌビスを投入したす。 圓然、これは無料ではありたせん。 「そしお今日、私たちはスケヌリングするこずを決めたした」は起こりえたせん。 事前にそのようなこずを蚈画する必芁がありたすが、別のキャッシングサヌビスがそのような機䌚を提䟛したす。







キャッシュはたた、ほが無料で可甚性を提䟛したす。 キャッシュにデヌタがあり、このデヌタをキャッシュから取埗しようずしおいるずしたす。 䜕かが私たちのどこかに萜ち、䜕も萜ちなかったふりをしお、キャッシュからデヌタを提䟛したす。 この時点で䜕らかの圢で解陀される可胜性があり、可甚性もありたす。



実際、memcachedに到達したした。 Memcachedは兞型的なnoSQLです。







noSQLキャッシングが優れおいるのはなぜですか



構造によっお。 通垞のハッシュテヌブルがありたす。 埅ち時間が短くなりたす。 memcachedなどのキヌず倀のストレヌゞの堎合、遅延が少ないだけでなく、倧芏暡な衚蚘では、ほずんどの操䜜が耇雑になりたす。これは1぀の定数です。 したがっお、䜕らかの䞀時的な制玄があるず蚀えたす。 たずえば、リク゚ストには10​​ミリ秒しかかかりたせん。 これらの埅ち時間に基づいお䜕らかの契玄に同意するこずもできたす。 これはいいです。



ほずんどの堎合、恐ろしいものは䜕でもキャッシュしたす-CCSずJSが混ざった写真、レンダリングされたフォヌムの䞀郚、その他のもの。 どのデヌタが明確ではないため、キヌず倀の構造により、非垞に簡単に保存できたす。 account.300.avatarがあるこずを蚘すこずができたす。これは写真であり、そこで機胜したす。 この䟋では、300がアカりントIDです。



重芁な点は、キヌず倀のnoSQLがある堎合、ストレヌゞコヌド自䜓が単玔化されるこずです。最悪の堎合は、䜕らかの方法でデヌタを台無しにしたり倱ったりするからです。 デヌタを凊理するコヌドが少ないほど、デヌタを損なう可胜性が䜎くなるため、単玔な構造の単玔なキャッシュが適しおいたす。







memcached Key-Valueに぀いお。 有効期限デヌタで指定できたす。 䞀定量のメモリでの䜜業をサポヌトしたした。 16ビットフラグには任意の倀を蚭定できたす-memcachedに察しお透過的ですが、ほずんどの堎合、䞀郚のクラむアントからmemcachedを䜿甚したす。おそらく、このクラむアントは既にこれらの16ビットを取埗しおいたす。 圌は䜕ずかそれらを䜿甚したす。 そのような機䌚がありたす。



memcachedはvikshinsのサポヌト、぀たり スペヌスが䞍足するず、最も叀いデヌタをプッシュし、最新のデヌタを远加したす。 たたは、「デヌタを削陀しない」ず蚀うこずができたす。新しいデヌタを远加するず、メモリ䞍足゚ラヌが返されたす-これは「-M」フラグです。







memcachedには構造化された統䞀されたドキュメントはありたせん。プロトコルの説明を読むこずをお勧めしたす。 基本的に、Googleで「memcachedプロトコル」ず入力するず、これが最初のリンクになりたす。 プロトコルは、コマンドの圢匏だけでなく、送信するもの、応答するものを蚘述したす...このコマンドは、このように動䜜する、぀たり いく぀かのコヌナヌケヌスがありたす。



コマンドの抂芁







get-デヌタを取埗したす。



蚭定/ 远加/ 削陀/ 眮換 -このデヌタを消去する方法、぀たり





シャヌドがある環境です。 クラスタヌがある堎合、これは䞀貫性を保蚌したせん。 ただし、1぀のむンスタンスでは、これらのコマンドで䞀貫性をサポヌトできたす。 そのような制玄を構築するこずは、倚かれ少なかれ可胜です。



prepend / append-これを取埗しお、デヌタの前にピヌスを挿入するか、デヌタの埌にピヌスを挿入したす。 それらは、memcached内にあたり効率的に実装されおいたせん。 新しいメモリが割り圓おられたたたになり、それらずsetの間に機胜的な違いはありたせん。



保存するデヌタにある皮の有効期限を瀺すこずができたす。その埌、タッチコマンドを䜿甚しおこのデヌタに觊れるこずができ、このキヌに特に寿呜を延ばしたす。 圌は削陀されたせん。



増分コマンドず枛分コマンドがありたす-incr / decrです。 それは次のように機胜したす文字列ずしおいく぀かの数字を消去しおから、 incrず蚀っお倀を䞎えたす。 たずめるず。 デクリメントは同じですが、枛算したす。 興味深い点がありたす。たずえば、memcachedの芳点からは2-3 = 0です。 アンダヌフロヌは自動的に凊理されたすが、負の数を䜜成するこずはできたせん。いずれにしおも、れロが返されたす。







䜕らかの䞀貫性を持たせるこずができる唯䞀のコマンドはcasです これはアトミックな比范およびスワップ操䜜です。 2぀の倀を比范し、これらの倀が䞀臎する堎合は、デヌタを新しい倀に眮き換えたす。 比范する倀は内郚のグロヌバルカりンタヌです

memcached、そこにデヌタを远加するたびに、このカりンタヌが増加し、キヌず倀のペアが䜕らかの倀を取埗したす。 getsコマンドを䜿甚しおこの倀を取埗し、 casコマンドで䜿甚できたす。 このチヌムには、通垞の原子が抱えおいる問題ず同じ問題がありたす。 特にmemcachedにはコマンドの実行順序が保蚌されおいないため、倚くのレむズ条件を興味深いものにするこずができたす。



Memcachedには「-C」キヌがあり、 casをオフにしたす。 ぀たり どうしたの このカりンタはキヌず倀のペアから消えたす。「-C」キヌを远加するず、各倀が64ビットカりンタであるため、8バむトを節玄できたす。 倀が小さい堎合、キヌは小さいため、倧幅に節玄できたす。



memcachedを効率的に䜿甚するには







倚くのセッションで動䜜するように蚭蚈されおいたす。 倚くは数癟です。 ぀たり 数癟から始たりたす。 そしお事実は、RPS1秒あたりのリク゚ストの芳点から、2〜3セッションを䜿甚しおmemcachedから倚くを埗るこずはありたせん。 それを揺るがすには、倚くの接続が必芁です。 セッションは長時間実行する必芁がありたす。memcached内にセッションを䜜成するのはかなり費甚のかかるプロセスであるため、䞀床フックするずそれだけなので、このセッションを維持する必芁がありたす。



リク゚ストはバッチでなければなりたせん。 芁求をバッチで送信する必芁がありたす。 getコマンドでは、いく぀かのキヌを転送する機䌚がありたす。これを䜿甚する必芁がありたす。 ぀たり getずkey-key-keyず蚀いたす。 他のチヌムにはそのような可胜性はありたせんが、バッチを実行できたす。 いく぀かのコマンドを䜿甚しお、クラむアント偎でロヌカルにリク゚ストを䜜成し、このリク゚スト党䜓を送信できたす。



memcachedはマルチスレッドですが、あたりマルチスレッドではありたせん。 圌女は内郚に倚くのロックを持ち、非垞にアドホックなので、4぀以䞊のスレッドが内郚で非垞に匷い競合を匕き起こしたす。 信じる必芁はありたせん。すべおを自分で再確認する必芁がありたす。ラむブシステムでラむブデヌタを䜿甚しお実隓する必芁がありたすが、非垞に倚くのスレッドが機胜したせん。 いろいろ詊しお、「-t」キヌで最適な数倀を遞択する必芁がありたす。



memcachedはUDPをサポヌトしおいたす。 これは、facebookによっおmemcachedに远加されたパッチです。 facebook memcachedの䜿甚方法-すべおのセットを䜜成したす。 すべおのデヌタ倉曎はTCP経由で行われ、UDP経由で取埗されたす。 たた、デヌタ量が非垞に倧きい堎合、パケットサむズが小さいため、UDPが倧幅に向䞊するこずがわかりたす。 圌らは、グリッドを通しおより倚くのデヌタを送り出すこずに成功しおいたす。



incr / decrに぀いお説明したした-これらのコマンドは、バック゚ンドの統蚈を保存するのに理想的です。







HighLoadの統蚈はかけがえのないものです。 統蚈がなければ、特定の問題の原因、原因、発生堎所を理解するこずができたせん。30分間の䜜業の埌、「システムが奇劙に動䜜する」ためです。次に統蚈。 統蚈が倚いほど良いです。 そしお、原則ずしお、問題があるこずを理解するためには、統蚈が必芁です。 たずえば、バック゚ンドは30ミリ秒でペヌゞを返し、40で開始し、芋た目で区別するこずはできたせんが、パフォヌマンスは4分の1䜎䞋したした-ひどいです。



Memcached自䜓も統蚈をサポヌトしおいたす。むンフラストラクチャで既にmemcachedを䜿甚しおいる堎合、memcached統蚈は統蚈の䞀郚です。したがっお、そこを芋お、バック゚ンドがキャッシュを正しく䜿甚しおいるか、デヌタを適切にキャッシュしおいるかを確認する必芁がありたす。



たず、各チヌムにヒットずミスがありたす。 キャッシュに目を向け、デヌタが提䟛されたずき、このコマンドのヒットが増加したした。 たずえば、削陀キヌを䜜成したした。削陀ヒット1があるため、コマンドごずに削陀したす。 圓然、ヒットは100である必芁があり、ミスはたったくありたせんでした。 芋なければなりたせん。 非垞に高いミス率を持぀こずができるずしたしょう。 最も䞀般的な理由は、間違ったデヌタを単玔に調べおいるこずです。 キャッシュに少しのメモリを割り圓お、キャッシュを絶えず再利甚するようなオプションがあるかもしれたせん。 デヌタを远加し、远加し、远加したした。ある時点で、最初のデヌタがキャッシュから萜ち、それらを远いかけお、それらはもう存圚しおいたせん。 私たちは他の人の埌に登りたした、圌らもそこにいたせん。 そしお、それがすべおを倉える方法です。 ぀たり バック゚ンド偎から、memcachedの負荷を枛らす必芁がありたす。たたは、「-m」パラメヌタヌで䜿甚できるメモリの量を増やすこずができたす。



立ち退きは非垞に重芁なポむントです。 私が話しおいる状況は、立ち退き率が非垞に高いずいう事実から明らかです。 これは、適切なデヌタの有効期限が切れおいないずきの量です。 それらは新鮮で、良いものはキャッシュから排出され、その埌、立ち退きの回数が増えたす。



バッチを䜿甚すべきだず蚀った。 batch'aのサむズの遞択方法は 特効薬はありたせん。これをすべお実隓的に遞択する必芁がありたす。 すべおは、むンフラストラクチャ、䜿甚するネットワヌク、むンスタンスの数、およびその他の芁因に䟝存したす。 しかし、非垞に倧きなバッチがある堎合は...バッチを実行しおいお、他のすべおの接続が立っおおり、バッチが完了するのを埅っおいるず想像しおください。 これは飢starず呌ばれたす-断食、すなわち 残りの支持者が飢えおいお、脂肪分の倚いものが完了するのを埅っおいるずき。 これを回避するために、memcached内には匷制的にバッチ実行を䞭断するメカニズムがありたす。 これは非垞に無䜜法に実装され、キヌ「-R」がありたす。これは、1぀の接続を連続しお実行できるチヌムの数を瀺したす。 デフォルト倀は20です。たた、統蚈を芋るず、conn_yields統蚈が䜕らかの理由で非垞に高い堎合、memcachedを噛むこずができるよりも倚くのバッチを䜿甚するこずを意味し、この接続のコンテキストを頻繁に匷制的に切り替える必芁がありたす。 ここでは、「-R」キヌを䜿甚しおバッチのサむズを増やすか、バック゚ンド偎からそのようなバッチを䜿甚しないこずができたす。







たた、memcachedはメモリから最も叀いデヌタを消去するず述べたした。 だから、私は嘘を぀いた。 これは実際にはそうではありたせん。 Memcachedには、これらのアトムを砎棄するためにこのメモリを効果的に䜿甚するための独自のメモリマネヌゞャがありたす。 スラブ文字通り「スタブ」を持぀ように蚭蚈されおいたす。 これは、メモリの䞀郚に察しおメモリマネヌゞャをプログラミングする際に確立された甚語です。 倧きなメモリチャンクがあり、それがペヌゞに分割されおいたす。 memcached内のペヌゞはMBなので、耇数のMBのKey-Valueデヌタをそこに䜜成するこずはできたせん。 これは物理的な制限です-memcachedは耇数ペヌゞのデヌタを䜜成できたせん。 そしお、最終的には、すべおのペヌゞがチャンクに分割されたす。これは、96、120の写真に衚瀺されおいるものです-特定のサむズです。 ぀たり 96 MBのピヌスがあり、次に32から1 MBたでの1.25倍の120のピヌスがありたす。 . - , memcached ( + + + + , memcached ( 24-50 )), . head. - , memcached head. .., , , tail, .



, memcached . list recently used , .. - , — 96 120 120- .. memcached , .







slab'. memcached — , Telnet' , stats, Enter, «». stats slabs, stats items — , , stats slabs , , stat' — , memcached , stat items — , , . , , .







. , memcached — . ? - . , . availability, — , , -, , Round Robin', . - , , memcached, .



? . , - - , . , .



latency. 90% — round trip, .. memcached — , . , , .. . , memcached , . , , , memcached ? , , memcached — .



, , , , , — .







— consistent hashing ring. ぀たり ? , , int32, . だから — , - - . , . , , .. , , , , — , .



. , -, . , . — , — , , , . , , , — .



memcached consistancy - , .. availability, , - cas' - .





» cachelot@cachelot.io

» http://cachelot.io/



— HighLoad++ Junior .



たた、これらの資料の䞀郚は、高負荷システムHighLoadの開発に関するオンラむントレヌニングコヌスで䜿甚されたすガむドは、特別に遞択された文字、蚘事、資料、ビデオのチェヌンです。 私たちの教科曞にはすでに30以䞊のナニヌクな資料がありたす。 接続しおください



— " - ", , HighLoad++ Junior .



All Articles