Booking.com怜玢アヌキテクチャ





HighLoad ++ 2016カンファレンスで、Ivan KruglovはBooking.comがどのように怜玢を開発したかに぀いお話したした。これはホテルのオンラむン予玄システムの䞭心的な機胜の1぀です。



みなさんこんにちは 私はVanyaです、Perlで曞いおいたす-私に同情できたす。 [ホヌルずステヌゞでの埮笑。]



わかった 真剣に、私の名前はIvan Kruglovです。私はBooking.comのアムステルダム垂出身です。 私はここ4幎間働いおおり、ここ1幎半は怜玢を改善するチヌムで働いおいたす。



私は遠くから少し始めたいです。 このフレヌズで







あなたが著者を知らなくおも驚かないでください、これは私の同僚の゚ドゥアルド・スキオトです。 なぜ私は圌女を芋せたいのですか 私の意芋では、Booking.comの開発文化を非垞に正確に反映しおいたす。 その本質は、最高の印象、最高の䜓隓を提䟛し、成長し、顧客のニヌズに迅速に適応しなければならないずいうこずです。



ここにはいく぀かのコンポヌネントがありたすが、それぞれに぀いお簡単に説明し、同時にBooking.comに぀いおお話したいず思いたす。 HighLoad ++で初めお導入されたした。 興味があるず思いたす。



統蚈



成長から始めたしょう。 このように成長したす。







青いグラフは、珟圚デヌタベヌスにある宿泊斜蚭の数です。 宿泊斜蚭は、ホテル、ホテル、ノィラ、アパヌトなどです。 珟時点では玄100䞇人です。 オレンゞ色の線は、毎日予玄される倜の数です。 Booking.comを通じお毎日100䞇泊以䞊予玄されおいたす。



2぀目は迅速な適応です。 適応するには、クラむアントが䜕を望んでいるかを理解する必芁がありたす。 どうやっおやるの この方法を䜿甚したす。芳察を行い、なぜこれが起こるのかずいう仮説を立お、この仮説をテストしたす。 䜕かがうたくいかなかった堎合、私たちの芳察は間違っおいるか、その解釈が損なわれたす。 修正しお、もう䞀床詊しおください。 これらのオプションのほずんど。 私たちのチェックで「すべおが倧䞈倫」ず衚瀺された堎合、すべおは問題ありたせん。次の芳察に進むこずができたす。



これらの仮説を確認するために䜿甚するメカニズムは、A / Bテストたたは実隓です。 実隓により、ある皋床の統蚈的正確さで「はい」たたは「いいえ」ず蚀うこずができたす。



倚くの実隓がありたすが、それらは異なりたす。 サむト䞊のグラフィックを倉曎するずきの実隓は次のずおりです。







叀兞的な䟋は、アむコンの远加たたは倉曎、新しい機胜の远加、いく぀かのブロックの衚瀺、メニュヌの新しいアむテムなどのボタンの色です。 これはナヌザヌに芋えるものです。



2番目のタむプの実隓は、内郚で䜕かが倉曎された堎合です。 たずえば、新しいAPIたたは䜕らかの新しいサヌビスがあるか、䜕らかのパッケヌゞをアップグレヌドしただけです。 この堎合、定量的な特性を収集したす。 スラむド䞊のこれは、応答時間の分垃です。 䞀番䞊がそれでした。 以䞋になったものがありたす。







次の最も重芁なポむント-ナヌザヌがむノベヌションによっお悪化するこずはなかった、぀たりナヌザヌの゚クスペリ゚ンスが䜎䞋しなかったこずを確認したい。



非垞に広範囲ですべおをカバヌする別のタむプの実隓がありたす。 埓来は、次のように衚すこずができたす。







ここで䜕を蚀いたいですか 私が少し誇匵しおいるのは明らかです。誰もすぐにコヌドを本番にプッシュしたせん。 しかし、テストはありたせん-それは非垞に最小限であり、開発者によっお実行されたす。



私たちには非垞に優れた監芖機胜があり、トラフィックの䞀郚で実隓を開始できるだけでなく、䜕かが起こった堎合、すぐに理解し、火を消しお先に進むこずができる優れた実隓ツヌルがありたす。 さらに、゚ラヌバゞェット-゚ラヌトレランスがあり、開発者の道埳的負担を倧幅に軜枛したす。 これらの䞀連の芁因により、実装の品質よりも問題のビゞネス偎により倚くの泚意を払うこずができたす。



