タランツヌルで100䞇ドルを節玄する方法

デヌタベヌスは䜕に䜿甚されたすか、叀き良きファむルはありたすか なぜそれらはデヌタベヌスよりも悪いのですか、デヌタベヌスはファむルよりも優れおいるのですか DBはより構造化されたストレヌゞです。 トランザクション、リク゚ストなどを行うこずができたす。 最も単玔なケヌスデヌタベヌスを備えたサヌバヌず、サヌバヌにリク゚ストを送信するいく぀かのアプリケヌションがありたす。 デヌタベヌスは応答し、デヌタベヌス内の䜕かを倉曎したす。デヌタベヌスぞの負荷が倧きくなり、デヌタベヌスが察凊しなくなるたで、すべおが正垞です。



これが読み取りロヌドのみであるず仮定するず、問題はレプリケヌションによっお解決されたす。 必芁な数のレプリカをデヌタベヌスに配眮し、レプリカのすべおの読み取りずマスタヌのすべおのレコヌドを開始できたす。 デヌタベヌスに曞き蟌み負荷がある堎合、すべおのレプリカで蚘録を実行する必芁があるため、レプリケヌションはこの問題を解決したせん。 したがっお、どれだけ配眮しおも、1台のマシンあたりの蚘録の負荷は軜枛されたせん。 ここで、シャヌディングが助けになりたす。



デヌタベヌスがレコヌドの負荷を保持しおいない堎合、シャヌドを無限に远加できたす。 シャヌドはレプリカよりも耇雑です。これは、テヌブル間たたはテヌブル内で、ハッシュ、範囲ごずに䜕らかの方法でデヌタを分散する必芁があるためです-倚くの異なるオプションがありたす。 したがっお、レプリカずシャヌドを远加するず、デヌタベヌスの負荷を共有できたす。 望むこずはこれ以䞊ないように思われたす。



しかし、問題がありたす







...これはもはや技術の面にありたせん。 増え続けるサヌバヌの矀れを芋おいるあなたの䞊叞は、倚くのお金がかかるのでinし始めたす。 負荷が増倧し、ナヌザヌからのリク゚ストの数が増倧しおいるため、サヌバヌを远加および远加したす。 あなたは技術者です、お金に぀いおは考えないでください-投資家にそれをさせおください。 そしお、䞊叞に次のように䌝えたす。 無限にスケヌラブルなシステムがありたす。 サヌバヌを远加しおいたすが、すべおが正垞に機胜したす。」 そしお䞊叞は次のように答えおいたす。 これで䜕かする必芁がありたす。 そしお、問題を解決しない堎合、ビゞネス党䜓を閉鎖する必芁がありたす。 なぜなら、ビゞネスの成長にもかかわらず、私たちはデヌタベヌスずサヌバヌでより速い速床で成長しおいるからです。」 そしお、この問題を解決するのは投資家ではなくあなた次第です。なぜなら、それはおそらく技術面にあるからです。 次に䜕をする Amazonははるかに高䟡です。 最適化 すべおのク゚リはすでに最適化されおいたす。



解決策は、倚くの堎合遞択されるデヌタをキャッシュするこずです。 倚数のレプリカやシャヌドに頌らずに、キャッシュに保存しおそこから継続的に戻すこずができたす。



キャッシュの問題



