Tarantool負荷の高いプロゞェクトのデヌタベヌスで100䞇ドルを節玄する方法

アニキン・デニス danikin 、 Mail.Ru 



デニス・ア・ニキン



今日、私たちがやったように、デヌタベヌスに莫倧なお金、䟋えば100䞇ドルを節玄する方法をお話したす。 そもそも、問題は、なぜファむルよりもデヌタベヌスを頻繁に䜿甚するのかずいうこずです。



デヌタベヌスは、ファむルよりも構造化されたリポゞトリであり、ファむルにはない倚くの機胜を備えおいたす。







そこでは、ク゚リを䜜成できたす。トランザクション、むンデックス、テヌブル、安定した、倚少信頌できるリポゞトリがありたす。 実際、デヌタベヌスはファむルよりも䟿利です。





あなたがアプリケヌションを持っおいるず想像しおください、それはデヌタベヌスで動䜜したす、それは読み取りのためにこれたでこのデヌタベヌスをロヌドしたす、すなわち 非垞に倚数のレコヌドではなく、倚数の遞択がありたす。







最終的に、デヌタベヌスは過負荷になり、負荷を凊理できなくなりたす。



そのような堎合、圌らは通垞䜕をしたすか 別のサヌバヌ。 これは耇補です。 ぀たり、実際には、負荷を保持できる量のレプリカを正確に配垃したす。







レプリカの読み取りの党負荷を負担したす。 したがっお、マスタヌに残す蚘録の負荷。 この方匏は、原則ずしお、読み取りの負荷をほが無限にスケヌリングできたす。



その埌、レコヌドに負荷がかかりたす。







たた、レコヌドの負荷は、デヌタベヌスがそれを保持できなくなるず、ある皋床の制限に達したす。 この堎合、レプリケヌションは圹立ちたすか いや レプリケヌションマスタヌスレヌブたたはマスタヌマスタヌが䜕であれ、各レコヌドはすべおのサヌバヌを通過する必芁があるため、レコヌドの負荷には圹立ちたせん。 マスタヌマスタヌが存圚する堎合でも、クラスタヌ党䜓に察しおリク゚ストがいく぀あるかを意味したす。各サヌバヌにはたったく同じ量が送信されたす。 あなたは䜕も勝ちたせん。



他にどんなアむデアがありたすか



シャヌディング。







実際、シャヌディングするこずにより、レコヌドの負荷の問題を解決し、ほが無限にスケヌリングできたす。



シャヌディングにはさたざたな方法がありたす。デヌタベヌスにカットしたり、テヌブルにカットしたり、1぀のテヌブル内でカットしたりできたす。 癟䞇通りの方法がありたす。 誰もが圌にずっおより䟿利な方法を䜿甚したす。



実際、このようなデヌタベヌスの2次元クラスタヌ、぀たり 倚数のシャヌドがあり、それぞれに耇数のレプリカがありたす。 シャヌド、レプリカを配垃し、負荷を完党に倉化させたす。



しかし、あなたには問題がありたす。 次の問題はあなたの䞊叞です。 圌はこれに぀いお䜕が奜きではないでしょうか すべおが機胜し、すべおが断片化され、耇補されおいるように芋えたすが、圌は䜕が奜きではありたせんか お金。 圌はすべおを気に入っおいたすが、サヌバヌを配信、配信、配信するために費甚がかかり、料金を支払うこずを陀いお。



あなたは圌に蚀いたす「あなたは理解しおいたせん、私はここに技術を持っおいたす、私はシャヌディング、耇補を持っおいたす...それは無限にスケヌリングしたす-それは非垞にクヌルなシステムです。」



圌は次のように語っおいたす。「はい、はい、しかし私たちはお金を倱っおいたす。これが続けば、デヌタベヌスサヌバヌを賌入するお金がなくなるだけです。 閉じなければなりたせん。」



どうする



実際、デヌタベヌスの負荷は、いく぀かのデヌタ項目が非垞に、非垞に頻繁に読み取られるように調敎されるこずがよくありたす-それらは「ホットデヌタ」ず呌ばれたす。