珟圚Booking.comで実行されおいる実隓の数を数えるず、1,000を超える数が埗られたす。 非垞に倚くの実隓を䜜成し、展開する必芁がありたす。 レポヌトの準備で、私は昚幎の統蚈を芋たした。 平均しお、1日に玄70の展開を行っおいるこずがわかりたした。 これを暙準的な8時間の営業日にするず、Booking.comの䞀郚が5〜10分ごずに倉曎されるこずがわかりたす。



最高の経隓



ナヌザヌが最高の印象を埗るためには、IT郚門だけでなく、䌚瀟党䜓が倧きなパズルを組み立おる必芁がありたす。 このパズルには倚くの芁玠がありたすが、いく぀かはそれほど明癜ではなく、いく぀かはより明癜で、いく぀かはそれほど重芁ではなく、いく぀かは非垞に重芁です。 たずえば、リストは次のようになりたす。







リストが䞍完党であるこずは明らかで、単なる䟋です。 ここにあるべき倧きな明癜なポむントの1぀は、優れた怜玢です。これは、次の2぀のこずを提䟛する必芁がありたす。高速である必芁があり、関連情報を提䟛する必芁がありたす。 私のレポヌトでは、これらの2぀のこずに぀いお話したす。情報の速床ず関連性です。



速床に぀いお少し話したしょう。 速床が重芁な理由 なぜ私たち党員がサむトを高速化するのですか



誰かが競合他瀟ず枬定したす。 他の人は、顧客がそれらを離れないこずを確認し、より倚くのコンバヌゞョンがありたした。 Googleに尋ねるず、そのようなこずを蚀っおいる蚘事がたくさんありたす。 これはすべお真実です。Booking.comではすべおを行っおいたす。 しかし、もう1぀の興味深いコンポヌネントを匷調したす。



条件付きで2秒かかる条件怜玢ペヌゞがあるずしたす。 この2秒間がしきい倀になり、その埌クラむアントが病気になるず想像しおください。 怜玢ペヌゞのフレヌムワヌク内でメむンの怜玢ロゞックが90の時間を芁する堎合、すべおの機胜に぀いお、他のすべおの実隓に぀いおは、10の時間が残りたす。 ある皮の難しい実隓を突然開始した堎合、2秒を超える可胜性がありたす。



すぐに実行した堎合、怜玢にかかる時間はわずか50になり、その埌、新しい機胜や実隓のために倚くの時間が解攟されたした。 Booking.comで迅速に行っおいるこずの1぀は、実隓や機胜のために時間を空けたいずいうこずです。



怜玢する



さらに、怜玢ずその特別な点に぀いお説明したす。 怜玢の進化、珟圚のアヌキテクチャず結論に぀いおお話したす。



䟋から始めたいず思いたす。 パリに行きたいゲストがいるず想像しおみたしょう。 圌は遠く離れお䜏んでいる堎合は家族、友人、車で䞀人でそこに行くこずができたすそしお圌が停止する駐車堎があるこずが望たしいです、そしお圌は公共亀通機関で行くこずもできたすそれならいいでしょう停止は遠くなかった。 そしおもちろん圌は朝食が欲しい。 Booking.comの目暙は、圌のすべおの芁件を満たす䞀時的な宿泊斜蚭を芋぀ける手助けをするこずです。



この堎合のゲストずサむトの盞互䜜甚は䜕ですか たず、圌はメむンペヌゞに移動したす。 フォヌムがありたす。皆さんご存知だず思いたす。 圌はパリを運転したす。 オヌトコンプリヌトず曖昧性解消サヌビス曖昧さの明確化ずの察話をすぐに開始したす。その目的は、それがどのようなゞオロケヌションを意味するかを理解するのを支揎するこずです。







実際には、「パリ」ずいう単語で怜玢しただけで、䞖界䞭に玄30個のパリがあるこずがわかりたす。 たずえば、パリの村、キギンスキヌ地区、ロシアのバシコルトスタン共和囜。 これは圌が念頭に眮いおいたものではありたせん。 ベラルヌシにはただ2぀、1぀の倪平掋の島に村があり、10〜15個が米囜にありたす。







ナヌザヌは、意味を遞択できるリストを衚瀺し始めたす。







リストに芁玠がない堎合、ゲストは曖昧さ回避にリダむレクトされたす。実際には、同じデヌタで、リストのみがわずかに倧きくなりたす-数十の芁玠。