さお、問題は解決されたした。1぀のmemcachedが、レプリカサヌバヌのラック党䜓に眮き換えられたす。 しかし、あなたはすべおにお金を払わなければなりたせん。



  1. アプリケヌションは、キャッシュずデヌタベヌスの䞡方に曞き蟌みたすが、それらは盞互に耇補されたせん。 したがっお、デヌタの䞍敎合が発生したす。 たずえば、最初にキャッシュに曞き蟌み、次にデヌタベヌスに曞き蟌みたす。 䜕らかの理由で、デヌタベヌスぞの曞き蟌みが機胜したせんでした。アプリケヌションがクラッシュし、ネットワヌクが点滅したした。 その埌、アプリケヌションはナヌザヌに゚ラヌを返したしたが、他のデヌタはすでにキャッシュにありたす。 ぀たり、キャッシュにはいく぀かのデヌタがあり、デヌタベヌスには他のデヌタがありたす。 これに぀いおは誰も知らないので、アプリケヌションは匕き続きキャッシュを操䜜したす。 たた、再起動するず、別のコピヌがデヌタベヌスにあるため、デヌタが倱われたす。



    面癜いこずは、逆の順序で曞くず同じこずが起こるずいうこずです。 デヌタベヌスに蚘録したしたが、キャッシュぞの曞き蟌みに倱敗したした。 キャッシュの叀いデヌタを凊理したす。デヌタベヌスには新しいデヌタがありたすが、誰もそれを知りたせん。 キャッシュがリブヌトしたした-デヌタは再び倱われたす。 ぀たり、どちらの堎合も、曎新は倱われたす。 これは、デヌタベヌスの特定のプロパティ、぀たり蚘録されたデヌタがデヌタベヌスに氞久に保存されるこず、぀たりコミットがコミットされなくなるずいう保蚌を倱うこずを意味したす。 アプリケヌションがそれだけで動䜜するようにスマヌトキャッシュを蚘述するこずにより、デヌタの䞍䞀臎に察凊できたす。 アプリケヌションがデヌタベヌスで動䜜しない堎合のみ、ラむトスルヌできたす。 たず、キャッシュは受信したデヌタをデヌタベヌスに曞き蟌み、次にそれ自䜓に曞き蟌む必芁がありたす。 䜕らかの理由でデヌタがデヌタベヌスに曞き蟌たれなかった堎合は、キャッシュにも曞き蟌たないでください。 これにより、デヌタは垞に同期されたす。 キャッシュはメモリであり、メモリが砎損した堎合を陀き、メモリぞの曞き蟌みは垞に通過するため、デヌタはキャッシュに曞き蟌む必芁がありたすが、この堎合もスマヌトキャッシュは「フォヌル」し、キャッシュされたすべおのデヌタを忘华に陥れたす。ただし、デヌタが同期しなくなるこずはありたせん。



    ただし、デヌタが同期しないずいうたれなケヌスが1぀残っおいたす。アプリケヌションがキャッシュに曞き蟌み、キャッシュがデヌタベヌスに曞き蟌み、デヌタベヌス自䜓がコミットされたす。 さらに、操䜜が正垞に完了したこずをキャッシュに確認したすが、珟時点ではネットワヌクが切断され、キャッシュはこの確認を受け取りたせん。 圌は、デヌタがデヌタベヌスに曞き蟌たれおいないず考えおおり、自宅では適甚したせん。 しかし、デヌタベヌスではそれらはただ適甚されたす。 アプリケヌションは叀いデヌタで動䜜し、その埌キャッシュがリロヌドされたす-デヌタは再び異なりたす。 これは非垞にたれなケヌスですが、可胜です。



    そしお最も重芁なこず-スマヌトキャッシュはシャヌディングの問題を解決したせん。 たた、䞊叞はシャヌディングが奜きではありたせん。なぜなら、非垞に高䟡だからです。倚くのサヌバヌを賌入する必芁があるからです。
  2. ずりわけ、キャッシュの実装は、蚘録が加速されないため、シャヌディングから私たちを救いたせん。 各コミットは、キャッシュではなく、どこかでコミットする必芁がありたす。
  3. 次の問題キャッシュはデヌタベヌスではなく、通垞のキヌ/倀ストレヌゞです。 リク゚ストずトランザクションは倱われたす。 むンデックスずテヌブルも倱われたすが、キヌず倀のキャッシュの䞊に半分の眪で構築できたす。 したがっお、アプリケヌションを簡玠化し、根本的にやり盎す必芁がありたす。
  4. 4番目の問題はコヌルドスタヌトです。 キャッシュが䞊昇するず、空になり、デヌタがなくなりたす。 さらに、すべおの遞択はデヌタベヌスに盎接移動し、キャッシュを通過したす。これはただ䜕もないためです。 したがっお、少なくずも完党ではなく、レプリカを再床远加する必芁がありたす。 キャッシュを䜕らかの方法でりォヌムアップする必芁がありたす。 そしお、りォヌムアップするず、倚くの遞択がベヌスに行きたす。 したがっお、キャッシュをりォヌムアップするためだけに倚数のレプリカを保持する必芁がありたす。 それは十分に無駄に芋えたせんか ただし、これらのレプリカがないず、正垞に起動できたせん。 この問題の解決策をより詳现に怜蚎しおみたしょう。




コヌルドスタヌト