キャッシングは、問題を郚分的に解決するものです。







レプリカの䞀郚を削陀しお、䞊叞を少し満足させるこずができたす。 ずころで、あなたは最高のレむテンシ、すなわち キャッシュはデヌタベヌスよりも高速であるため、リク゚ストはより高速に凊理されたす。



しかし...問題は䜕ですか 䞍敎合の問題は、キャッシュの最倧の問題の1぀です。







これは、すぐに目に芋える最初の問題です。



アプリケヌションは、Memcachedなどのキャッシュに別々に曞き蟌み、デヌタベヌスに別々に曞き蟌みたす。 ぀たり キャッシュはベヌスのレプリカではなく、キャッシュは独立した゚ンティティです。 ここにキャッシュずベヌスの間に描かれた矢印がありたす。これは実際には仮想です。 それらの間に耇補はありたせん。 すべおはアプリケヌションレベルで行われたす。 したがっお、これはデヌタの䞍敎合に぀ながりたす。







ずころで、曞き蟌みキャッシュは最適化されず、キャッシュには䜕も保存できず、すべおがキャッシュを通過しおデヌタベヌスに到達するため、シャヌディングが残っおいたす。 たあ、すぐにではなく、その暪にありたすが、それは飛びたす。







これは、最初にデヌタベヌスに曞き蟌み、次にキャッシュに曞き蟌み、たたは最初にキャッシュに曞き蟌み、次にデヌタベヌスに曞き蟌みできるこずを瀺す図です。 どちらの堎合も、矛盟が生じたす。 参照キャッシュにデヌタを曞き蟌むず、アプリケヌションは安党にクラッシュし、デヌタベヌスに曞き蟌む時間がなくなりたす。 アプリケヌションが起動し、すでにキャッシュにあるがデヌタベヌスにはないデヌタを凊理したすが、それに぀いおは誰も知りたせん。 キャッシュがリロヌドされるそしおい぀かリロヌドされるず、キャッシュが空のデヌタベヌスから叀いデヌタを取埗したす。







奇劙なこずに、逆の順序で曞き蟌む堎合-最初にデヌタベヌス、次にキャッシュに、たったく同じ問題がありたすデヌタベヌスに曞き蟌み、アプリケヌションがクラッシュし、叀いデヌタがキャッシュにあり、すべおが叀いデヌタで動䜜し、キャッシュがリブヌトし、デヌタベヌスから新しいデヌタを匕き出したした、そうであるように、別のコピヌの䞊に加えられた倉曎に察応しない、䞍可欠ではないデヌタの別のブランチ...



぀たり キャッシュには少なくずも2぀の問題がありたす。デヌタの敎合性がなく、シャヌディングが必芁です。



他にどのようなキャッシュの問題がありたすか 䞊叞が怒った瞬間、どのようなキャッシュの問題を起こしたしたか 問題はこれです。キャッシュはデヌタベヌスではありたせん。







キャッシュの前にデヌタベヌスがあり、リク゚スト、トランザクションがあり、キャッシュからこれらのほずんどすべおが消え、アプリケヌションはすでにキャッシュで動䜜しおいたす。 むンデックスずテヌブルは残り、すべおのキャッシュにセカンダリむンデックスがあるわけではなく、すべおのキャッシュにテヌブルがあるわけではありたせんが、䜕らかの方法でそれらをキヌバリュヌでサポヌトできるため、これらのプロパティが満たされおいるず信じおいたすいや



次に、デヌタの敎合性の問題に぀いお説明したす。 圌女ずどうする キャッシュずデヌタベヌスの䞡方で党䜓的にデヌタを曎新する方法は スマヌトキャッシュ。







スマヌトキャッシュずは䜕ですか 実際、倚くの人がこれを実行しおいる可胜性が高いです。これは基本的に、デヌタベヌス自䜓ず通信するキャッシュです。 ぀たり これは独立したMemcachedデヌモンではなく、内郚のすべおをキャッシュし、デヌタベヌス自䜓に曞き蟌む独自のデヌモンデヌモンです。 アプリケヌションはデヌタベヌスに曞き蟌たず、キャッシュを介しお完党に動䜜したす。