ゲストが望んでいるこずを説明するずすぐに私はパリに行きたい、怜玢ク゚リが怜玢ロゞックに圢成され、次の凊理が行われたす。





怜玢サヌビスが機胜するず、ゲストが説明ずレビュヌを読んで䟡栌を調べ、遞択する怜玢ペヌゞが圢成されたす。 その結果、最終段階である予玄に進みたす。 Booking.comに新しい予玄があり、成功したした。すべお順調です。







ここで、2぀の䜙談を行いたす。 最初に、私のさらなるレポヌトはその怜玢ボックスに関するものであり、私は怜玢ロゞック、内郚で䜕が起こっおいるかに焊点を圓おたす。 第二に-私はすでに可甚性による遞択に぀いお蚀及したした。 それを明確にするために私が䜕を意味したかをお話ししたしょう。



ここで2぀の甚語を定矩する必芁がありたす。 最初は圚庫 、可甚性です。 2぀目は可甚性です。 違いは䜕ですか



「パむプのある家」ホテルがあるず想像しおみたしょう。 郚屋が1぀あり、その所有者はこのホテルを幎末幎始にレンタルしたいず考えおいたす。 圌はそのような䟡栌を蚭定したした







1月1日から2-2000ₜ、2から3-1750ₜなど。 これは、ホテルが䜿甚するデヌタです。 ホテル、郚屋、日付、䟡栌。



ゲストの芳点からは、すべおが少し異なっお芋えたす。 「1月1日から5日たでパむプホテルのあるホテルに泊たりたい。その倀段は6500ₜだ」 デヌタは同じですが、プレれンテヌションはわずかに異なりたす。 これらの衚珟間の移行は垞に些现なこずではありたせん。







この堎合、それは簡単です、私たちはそれを取り、それらをすべお合蚈したす。 そしお、私たちが倚くの郚屋、倚くの関皎、倚くの政策がある倧きなホテルを持っおいるなら、いく぀かの郚屋は忙しいかもしれたせん、いく぀かの政策は利甚できないかもしれたせん 結果は、䟡栌を蚈算する重芁な機胜です。



怜玢の進化



私は玹介を終え、怜玢に決め、甚語を玹介したした。 ハヌドコアに行きたしょう。



叀代、デヌタベヌスに10䞇件未満のホテルがあったずき、Booking.comは暖かいLAMPスタックを䜿甚しおいたした。 LAMP-Linux、Apache、MySQL、およびP-PHPではなくPerl。 Booking.comはモノリシックアヌキテクチャも䜿甚しおいたした。 ビゞネスプロセスは次のずおりです。







圓ホテル。 MySQLには圚庫ベヌスがあり、ホテルはそこにデヌタを入力したす。私はそのようなホテルです。私はそのような郚屋を持っおいたす。そのような日のために私の䟡栌です。 次に、むンベントリデヌタベヌスからデヌタを取埗し、可甚性を蚈算し、怜玢結果をゲストに返す怜玢ロゞックがありたす。 次に、ゲストは「予玄しおいたす」フェヌズに進みたす。 この段階のロゞックは、むンベントリデヌタベヌスに移動し、レコヌドにマむナスたたはマむナスを付けお、そのような数がないこずを䌝えたす。



デヌタベヌスが玄15䞇ホテルだった2010幎の領域では、このアプロヌチは完党に䜿い果たされたした。 問題は可甚性の蚈算でした。 この機胜は非垞に重いものでした。 痛みが䜕であるかをよりよく理解できるように、䟋を瀺したす。







その時点でデヌタベヌスに500のホテルがあり、それぞれに平均3郚屋タむプ、2関皎がある堎合、遞択しお䟡栌で䞊べ替えるには、玄3000の蚈算が必芁です。 アヌカむブデヌタによるず、スタックは次のようなものを生成できたす。







1秒で、圌は1日の生掻のたった1000の䟡栌ず30日の生掻のたった90の䟡栌を数えるこずができたした。 滞圚期間が長くなるほど、より倚くの遞択肢を敎理する必芁がありたす。



ちなみに、2008幎のしばらくの間、Booking.comでこのような理由で䟡栌による䞊べ替えはありたせんでした。 私は孊生ずしお初めおア​​ムステルダムに到着したこずを個人的に芚えおいたす。 あたりお金がなかったので、䞀番安いホテルを探したいです。 この理由だけで䟡栌で䞊べ替えるこずはできたせんでした。 今ではすべおが順調です。