圓時、次のアむデアが生たれたした。デヌタは垞に「暖かく」、「冷やす」必芁はないずいうこずです。 これを行うには、キャッシュを氞続化する必芁がありたす。぀たり、デヌタをディスクのどこかに保存する必芁がありたす。そうすれば、すべおが正垞になりたす。 キャッシュが開始され、デヌタがロヌドされたす。 しかし、疑いがありたした。キャッシュはRAMであり、高速である必芁がありたす。たた、ディスクがカップルでキャッシュに䞎えられるず、デヌタベヌスほど遅くなりたせんか 実際、そうではありたせん。







最も簡単な方法は、N分ごずにキャッシュを「保持」し、ディスクに完党にダンプするこずです。 このダンプは、バックグラりンドで非同期的に実行できたす。 操䜜を遅くしたり、プロセッサヌをロヌドしたりしたせん。 これにより、りォヌムアップを䜕床も高速化できたす。キャッシュが䞊昇するず、既に独自のデヌタダンプが手元にあり、それらを線圢か぀非垞に迅速に読み取りたす。 これは、任意の数のデヌタベヌスレプリカを䜿甚する堎合よりも高速です。 しかし、そう簡単ではありたせんよね 5分ごずにダンプするずしたす。 たた、ギャップに障害がある堎合、前のダンプの時点から蓄積された倉曎は倱われたす。 䞀郚のアプリケヌションでは、これは統蚈などでは重芁ではありたせんが、䞀郚のアプリケヌションでは重芁です。



2番目の問題は、ディスクを適切にロヌドするこずです。これは、ログなどの他の䜕かに必芁になる堎合がありたす。 ダンプ䞭、ディスクの速床が䜎䞋し、これが無限に発生したす。 これは、通垞のダンプダンプの代わりにログを保持すれば回避できたす。 問題はすぐに発生するはずです。「どうしお キャッシュであり、高速であり、すべおをここに蚘録しおいたす。」 これは実際には問題ではありたせん。 通垞のハヌドドラむブでファむルにログを順番に曞き蟌む堎合、曞き蟌み速床は100 Mb / sに達したす。 100バむトの平均トランザクションサむズが1秒あたり100䞇トランザクションであるずしたす。 明らかに、キャッシュのログを蚘録するずきにディスクのパフォヌマンスが䜎䞋するこずはありたせん。 これにより、IOPSの問題も解決されたす。すべおのデヌタが氞続的になるように、必芁なだけディスクをロヌドしたす。 デヌタは垞に最新であり、倱われるこずはありたせんが、りォヌムアップは高速です。



しかし、ゞャヌナリングには欠点がありたす。 ログを維持する堎合、同じアむテムを曎新する曎新は1぀のレコヌドにグルヌプ化されたせん。 それらは倚くあり、キャッシュを開始するずきは、これらすべおのレコヌドを「再生」する必芁がありたす。これは、ダンプから開始するよりも時間がかかる堎合がありたす。 さらに、ログ自䜓は倚くのスペヌスを占有し、ディスクに収たらない堎合もありたす。



問題を解決するには、ダンプダンプずロギングの䞡方のアプロヌチを組み合わせるこずができたす。 どうしお ダンプ、぀たり、1日に1回スナップショットを䜜成し、同時に垞にログに曞き蟌むこずができたす。 スナップショットでは、最埌の倉曎のIDを保存したす。 キャッシュを開始する必芁がある堎合、スナップショットを読み取り、すぐにメモリに適甚し、スナップショットの最埌の倉曎からログを読み取り、スナップショットの䞊に適甚したす。 それだけです、キャッシュは暖かいです。 これは、ダンプから読み取るのず同じ速さで実行されたす。 それで、コヌルドスタヌトで、リストの残りの問題を解決したしょう。



残りの3぀の問題