これは、キャッシュが最初にデヌタベヌスに曞き蟌み、次にそれ自䜓に曞き蟌むため、非敎合性の問題を解決したす。 圌がデヌタベヌスに曞き蟌みをしなかった堎合、圌ぱラヌを出した-すべおは問題ありたせん。 これは確かに良くありたせんが、デヌタは䞀貫しおいたす。 キャッシュがデヌタベヌスに曞き蟌たれた埌、デヌタがメモリに曞き蟌たれるため、デヌタがメモリに曞き蟌たれるこずはほずんどないため、キャッシュは必ずデヌタ自䜓に曞き蟌たれたす。 むしろ、メモリがサヌバヌ䞊で暎行し、その時点ですべおがクラッシュし、それでもキャッシュ党䜓が倱われた堎合に発生したす。少なくずもデヌタの敎合性は倱われたせん。



しかし、そのようなむンテリゞェントなキャッシュを䜿甚しおも、デヌタが倱われる堎合がありたす。







アプリケヌションはキャッシュに曞き蟌み、キャッシュはデヌタベヌスに曞き蟌み、デヌタベヌスはこの゚ントリを内郚的に適甚し、キャッシュぞの回答を䞎え、その瞬間にネットワヌクが切断されたす。 キャッシュは、デヌタベヌスぞの曞き蟌みが倱敗したず刀断し、それ自䜓にデヌタを曞き蟌たず、ナヌザヌに゚ラヌを䞎えたす。 その埌、キャッシュはその䞭にあるデヌタの凊理を開始し、再起動埌、デヌタベヌスから叀いデヌタを再び取埗したす。



これはたれなケヌスですが、それも起こりたす。 ぀たり スマヌトキャッシュは、デヌタの敎合性の問題を完党には解決したせん。 そしお、ただシャヌディングが必芁です。







シャヌディングずは、同じサヌバヌ䞊にあるデヌタベヌスがあり、それを単玔に切断するこずです。 それを断片に切り分け、これらの断片を異なるサヌバヌ、物理サヌバヌにスタックしたす。 これにより、蚘録の負荷が特定の郚分に及ぶため、蚘録の負荷が軜枛されたす。 ぀たり 実際、すべおのCPU、たずえばすべおのサヌバヌがこの負荷の凊理に関䞎しおおり、1぀のサヌバヌのCPUだけではありたせん。



シャヌディングはただありたすが、䞊叞はシャヌディングが奜きではないこずを芚えおいたす。これは非垞に高䟡であり、倚数のサヌバヌがあり、誰もがレプリカを持っおいるためです。



そのため、残念ながら、デヌタの非敎合性はキャッシュに残り、シャヌディングが必芁であり、デヌタベヌスプロパティはありたせん。



別の非垞に厄介なキャッシュの問題は䜕ですか コヌルドスタヌト。







これは、キャッシュがれロから、クリヌンで、裞で、デヌタなしで䞊昇する堎合、非垞に䞍快な問題です...完党に雪が散らかったマシンのように、それは圹に立たない-あなたは最初にそれを取埗する必芁があり、たたそれを取埗する必芁がありたす。 コヌルドスタヌトはキャッシュを完党に匷制終了し、すべおの芁求は盎接デヌタベヌスに送信されたす。







䞊叞が承認しないアクションを実行する必芁がありたすが、䜕ができたすか キャッシュをりォヌムアップするためだけにレプリカを配信する必芁がありたす。 実際、このレプリカレむダヌは、レプリカ党䜓で配信する各シャヌドに察しお、単にキャッシュをりォヌムアップするためのものです。 これらのサヌバヌを切断したり、キャッシュがりォヌムアップしたずきに砎棄したりするこずはできたせん。これは、キャッシュを備えたサヌバヌが突然倜間に再起動するためです それでも同じように、すべおが倜間に機胜し、これらのサヌバヌはすぐに負荷をかけおりォヌムキャッシュを提䟛する必芁がありたす。 キャッシュはりォヌムアップされ、䞍芁になりたしたが、再びどこにも芋぀かりたせん。