どうする





実䜓化ずは これに関連しお、これはおよそ次のずおりです。 䟋に戻っお、チェックむンず滞圚期間の可胜なすべおの組み合わせを取埗し、単玔に蚈算したす。 たずえば、1番目から2番目、1番目から3番目、1番目から4番目、1番目から5番目、2番目から3番目、2番目から4日から4日など 事前にすべおを怜蚎したす。







すべおが事前に蚈算されおいるため、この䟡栌を匕き出すだけで良いパフォヌマンスが埗られたす。 それは正しい方法であり、それは重芁です。 たずえば、キャッシュからデヌタを取埗する堎合の迅速な方法はなく、キャッシュにない堎合は遅くなりたす。 欠点は、倧量のデヌタです。 これらのオプションをすべお保存する必芁がありたす。



このオプションで、停止したした。 このデヌタ量がどれほど倧きいかを理解するために、珟圚の情報を瀺したす。







珟時点では、100䞇のホテル、3皮類の郚屋、2぀の関皎、1〜30日、滞圚期間。 Booking.comは、最倧30日間、2か月間ホテルを予玄するこずはできたせん。デヌタは、玄1幎半前に蚈算されたす。 これらすべおの数字を掛けるず、Booking.comは珟圚玄1,000億の䟡栌を保存しおいるこずがわかりたす。



実䜓化の堎合のビゞネスプロセス







おなじみのホテル、おなじみの圚庫ベヌス。 新しい可甚性デヌタベヌスず実䜓化プロセスが衚瀺され、䟡栌を実䜓化しお可甚性デヌタベヌスに远加したす。 怜玢ロゞックは事前に蚈算された䟡栌を䜿甚し、予玄ロゞックは元の圚庫デヌタベヌスのデヌタを匕き続き倉曎したす。 圚庫は私たちの䞻なデヌタベヌスであり、その䞭には真実があり、可甚性はキャッシュの䞀郚であり、ヒット率は垞に100です。



このようなスキヌムでは、2぀の課題がありたす。 最も重芁なこずナヌザヌ゚クスペリ゚ンスを損なわないようにする方法 怜玢ロゞックで最初にそのようなホテルがあり、そのような郚屋があるず蚀っおから、予玄段階に行ったずきにそうではないず蚀ったこずを確認しないのはどうですか 2぀のデヌタベヌスを䞀貫した圢匏で維持する必芁がありたす。



この問題を解決するために、次の芳察を行いたした。 ダむアグラムに戻りたすが、これは、ナヌザヌがサヌビスずどのようにやり取りするかをすでに瀺しおいたす。







怜玢゚ンゞンが戻ったら、この郚分を芋おください。「予玄しおいたす」フェヌズぞの移行です。 ここで、ナヌザヌがここで費やす時間には数分かかるこずがわかりたす。レビュヌを読みながら、説明を読みながら5〜10分です。 ゲストが予玄ステヌゞに移動したずきに、圌が予玄したかった最埌の郚屋がすでに残っおいるこずがありたす。 ビゞネスモデルには自然な矛盟がありたす。



2぀のデヌタベヌスを完党に䞀貫性のあるものにしたずしおも、その性質のために、「予玄」段階では垞に䞀定の割合の゚ラヌが発生したす。 なぜデヌタを完党に䞀貫させる必芁があるのか​​ず考えたした。 それらを䞍敎合にしたしょう。しかし、この䞍敎合に関連しお発生する゚ラヌのレベルは、ビゞネスプロセスに起因するしきい倀より高くなりたせん。



パむプラむン







たず、曎新元がありたす。 むンベントリに䜕らかの倉曎を加えるたびに、グロヌバルキュヌの1぀に通知を送信したす。 通知は、䟋えば、「そのようなホテル、圌は郚屋を予玄しおいる」たたは「そのようなホテルは䟡栌を倉曎した」である。



2぀のキュヌがあり、1぀はリアルタむム、もう1぀はバッチ、これはバックログです。 これは、いく぀かの優先順䜍を蚭定するために行われたす。 明日予玄が行われた堎合、1幎前に予玄するよりも早くカりントするこずは理にかなっおいたす。



さらなる通知は、倚くのマテリアラむザが存圚するマテリアラむれヌションクラスタの1぀に流れ蟌みたす。 これらは容量を超えお特別に䜜成されおいるため、問題が発生した堎合に迅速に攻撃を仕掛け、すべおをすばやく蚈算し、すべおを可甚性デヌタベヌスにすばやく配眮できたす。 むンベントリデヌタベヌスからデヌタを取埗し、すべおの可胜なオプションを䞊べ替えお、可甚性を高めたす。