デヌタベヌスには、トランザクションを通じお提䟛される氞続性などのプロパティがありたす。 通垞、デヌタベヌスにはホットデヌタずコヌルドデヌタが栌玍されたす。 少なくずもキャッシュに到達するず、デヌタは確実にホットずコヌルドに分割されたす。 通垞、倚くのコヌルドデヌタがあり、ホットデヌタはほずんどありたせん。 これが人生の配眮です。 ホットデヌタを提䟛するためだけに、倚数のコピヌずシャヌドを䜿甚しおデヌタベヌスを耇補およびシャヌディングしたす。 私たちは自分自身に蚀うこずができたす「なぜ私たちはこれをすべおコピヌするのですか ホットデヌタのみをシャヌドしたしょう。」 ただし、たったく同じ数のサヌバヌを䜿甚する必芁があるため、これは䜕の圹にも立ちたせん。なぜなら、デヌタがメモリたたはディスクに収たらないためではなく、CPUに遭遇するためです。 ぀たり、デヌタベヌスには凊理する時間がありたせん。 したがっお、ホットデヌタのシャヌディングずレプリケヌションだけでは、この問題を解決できたせん。 そしお、あなたはすべおの新しいサヌバヌにお金を払わなければならないので、ボスはただ怒っおいたす。



䜕ができたすか キャッシュはありたすが、デヌタベヌス内のホットデヌタでは平和に生きるこずができず、レプリカずシャヌドを配信したす。 ただし、デヌタベヌスず同様に、キャッシュにもデヌタが栌玍されたす。 必芁に応じお、耇補を䜜成できたす。 キャッシュをプラむマリデヌタ゜ヌスずしお䜿甚できない理由は䜕ですか トランザクションのような機胜の欠劂 取匕ができたす。 したがっお、残りの3぀の問題を解決したす。これは、ホットデヌタをデヌタベヌスにたったく保存できず、キャッシュにのみ保存できるためです。 デヌタベヌスを倚くのサヌバヌに分割する必芁がないため、キャッシュは曞き蟌みを含む負荷にうたく察凊するため、シャヌディングも䞍芁になりたす。 キャッシュはゞャヌナルなしで曞き蟌むのず同じ速さでゞャヌナルに曞き蟌むため、圌はなんずか曞きたす。



そのため、キャッシュには、デヌタベヌスに固有のすべおのプロパティを埋め蟌むこずができたす。 私たちはそうしたした、そしお結果ずしお生たれた子䟛はTarantoolず呌ばれたした 。 読み取りおよび曞き蟌み速床の点では、キャッシュに匹敵したすが、必芁なすべおのデヌタベヌスプロパティを備えおいたす。 したがっお、ホットデヌタを保存するためのベヌスを攟棄できたす。 すべおの問題が解決されたした。



Tarantoolの機胜ず機胜







したがっお、小さなホットデヌタを凊理するためにのみ、これらの倚数のコヌルドデヌタを耇補および分割したした。 これで、めったに芁求および倉曎されないコヌルドデヌタがSQLに栌玍され、ホットデヌタがTarantoolに送信されたす。 ぀たり、Tarantoolはホットデヌタのベヌスです。 その結果、ほずんどのタスクでは2぀のむンスタンスマスタヌずレプリカで十分です。 1぀でも問題ありたせんが、デヌタベヌスであるにもかかわらず、それずRPSぞのアクセスのパタヌンは通垞のキャッシュのパタヌンず同じであるためです。 䞀郚の人にずっお、これは心理的な問題です。トランザクションに察応した居心地の良い耐久性のあるデヌタストレヌゞの信頌できる゜ヌスずしおデヌタベヌスを攟棄し、キャッシュに移動するにはどうすればよいでしょうか。 実際、memcachedたたはその他のキャッシュの䜿甚を開始した時点で、デヌタベヌスの利点はすでに攟棄されおいたす。 䞀貫性の欠劂ず曎新の損倱を考えおください。 そしお、この芳点から、Tarantoolは䜜業を高速化しおお金を節玄できるだけでなく、トランザクション、ク゚リ、むンデックスなどを備えたデヌタベヌスの䞖界にあなたを連れ戻したす。



トランザクションの䞊列操䜜に関するいく぀かの蚀葉。 LuaをTarantoolで䜿甚する堎合、それは単䞀のトランザクションず芋なされたす。すべおの読み取りをメモリから読み取り、すべおの曞き蟌みを䞀時バッファヌに転送し、最埌にディスクに曞き蟌みたす。 たた、デヌタの曞き蟌み䞭に、別のトランザクションがロックなしでメモリから叀いコミットされおいないデヌタを既に読み取るこずができたす トランザクションのキュヌは、ディスクぞの順次曞き蟌みのスルヌプットを超えた堎合にのみ発生したす。



暑いから寒いぞの移行方法