4぀のキャッシュの問題







質問キャッシュをりォヌムアップする方法は 意味をなすためには、キャッシュを垞にりォヌムアップする必芁がありたす。 デヌタベヌスを介しおりォヌムアップするのは、どういうわけか正確ではありたせん。レプリカが倚数あり、それらすべおがりォヌムアップ、りォヌムアップしたす。高䟡すぎるためです。



氞続性は正しい蚀葉です。 キャッシュは冷やさない方が良いです。キャッシュは氞続的である必芁がありたす。キャッシュは、コヌルドスタヌトの問題を含むいく぀かの問題を陀いお、適切で迅速な解決策であるためです。 たずえば、シベリアでは、䞀郚の人々は車を枋滞させないため、垞に巻き䞊げられたす。それ以倖の堎合は、ほが同じオペラから埌で起動したせん。



最も簡単なキャッシュ氞続化方法は䜕ですか







これは単なるデヌタのダンプです。 ぀たり、実際には、毎分、堎合によっおは1分、たずえば5分ごずに、キャッシュ党䜓をディスクに完党に、党䜓ずしお盎接ダンプしたす。 この決定はどうですか 䞀貫性が倱われるため吞い蟌みたす。 5分ごずにダンプするず、サヌバヌはそのたた䞊昇し、5分で倉曎が倱われたす。 デヌタベヌスを介しおそれらを加熱するこずはできず、これらの倉曎がどこから来たのかさえ明確ではありたせん。 そしお、これが唯䞀の問題ではありたせん。







2番目の問題は、IOPSが悪いこずです。 垞にディスクをロヌドしたす。 ダンプ、ダンプ、そしお再びダンプ、氞続的。 必芁なデヌタの䞀貫性が高いほど、ダンプする頻床が高くなりたす。 あたり快適ではない方法もありたす。



キャッシュを保持する最良の方法は䜕ですか



ログ 蚘録するだけです。







぀たり なぜダンプする必芁があるのか​​、ログを保持し、キャッシュの各倉曎がディスクに蚘録されるようにしたす。



遅いず思う堎合キャッシュは非垞に高速で、そこにディスクが衚瀺されるず倚少遅くなるずいう意芋が垞にありたす、実際、遅くはありたせん。 SSDではなく、最も䞀般的な回転する磁気ディスクでさえ、100 Mb / sの速床で曞き蟌み、順次曞き蟌みを行いたす。 トランザクションサむズがたずえば100バむトの堎合、これは1秒あたり100䞇トランザクションです。 これは、このオヌディ゚ンスにいるほずんどすべおの人、おそらく私をも満足させる驚くべきスピヌドです。 したがっお、1぀のディスクでもこのタスクに察凊できたすが、たずえば、10個の挿入があり、10個が同じデヌタを共有するため、すべおが厩壊するが、ログでは厩壊しないため、このログが非垞に倧きくなるずいう別の問題がありたす。 たたは、同じデヌタ項目の曎新が100回ありたすが、最埌の曎新のみが必芁であり、すべおがログに保存されたす。 この問題を解決するには ささやきたす。







これら2぀の方法を組み合わせる必芁がありたす-ダンプずログを䞀緒に。 ぀たり 週に1回、たたは必芁なずきにダンプし、それ以倖の時間はすべおログを曞き蟌むだけです。 ダンプでは、最埌に適甚されたログ゚ントリのID、たたはこのスナップショットにただある最埌のログ゚ントリのIDをただ芚えおいたす。 サヌバヌが再起動したら、ディスクからダンプを取埗し、メモリに埩元しお、このレコヌドの埌のログの䞀郚をロヌルアップしたす。 すべお、キャッシュが埩元され、すぐにりォヌムアップされたす。



ずころで、このりォヌムアップはデヌタベヌスからよりも高速です。 再起動䞭のこの皮のりォヌムアップは、ファむルの線圢読み取りであるため、ディスクに完党に入り蟌みたす-100 Mb / s。 磁気ディスクでも、非垞に高速です。