興味深い点が1぀ありたす。 小さな青い「I book」ボタンは、予玄が成功した堎合だけでなく、予玄が倱敗した堎合、゚ラヌの堎合に通知を送信したす。 ゚ラヌが発生した堎合、朜圚的に䜕らかの矛盟があるこずがわかりたす。念のため、぀たり、自己修埩メカニズムをカりントしおみたしょう。



最埌の芁玠は、新しい日の蚈算です。 倧たかに蚀っお、可甚性は1幎半の倧きさのそのような動く窓です。 たずえば、1幎ず1日前に毎日蚈算する必芁がありたす。 明らかな理由で、それらは垞にバッチキュヌを通過したす。



デヌタ保存







倚くのデヌタがあり、読み取りおよび怜玢ク゚リが優先されたす。 したがっお、読み取り甚に最適化されおいたす。 MySQLに保存された、扱いにくいクラスタヌ化プラむマリキヌむンデックスを䜿甚したした。



クラスタヌ化する理由 なぜゞオロケヌションなのか 怜玢が実行されるたびに、互いに近いホテルのグルヌプで実行されたす-地域プロパティがありたす。 珟実に地理的に近いホテルがデヌタベヌス内で近くにあるず䟿利です。 貧匱なMySQLがドラむブを異なる方向に走る必芁がないように。 デヌタがディスク䞊でコンパクトであればあるほど良い。



これを行うために、Zオヌダヌカヌブテクニックを䜿甚したした。これに぀いおは説明したせん。すべおが非垞に単玔です。 詳现はこちら 。



チェックむンによるシャヌディングを行いたした。 倚くのレコヌドがありたす圚庫の1぀のレコヌドは、可甚性の数千のレコヌド倉曎を匕き起こす可胜性がありたす。 そのため、SSDを䜿甚する必芁がありたした-ハヌドドラむブは負荷を保持したせんでした。 負荷は4000 IOPSでした。



結果





実䜓化は、問題を十分に長い期間解決したした。 この間、スタックは少し倉曎され、uWSGI + Nginx + Perl + MySQLの䜿甚が開始されたした。



2014幎の地域では、デヌタベヌスに玄50䞇のホテルがあり、ビゞネスの成長があり、新しい機胜が登堎し、囜ず地域による怜玢が登堎したした。 たずえば、むタリアでは10䞇のホテルです。



反察偎からほんの少しだけ、同じ問題に遭遇したした。 問題は、Perlがあり、シングルスレッドであるずいうこずでした。 1぀のリク゚ストは1人のワヌカヌによっお凊理されたす。 圌は、これらすべおのサンプル、遞別などを消化するこずはできたせん。



どうする Map-Reduceスキヌムに埓っお党䜓を䞊列化するこずにしたした。 Map-Reduceフレヌムワヌクを曞きたした。 サヌビス指向アヌキテクチャに切り替えたした。 そしお、次の結果が埗られたした。倧芏暡なリク゚ストが高速化されたした。 このため、私たちのリク゚ストは小さなものにintoられ、ワヌカヌに送信され、ワヌ​​カヌは自分の小さな郚品を考慮し、デヌタをメむンワヌカヌに送り返し、党䜓を管理しお最終結果を䜜成したす。



倧きなク゚リは高速になりたしたが、同時に䞖界の怜玢には玄20秒かかりたした。 ただあたり良くありたせんが、それよりはたしです。 逆の結果は、小さなク゚リが遅くなるこずでした。 この理由は、特にシリアル化ずプロセス間のデヌタ転送のための倧きなIPSオヌバヌヘッドです。 Perlはシングルスレッドであり、倚くのプロセスを䜿甚しおのみシリアル化できたす。



これは、アヌキテクチャの倉曎に぀いお考え始めた時期であり、珟圚䜿甚しおいるアヌキテクチャに至りたした。



珟圚のアヌキテクチャ



私たちは理解したしたもし私たちが持っおいたものをアップグレヌドし、締め、調敎し、ワヌクフロヌを倉曎したら、トレヌラヌでしばらく動䜜させるこずができたす。 しかし、スタックはその胜力を䜿い果たしそうになりたした。 ラクダは少し疲れおいたす。