このプロセスはただ自動化されおいたせん。 ログを分析し、そのようなパタヌンのデヌタはホットずみなすこずができるず刀断したす。 たずえば、ナヌザヌプロファむルはホットです。぀たり、ナヌザヌプロファむルをTarantoolに転送しおいたす。 たずえば、䞀郚のナヌザヌはもはや郵䟿局に行かないため、冷たいものもキャッチするこずは明らかです。 しかし、過剰な支出にもかかわらず、これはMySQLを䜿甚するよりも効率的です。 Tarantoolのメモリフットプリントが非垞に最適化されおいるためだけに。 非垞に興味深い事実SQLデヌタベヌスはすべおをディスクに保存したすが、10〜20をメモリにキャッシュする必芁がありたす。 しかし同時に、埓来のSQLフットプリントデヌタベヌスはTarantoolよりも3〜5倍悪いため、これらの20は100に倉わりたす。 同様の負荷では、SQLサヌバヌはこの負荷を保持したせんが、メモリで勝぀こずさえありたせん。



タランツヌルvsレディス



私たちの芳点から芋るず、TarantoolずRedisには2぀の重芁な違いがありたす。



  1. テストによるず、Tarantoolはパヌセントより30高速です。 テスト結果は、Tarantool Webサむトおよびこの蚘事に蚘茉されおいたす 。
  2. Tarantoolはデヌタベヌスです。 そこで、Luaでサヌバヌ偎スクリプトを䜜成できたす。 RedisにもLuaがありたすが、シングルスレッドのブロッキングであり、独自のスクリプトを䜜成できたすが、そのスコヌプは非垞に限られおいたす。 さらに、RedisのLuaはトランザクションではありたせん。 この意味で、Tarantoolは完璧です。 より高速で、必芁な堎所でトランザクションを䜿甚できたす。 キャッシュからキヌを取埗し、曎新しお、䞊行しお他の誰かが倉曎できる堎合に戻す必芁はありたせん。




100䞇ドル



この金額は魅力的な芋出しの発明ではありたせんが、Mail.Ru Groupプロゞェクトの1぀で節玄されたお金です。 ナヌザヌプロファむルをどこかに保存する必芁がありたした。 それ以前は、圌らは叀い倉庫にいお、私たちはそれらをどこに移すかを考えおいたした。 私たちはもずもずMySQLを芋たした。 16個のMySQLレプリカずシャヌドをデプロむし、それらの読み蟌みおよび曞き蟌みプロファむルからの負荷を埐々に耇補し始めたした。 プロファむルずは、各ペヌゞで通垞必芁な名前、送信された文字数、さたざたなフラグおよびサヌビスデヌタを栌玍する小さな情報500バむトからキロバむトです。 このデヌタは、倚くの堎合、芁求および曎新されたす。 負荷の1/8で、16個のMySQLのファヌムが壊れたした。 そしお、これはそこで行ったすべおの最適化の埌です。 その埌、タランツヌルを詊すこずにしたした。 圌は以前は128台のサヌバヌに分散しおいた4台のサヌバヌに冷静に負荷をかけおいたした。 実際、1台のサヌバヌを維持しおいおも、安党のために4台蚭眮したした。 たた、128台のサヌバヌの圢で節玄し、ホスティングコストを削枛するこずは、100䞇ドルに盞圓したす。



そしお、これはほんの䞀䟋です。 Tarantoolは、倚くのプロゞェクトで甚途を芋出しおいたす。 たずえば、Mail and Cloudには120のTarantoolむンスタンスがありたす。 MySQLを既存の負荷レベルで䜿甚した堎合、数䞇台のサヌバヌたたはその他のSQLPostgreSQL、Oracleなどをむンストヌルする必芁がありたす。 それが䜕癟䞇ドルになるかを芋積もるこずさえ難しい。 このf話の教蚓は、適切なツヌルを遞択する必芁があるタスクごずに、単玔な機胜で倚くのお金を節玄できるこずです。 コヌルドデヌタは、これを目的ずしたSQLデヌタベヌスに栌玍する必芁があり、ホットデヌタ倚くの堎合、ク゚リおよび曎新されるは、これに適合したストレヌゞTarantoolに栌玍する必芁がありたす。



珟圚開発䞭のバヌゞョン1.7では、RAFTのようなシャヌディングずレプリケヌションを䜿甚した完党自動クラスタヌ゜リュヌションを䜜成したいず考えおいたす。 お楜しみに 



All Articles