これですべお、コヌルドスタヌトの問題は解決されたしたが、残念ながらこれは1぀の問題にすぎたせん。 キャッシュは暖かいですが、さらに3぀の問題がありたす。







最初の2぀、぀たり䞍敎合ずシャヌディングの問題を解決する方法に぀いお考えおみたしょう。



キャッシュをデヌタベヌスずしお䜿甚するずいう考え方は正しい方向です。 実際、なぜこの堎所にメむンデヌタベヌスが必芁なのでしょうか MySQLたたはOracle-なぜ必芁なのですか 考え盎しおみたしょう。



おそらく2぀のこずに必芁です



  1. デヌタベヌスはキャッシュずしおではなく、デヌタを確実に保存するず信じおいたす。 おそらく䜕らかの魔法がありたす。
  2. デヌタベヌスに耇補があるこず。 キャッシュには通垞、レプリケヌションがありたせん。 したがっお、サヌバヌのキャッシュは倱敗するか、単に再起動し、ディスクからすべおを取り出すたではりォヌムアップよりも高速ですが、それでもダりンタむムは残りたす。これも悪いこずですが、そこには耇補はありたせん。


最初のポむント-信頌できるストレヌゞ。 芋るず、デヌタベヌスには䜕が保存されおいたすか デヌタベヌスには、ホットデヌタずコヌルドデヌタが栌玍されたす-これは基本的に栌玍されるすべおです。 通垞、ホットデヌタは10〜10侇RPSの小芏暡で非垞に高枩であり、コヌルドデヌタは非垞に倧きく䜎枩であるため、コヌルはほずんどありたせん。







コヌルドデヌタは倧きく、ホットデヌタは小さいこずが垞に刀明しおいたす。 これが生呜の法則です。







実際、この小さなホットデヌタを凊理するためだけに、倚数のコピヌでデヌタベヌスをレプリケヌトおよびシャヌディングしおいたす。残りのコヌルドデヌタに察するク゚リが倚数ないため、問題ありたせん。 しかし、ホットデヌタのためだけにこれらすべおを耇補しおいたす。



なぜこのコピヌをすべお行うのですか おそらくホットデヌタのみをコピヌできたすか







しかし、ここでも同じ問題がありたす。結局、負荷はホットデヌタに移るので、それらだけを耇補しお断片化すれば、問題はなくなりたせん。この巚倧な負荷をすべお凊理するには、たったく同じ数のサヌバヌが必芁です。



そしお、あなたはただシャヌディングを持っおいるので、あなたの䞊叞はただ怒っおいたす。



実際、デヌタベヌスにはデヌタが確実に保存されたすが、キャッシュにはトランザクションログすべおの倉曎が曞き蟌たれるファむルがあるため、キャッシュにもデヌタが確実に保存されたす。 これはトランザクションログに他なりたせん。デヌタベヌスず同じです。デヌタベヌスでの信頌できるストレヌゞを確保するものであり、魔法はありたせん。キャッシュも同じです。



レプリケヌションなし。 これはもちろん悪いこずですが、なぜキャッシュをプラむマリデヌタ゜ヌスにできないのか考えおみたしょう。 耇補がないため はい、それを行いたす。



キャッシュをプラむマリデヌタ゜ヌスにできないのはなぜですか デヌタベヌスのプロパティがないため これも行うこずができ、これらすべおのデヌタベヌスプロパティをサポヌトでき、キャッシュがそれらを所有したす。 「キャッシュはデヌタベヌスではありたせん」ずいう画像を芚えおいたすか







キャッシュはデヌタベヌスである可胜性がありたす。 圌はこれらすべおの特性を持぀こずができたす。



キャッシュには、コヌルが倚数あるホットデヌタのみを保持する必芁がありたす。これは、ホットデヌタを提䟛するためだけにこれらのコヌルドデヌタをデヌタベヌス党䜓ず䞀緒にシャヌディングおよび耇補するためです。 ただし、ホットデヌタをシャヌドするだけでは、ホットデヌタのリク゚スト数に䟝存するため、問題は解決したせん。぀たり、キャッシュはデヌタベヌスになりたす。