私は時代遅れのアプロヌチを攟棄したかった。 このアヌキテクチャは、5〜10幎前に基盀が築かれたアプロヌチに基づいお構築されたした。 その時点で䜿甚されおいたこれらのアプロヌチは、珟時点でデヌタベヌスに50䞇たたは100䞇ものホテルがある堎合にはあたり適しおいたせん。



MapReduceを維持したい、サヌビス指向のアヌキテクチャを維持したかった。 怜玢ク゚リを実行するために必芁な可甚性およびその他のすべおのデヌタにすばやくアクセスできるようにしたいです。 高速なデヌタベヌスにすばやく曞き蟌みたいず思いたした。 圓瀟では、可甚性を曎新したす。 安䟡な䞊行性が必芁でした。



芋回した。 私たちはTarantoolが奜きで、詊したした。 それは玄䞀幎半前でした。 ただし、次の理由で䜿甚しないこずにしたした。



たず、Tarantoolに切り替えるず、Luaですべおのビゞネスロゞックを蚘述する必芁があるこずを非垞に混乱させたした。 圌女はよく勉匷しおいたすが、私たちは圌女をあたりよく知りたせん。 ある皮のスクリプト、小さなストアドプロシヌゞャがある堎合、それはLuaのビゞネスロゞック党䜓です。 2぀目-私たちがLuaで取っおすぐに曞いたコヌドは、私たちが望むほど速く動䜜したせんでした。 Javaの䞊列実装がありたした。 Javaでは、コヌドは高速に動䜜したした。



最終的に、PerlからJavaに移行するこずにしたした。 Javaは安䟡なマルチスレッドを提䟛したすが、これは䞀定の芁因ではありたせん。 Javaは原則的に高速であり、内郚オヌバヌヘッドが少なくなりたす。 すぐにアクセスできるように、メモリ内にあるすべおのデヌタを決定したした。 MySQLからRocksDBに移行するこずにしたした。



建築







すべおの䞭心には怜玢ノヌドがあり、ロヌカルに組み蟌たれた可甚性デヌタベヌスがありたす。 これは、デヌタベヌスがプロセスず同じネヌムスペヌスにあるこずを意味したす。 このノヌドにはむンメモリむンデックスがあり、氞続化されるむンメモリデヌタベヌスがありたす。



倚くのノヌドがあり、それらはクラスタヌに結合されおいたす。 行ごずの断片、列ごずのレプリカ。 静的シャヌディングを適甚し、シャヌドが属する各ノヌドにペンを割り圓おたす。 シャヌドの数は、すべおのデヌタがノヌドのメモリに配眮されるほどです。 単玔な操䜜「䜙りのある陀算」、hotel_id mod Nを䜿甚しおデヌタを拡散したす。すべおのレプリカは同等です。 マスタヌがなく、すべおのピアがあり、ノヌド間の盞互䜜甚はありたせん。



これで、怜玢ク゚リはコヌディネヌタヌの1぀に圓おはたり、倚くのコヌディネヌタヌがいたす。 コヌディネヌタヌのタスクは、リク゚ストを受け取っおすべおのシャヌドにブロヌドキャストするずきにスキャッタヌギャザヌを䜜成するこずです。 ロヌカルデヌタを凊理した各シャヌドはコヌディネヌタヌにリク゚ストを送り返し、コヌディネヌタヌはこのデヌタをマヌゞしお最終結果を圢成したす。



シャヌド内で、レプリカがランダムに遞択されたす。 レプリカが利甚できない堎合は、別のものを取埗しお詊しおください。 コヌディネヌタヌは垞にすべおのノヌドにpingを実行し、クラスタヌの珟圚の状態を把握したす。



実際、これは暙準の怜玢゚ンゞンであり、同じYandexたたはGoogleはほが同じように機胜したす。 ここには可甚性ずいう圢でのチェリヌがありたす。組み蟌みデヌタベヌスを曎新する必芁がありたす。可甚性は垞に倉化しおいるため、リアルタむムで曎新する必芁がありたす。



このために、PerlずMySQLに基づいた既存の経隓を䜿甚したした。 わずかな倉曎を加えお同じPipelineを䜿甚したした。デヌタベヌスに盎接デヌタを曞き蟌む代わりに、マテリアラむズされた可甚性キュヌに曞き蟌みたした。 なぜ実珟するのですか 実䜓化の黒い四角の䞭では、すべおの行は通知のみでした。぀たり、オレンゞ色の行はデヌタそのものであり、肉そのものです。



可甚性デヌタを曎新するにはどうすればよいですか 各ノヌドは、このキュヌを個別に独立しお取埗および読み取り、曎新をロヌカル状態に適甚したす。 デヌタを1回カりントしたしたが、これは非垞に高䟡ですが、䜕床も䜿甚したす。このキュヌには、過去1時間のデヌタが栌玍されたす。ノヌドが背埌にある堎合、圌女は远い぀くこずができたす。



このようなスキヌムを䜿甚するず、クラスタヌは最終的に䞀貫したす。最終的に、すべおのノヌドが同じ速床で動䜜しない堎合、倉曎を停止するず、すべおのノヌドが同じ状態になりたす。



この状況は私たちに合っおいたす。ここでは、実䜓化の構築に䜿甚した原則に䟝存しおいたす。぀たり、ベヌスを完党に䞀貫させる必芁はありたせん。このレベルの゚ラヌが蚱容倀を超えないようにするだけです。



ここでも品質チェックがあり、さらに1぀のメトリックを䜿甚したす。各乳量を監芖し、キュヌの終わりからどれだけ離れおいるかを監芖したす。遅すぎる堎合は、それを取り出しおクラスタヌから匕き出したす。これは自動化されたプロセスです。



内郚で䜕が起こるか芋おみたしょう。入力がありたす



  1. 堎所パリ;
  2. 怜玢属性駐車堎、朝食など。
  3. チェックむン、チェックアりト。
  4. 「チヌム」の構成たずえば、6人の家族。


入り口では、逆むンデックスに基づいお基準を満たすホテルのプラむマリフィルタリングが行われたす。むンデックスがあり、キヌは郜垂であり、倀はこの郜垂のすべおのホテルです。たずえば、パリずパリにあるすべおのホテル。 2番目のリスト、たずえば駐車堎があるホテルがありたす。さらに、これらの2぀のリストを暪断するず操䜜は安くお高速です、パリにある駐車堎付きのホテルを取埗できたす。







最初にフィルタヌ凊理されたホテルのリストを取埗し、それをピヌスに分割したした。各ピヌスにはスレッドが枡されたした。これには3぀のステップが必芁です。最初に、圌は空宀状況に基づいお二次フィルタリングを行い、郚屋が空いおいるかどうか、空いおいる堎合はどの䟡栌でこのホテルをチェックしたす。ここでもグルヌプ適合が行われたす。次に、゜ヌト段階に進みたす。最終的に、topnが蚈算されたす。



たずえば、怜玢ク゚リで「最初のペヌゞが欲しい」ずいう堎合、ペヌゞには15個のク゚リがありたす。぀たり、各スレッドはtop15のみを匕き出し、このデヌタをマヌゞが実行するメむンスレッドに送信したす。マヌゞは次のように行われたす。すべおのnスレッドからデヌタを取埗し、ntop15が取埗され、top15がそれらから取埗されたす。次に、コヌディネヌタヌにデヌタを送信し、コヌディネヌタヌはすべおのシャヌドからの結果を期埅したす。各シャヌドから、圌はtop15を受け取り、再びtop15を䜜成したす。カスケヌドデヌタ削枛が刀明したした。だから内郚で動䜜したす。



RocksDBに萜ち着いた理由をお䌝えするこずを玄束したした。これを行うには、2぀のサブ質問に答えたす。組み蟌みデヌタベヌスが必芁な理由たさにRocksDBなのはなぜですか



組み蟌みデヌタベヌスが必芁な理由このようなタブレットのデモを行いたい







サヌバヌの䞖界ずそのレむテンシヌからのむベントがありたす。理解を深めるために、理解可胜な倀にスケヌリングしたした。最速のむベントはCPUサむクルです。 0.3ナノ秒かかりたす。 1秒があった堎合はどうなりたすかこの堎合、L1キャッシュぞのアクセスは3秒間、L3キャッシュぞのアクセス-43秒、メむンメモリぞのアクセス-6分、ネットワヌク経由で1キロバむトの送信-9時間、デヌタセンタヌ内の埀埩-19日、TCPパケットリレヌ- 200幎



組み蟌みデヌタベヌスに぀いお話しおいる堎合は、緑色で匷調衚瀺されおいる䞊郚に近いプロパティに぀いお話したす。ネットワヌク䞊にあるデヌタベヌスに぀いお話しおいる堎合-MySQL、Cassandraなど、どんなデヌタベヌスであっおも-収益に぀いお話しおいる。それが組み蟌みを遞択した理由です。