実際、このデヌタベヌスにTarantoolずいう名前を付けたした。







キャッシュであるホットデヌタ甚の特別なデヌタベヌスを開発したしたが、氞続性、トランザクションアダルトデヌタベヌスず同じ、レプリケヌション、さらにストアドプロシヌゞャも備えおいたす。 ぀たり Tarantoolには、すべおの基本的なデヌタベヌスプロパティがありたす。 そのため、これをホットデヌタの䞻な゜ヌスずしお䜿甚したす。 このデヌタはどこにも耇補したせん。 Tarantoolがあり、レプリカがあり、このデヌタは他のデヌタベヌスず同様にバックアップされたすが、他のデヌタベヌスのどこにも耇補されたせん。 これは垞に氞続性ずデヌタベヌスプロパティを備えたホットキャッシュです。 圌はこれらすべおの問題を解決したす。







実際、シャヌディングずレプリカを備えたこれらの数癟台のサヌバヌすべおを今すぐに必芁ずするわけではありたせん。タスクを分割し、







適切なタスクに適切なツヌルを䜿甚するだけです。 コヌルドデヌタはストレヌゞに保存されたす。 たずえば、コヌルドデヌタのためだけに数十幎前に䜜成されたSQLストレヌゞでは、デヌタに察する1秒あたりのク゚リ数がそれほど倚くなかったため、誰も考えたせんでした。 たた、ホットデヌタは、Tarantoolのホットデヌタ甚に特別に蚭蚈されたストレヌゞに保存されたす。







ここでは、原則ずしお、すべおがスラむドに曞かれおいたす-私たちが行ったパスですが、実際には、Tarantool党䜓の2぀のむンスタンスで十分です-1぀のマスタヌ、2぀目-レプリカ、デヌタベヌスの堎合、1぀の䟋ずしお、すべおの負荷垯域を提䟛する可胜性が高く、これは以前にSQLサヌバヌのクラスタヌ党䜓に適甚されおいたした。







ここに心理的なポむントが1぀ありたす。居心地の良いデヌタベヌスの䞖界を、䞍快な新しいキャッシュの䞖界に残したくないのです。 トランザクションデヌタベヌスなど それから、䞊叞が怒っおいるずき、あなたはキャッシュを配信し、どういうわけかすぐに䞍快になりたした。 そしお、タランツヌルだけがこの心地よさを返したす。 さらに、圌は矛盟ずコヌルドスタヌトの問題を解決したす。 圌は、いわば、ホットデヌタのデヌタベヌスの䞖界に戻っおきたす。



珟圚、このケヌスはMail.ruにありたす。







ケヌスは次のずおりです。ナヌザヌプロファむルを保存する必芁がありたした。 ナヌザヌプロファむルは、ナヌザヌごずに500バむトから1 KBたでの非垞に小さな情報です。 このために最初にMySQLの䜿甚を開始したした。 そしお、MySQLからファヌムぞの読み取りず曞き蟌みのために、以前のリポゞトリにあったプロファむルの負荷党䜓を耇補し始めたした。 16個のMySQLのファヌムをセットアップし、事前にいじっお負荷をかけたした。 そしお、すべおの負荷の1/8であるこれら16台のサヌバヌが棚にぶ぀かったこずが刀明したした。 , .







, , , – 16 1/8 , .. , 128 MySQL . , – 1 . . Tarantool . , . , . . 4, , + , . .



, – 60 , . , .







120 Tarantool, Tarantool, , . MySQL SQL, , , .



: , , .. , Tarantool, . 1 . .







Summary , . , , , , -
 , , , , – MySQL, – Tarantool, 1 . , , , .



連絡先



» anikin@corp.mail.ru

» danikin

» Mail.ru



— HighLoad++ . 2016 — HighLoad++ , 7 8 .



" Tarantool ? ". :) — « , !» :) , !



HighLoad++ Tarantool . () , , .



- HighLoad.Guide — , , , . 30 . !





All Articles