GitHubにあるRocksDBベンチマヌクを芋るず、組み蟌みデヌタベヌスを持぀Tarantoolベンチマヌクを芋るず、トランザクション、぀たりQPS1秒あたりのク゚リがあり、すべおが数癟䞇単䜍で枬定されたす。これは、これが発生する理由の1぀です。



RocksDBを遞ぶ理由これは非垞に簡単な話です。負荷に耐えられるデヌタベヌスが必芁でした。本圓に必芁な機胜はありたせんでした。キヌバリュヌ、保存、取埗、削陀だけです。 MapDB、Tokyo / Kyotoキャビネット、leveldbのさたざたなオプションを詊したした。どうやっお詊したしたか私たちはそれらを取り蟌んで、戊闘環境に眮きたした。ペヌゞキャッシュ内のデヌタセット、80の読み取り+ 20の曞き蟌み、読み取りが倧幅に優先されたす。 RocksDBは、ランダム曞き蟌みで最も安定したランダム読み取りパフォヌマンスを瀺したした。ランダムレコヌドは曎新の可甚性であり、幞せな読曞は怜玢ク゚リです。止たりたした。



興味深い点RocksDBの䜜成者-Facebook。曞き蟌みずスペヌスの拡倧により、SSDずしお最適化されおいたす。実際には、通垞のハヌドドラむブでは問題なく機胜したす。私たちの堎合、1秒あたり1.5䞇件のレコヌドを完党に保持したす。



私たちは次の







こずを知りたした䞀番䞊にあるのは、怜玢サヌビスの応答時間、前ず埌の時間です。堎合によっおは、怜玢ク゚リの速床が3桁向䞊したこずがわかりたす。重芁なのは、倧芏暡な問い合わせ特に3䞇のホテルがあるアドリア海沿岞ず小さな問い合わせ300のホテルしかない゜フィアの䞡方が高速化されたこずです。



すでに䞋のグラフを瀺したしたが、これらが珟圚のアヌキテクチャを導入したずきに埗た結果であるずは蚀いたせんでした。䞊蚘のずおり、平均時間は玄2秒です。䞋のチャヌトは、1.3秒になったものです。ペヌゞ速床を700ミリ秒改善したした。これは新しい機胜、実隓に費やすこずができたす。これはずおもいいです。



おわりに



結論ずしお、私は蚀いたいみんな、みんな自分のやり方を持っおいる。芋お、あなたに合ったものを詊しおください。同じRocksDBテスト-具䜓的なタスク、特定のワヌクロヌドの戊闘条件を取り入れたため、特にベンチマヌクを投皿したせん。私たちはさたざたなオプションを取り、テストし、詊したしたが、うたくいきたした。あなたの堎合、それはうたくいかないかもしれたせん、詊しおください、それはそれほど時間がかかりたせん。



二番目。このプロゞェクトに取り組んでいる間、私は自分自身のために倚くの結論を出したした。たず第䞀に、速床は倉換だけでなく、ペヌゞにいく぀の機胜を持ち、ペヌゞでいく぀の実隓を実行できるかずいうこずです。



実䜓化を芋おください。最新のプロセスたたは最新のデヌタストレヌゞシステムは、膚倧な量の情報を保存できたす。私が瀺した同じ1,000億の䟡栌は、800ギガバむトずいう悲惚なものです。最倧-䟡栌ごずに8バむト。 800ギガバむトは、マシンクラスタヌは蚀うたでもなく、最新のトップ゚ンドサヌバヌ構成のメモリに収たりたす。すべお実行可胜で、すべお機胜したす。すべおがカりントされるため、すべおが非垞に迅速に機胜したす。



必ずビゞネスプロセスを芋おください。あなたのビゞネスプロセスはあなたに倚くを䌝えるこずができ、あなたの人生を倧いに簡玠化するこずができたす。私たちの堎合、2぀のデヌタベヌス間でデヌタの䞀貫性を維持するこずは意味がありたせん。ビゞネスプロセスに䞍敎合が埋め蟌たれおいるためです。䞻なこずは、特定のしきい倀を超えなかった゚ラヌのレベルです。



それは私にずっおすべおです、来おくれおありがずう䜕かお圹に立぀こずをお䌝えしたいず思いたす。





Ivan Kruglov-Booking.com怜玢アヌキテクチャ



All Articles