心配するのをやめお、䞀枚岩なしで生掻を始める方法

心配するのをやめお、䞀枚岩なしで生掻を始める方法

私たちは皆、物語が倧奜きです。 私たちは暖炉の呚りに座っお、過去の勝利や戊い、あるいは単に仕事の経隓に぀いお話すのが奜きです。

今日はたさにそんな日です。 たずえあなたが今火のそばにいないずしおも、私たちはあなたに向けたストヌリヌを甚意しおいたす。 Tarantool でストレヌゞを䜿い始めた経緯。

か぀お、圓瀟にはいく぀かの「䞀枚岩」ず XNUMX ぀の「倩井」があり、これらの䞀枚岩がゆっくりず、しかし確実にそこに近づき、圓瀟の飛行ず発展を制限しおいたした。 そしお、い぀かこの倩井に倧きくぶ぀かるこずになるずいう明確な理解がありたした。

珟圚、機噚からビゞネス ロゞックに至るたで、あらゆるものを分離するずいうむデオロギヌが蔓延しおいたす。 その結果、たずえば、ネットワヌク レベルで実質的に独立した XNUMX ぀の DC が存圚したす。 そしお、すべおがたったく違っおいたした。

珟圚では、CI/CD、K8S などの圢匏で倉曎を加えるためのツヌルやツヌルがたくさんありたす。 「モノリシック」の時代には、それほど倚くの倖来語は必芁ありたせんでした。 デヌタベヌス内の「ストレヌゞ」を修正するだけで十分でした。

しかし、時間は進み、リク゚ストの数もそれに䌎っお増加し、時には私たちの胜力を超える RPS を達成したした。 CIS 諞囜の垂堎参入により、最初のモノリスのデヌタベヌス プロセッサの負荷は 90% を䞋回らず、RPS は 2400 のレベルに留たりたした。そしお、これらは単なる小さなセレクタヌではなく、倧量のク゚リでした。倧芏暡な IO を背景にデヌタのほが半分に察しお実行される可胜性のある倧量のチェックず JOIN。

本栌的なブラックフラむデヌセヌルが珟堎に珟れ始めたずき、ワむルドベリヌズはロシアで最初にブラックフラむデヌセヌルを開催したうちのXNUMX぀であったが、状況は完党に悲しいものになった。 結局のずころ、そのような日の負荷はXNUMX倍になりたす。
ああ、この「䞀枚岩の時代」 あなたも同じようなこずを経隓したこずがあるず思いたすが、なぜ自分にこんなこずが起こり埗るのか、ただ理解できおいたせん。

あなたにできるこず - ファッションはテクノロゞヌに内圚しおいたす。 箄 5 幎前、私たちはこれらの MOD の XNUMX ぀を、サむト自䜓のすべおのロゞックを慎重に保存した .NET および MS SQL サヌバヌ䞊の既存のサむトの圢で再考する必芁がありたした。 私はそれを非垞に泚意深く保管しおいたので、そのようなモノリスを鋞で切るのは長くお決しお簡単な喜びではないこずがわかりたした。
小さな䜙談。

私はさたざたなむベントで「䞀枚岩を芋なければ成長しない」ず蚀いたす。 この件に関するあなたの意芋に興味があるので、コメントに曞いおください。

そしお雷が鳎った

「焚き火」の話に戻りたしょう。 「モノリシック」機胜の負荷を分散するために、オヌプン゜ヌス テクノロゞヌに基づいおシステムをマむクロサヌビスに分割するこずにしたした。 少なくずも、スケヌルするのにコストがかからないからです。 そしお、私たちはそしお倚くの芏暡を拡倧する必芁があるこずを100%理解しおいたした。 結局のずころ、その時点ですでに近隣諞囜の垂堎に参入するこずが可胜であり、登録数ず泚文数はさらに匷力に増加し始めたした。

モノリスからマむクロサヌビスぞの移行の最初の候補を分析したずころ、それらぞの曞き蟌みの 80% はバック オフィス システムからのものであり、読み取りはフロント オフィスからのものであるこずがわかりたした。 たず第䞀に、これは私たちにずっおいく぀かの重芁なサブシステム、぀たりナヌザヌデヌタず、远加の顧客割匕やクヌポンに関する情報に基づいお最終的な商品原䟡を蚈算するシステムに関係しおいたした。

むンデントあり。 今では想像するのも恐ろしいですが、䞊蚘のサブシステムに加えお、補品カタログ、ナヌザヌ ショッピング カヌト、補品怜玢システム、補品カタログのフィルタリング システム、および各皮レコメンデヌション システムもモノリスから削陀されたした。 それぞれを操䜜するために、厳密に調敎されたシステムの別のクラスがありたすが、か぀おはすべおが XNUMX ぀の「家」に䜏んでいたした。

私たちはすぐに、クラむアントに関するデヌタをシャヌド システムに転送するこずを蚈画したした。 最終的な商品原䟡を蚈算する機胜を削陀するには、読み取りに優れたスケヌラビリティが必芁でした。これは、最倧の RPS 負荷が発生し、デヌタベヌスぞの実装が最も困難であったためです (蚈算プロセスには倧量のデヌタが関䞎したす)。

その結果、Tarantool によく適合するスキヌムを思い぀きたした。

圓時、マむクロサヌビスの運甚には、仮想マシンやハヌドりェアマシン䞊で耇数のデヌタセンタヌず連携するスキヌムが遞択されおいたした。 図に瀺すように、Tarantool レプリケヌション オプションはマスタヌ/マスタヌ モヌドずマスタヌ/スレヌブ モヌドの䞡方に適甚されたした。

心配するのをやめお、䞀枚岩なしで生掻を始める方法
建築。 オプション 1. ナヌザヌサヌビス

珟時点では 24 個のシャヌドがあり、それぞれに 2 ぀のむンスタンス (DC ごずに XNUMX ぀) があり、すべおマスタヌ/マスタヌ モヌドになっおいたす。

デヌタベヌスの䞊には、デヌタベヌスのレプリカにアクセスするアプリケヌションがありたす。 アプリケヌションは、Tarantool Go ドラむバヌ むンタヌフェむスを実装するカスタム ラむブラリを通じお Tarantool ず連携したす。 圌女はすべおのレプリカを確認し、マスタヌず連携しお読み取りず曞き蟌みを行うこずができたす。 基本的に、レプリカ セット モデルを実装し、レプリカの遞択、再詊行の実行、サヌキット ブレヌカヌ、およびレヌト制限のためのロゞックを远加したす。

この堎合、シャヌドのコンテキストでレプリカ遞択ポリシヌを構成できたす。 たずえば、ラりンドロビンです。

心配するのをやめお、䞀枚岩なしで生掻を始める方法
建築。 オプション 2. 最終的な商品原䟡の蚈算サヌビス

数か月前、最終的な商品原䟡の蚈算リク゚ストのほずんどは、原則ずしおデヌタベヌスなしで動䜜する新しいサヌビスに送られたしたが、少し前には、すべおが内郚に Tarantool を備えたサヌビスによっお 100% 凊理されおいたした。

サヌビス デヌタベヌスは、シンクロナむザヌがデヌタを収集する 4 ぀のマスタヌで構成され、これらの各レプリケヌション マスタヌはデヌタを読み取り専甚レプリカに分散したす。 各マスタヌにはそのようなレプリカが玄 15 個ありたす。

最初の方匏でも XNUMX 番目の方匏でも、XNUMX ぀の DC が利甚できない堎合、アプリケヌションは XNUMX 番目の方匏でデヌタを受信できたす。

Tarantool のレプリケヌションは非垞に柔軟であり、実行時に構成できるこずは泚目に倀したす。 他のシステムでは問題が発生したした。 たずえば、PostgreSQL で max_wal_senders パラメヌタず max_replication_slots パラメヌタを倉曎するにはりィザヌドを再起動する必芁があり、堎合によっおはアプリケヌションず DBMS 間の接続が切断される可胜性がありたす。

怜玢しお芋぀けおください

なぜ私たちは「普通の人ず同じように」やらずに、非兞型的な方法を遞んだのでしょうか? それは䜕が正垞ずみなされるかによっお異なりたす。 通垞、倚くは Mongo からクラスタヌを䜜成し、地理的に分散された XNUMX ぀の DC に分散させたす。

その時点で、すでに XNUMX ぀の Redis プロゞェクトがありたした。 XNUMX ぀目はキャッシュで、XNUMX ぀目はそれほど重芁ではないデヌタ甚の氞続ストレヌゞでした。 圌にずっおは、私たちのせいもあり、かなり困難でした。 堎合によっおは、キヌに非垞に倧きなボリュヌムが含たれおおり、サむトの状態が悪化するこずがありたした。 マスタヌスレヌブバヌゞョンではこのシステムを䜿甚したした。 たた、マスタヌに䜕らかの問題が発生しおレプリケヌションが停止するケヌスも倚くありたした。

぀たり、Redis はステヌトフルなタスクではなく、ステヌトレスなタスクに適しおいたす。 原理的には、ほずんどの問題を解決できたしたが、それはむンデックスのペアを䜿甚したキヌず倀の゜リュヌションである堎合に限られおいたした。 しかし、圓時の Redis は氞続化ずレプリケヌションに関しお非垞に残念でした。 さらに、パフォヌマンスに関する苊情もありたした。

MySQL ず PostgreSQL に぀いお考えたした。 しかし、最初のものはどういうわけか私たちには受け入れられず、XNUMX ぀目はそれ自䜓かなり掗緎された補品であり、その䞊に単玔なサヌビスを構築するのは䞍適切でしょう。
RIAK、Cassandra、さらにはグラフデヌタベヌスも詊したした。 これらはすべおかなりニッチな゜リュヌションであり、サヌビスを䜜成するための䞀般的な汎甚ツヌルの圹割には適しおいたせん。

最終的にはタランツヌルに萜ち着きたした。

バヌゞョン 1.6 のずきにこれに泚目したした。 私たちは、キヌず倀の共生ずリレヌショナル デヌタベヌスの機胜に興味を持ちたした。 セカンダリ むンデックス、トランザクション、スペヌスがあり、これらはテヌブルに䌌おいたすが、単玔ではなく、さたざたな数の列を栌玍できたす。 しかし、Tarantool のキラヌ機胜は、キヌ倀ずトランザクション性を組み合わせたセカンダリ むンデックスでした。

ロシア語を話すコミュニティの察応力も高く、チャットですぐに助けおくれるこずも圹割を果たしたした。 私たちはこれを積極的に䜿甚し、チャットに盎接参加したした。 そしお、明らかな倱敗や間違いをせずに、きちんずした粘り匷さを忘れないでください。 Tarantool の䜿甚の歎史を芋るず、レプリケヌションで倚くの苊劎や倱敗がありたしたが、Tarantool のせいでデヌタが倱われたこずは䞀床もありたせんでした。

導入は厳しいスタヌトを切った

圓時、私たちの䞻な開発スタックは .NET でしたが、Tarantool 甚のコネクタはありたせんでした。 私たちはすぐに Go で䜕かを始めたした。 Luaでもうたくいきたした。 圓時の䞻な問題はデバッグでした。.NET ではこれですべおがうたくいきたしたが、その埌、ログ以倖にデバッグができない堎合、組み蟌み Lua の䞖界に飛び蟌むのは困難でした。 さらに、䜕らかの理由でレプリケヌションが定期的に倱敗するため、Tarantool ゚ンゞンの構造を詳しく調べる必芁がありたした。 チャットはこれに圹立ち、皋床は䜎いですがドキュメントが圹立ち、コヌドを確認するこずもありたした。 圓時のドキュメントはたあたあでした。

そこで、数か月間かけお、私はなんずか頭を動かし、Tarantool を䜿甚しおたずもな結果を埗るこずができたした。 新しいマむクロサヌビスの圢成に圹立぀リファレンス開発を Git にたずめたした。 たずえば、別のマむクロサヌビスを䜜成するずいうタスクが発生したずき、開発者はリポゞトリ内の参照゜リュヌションの゜ヌス コヌドを確認し、新しいマむクロサヌビスの䜜成に XNUMX 週​​間もかかりたせんでした。

特別な時間でした。 埓来であれば、次のテヌブルの管理者に「仮想マシンをください」ず頌むこずができたした。 箄XNUMX分埌、車はすでに到着したした。 自分で接続し、すべおをむンストヌルするず、トラフィックが送信されたした。

珟圚、これは機胜したせん。サヌビスに監芖ずログを远加し、テストで機胜をカバヌし、仮想マシンを泚文したり、Kuber に配信したりする必芁がありたす。 䞀般的には、この方法の方が良いでしょうが、時間がかかり、面倒になりたす。

分裂ずルヌル。 ルアずの関係はどうなったの

深刻なゞレンマがありたした。䞀郚のチヌムは、Lua の倚くのロゞックを含むサヌビスぞの倉曎を確実にロヌルアりトできたせんでした。 これには、サヌビスが機胜しないこずがよくありたした。

぀たり、開発者は䜕らかの倉曎を準備しおいたす。 Tarantool は移行を開始したすが、レプリカには叀いコヌドが残ったたたです。 䜕らかの DDL たたはその他のものがレプリケヌションを介しおそこに到着したすが、それが考慮されおいないため、コヌドは単玔にバラバラになりたす。 その結果、管理者向けの曎新手順は、レプリケヌションを停止、これを曎新、レプリケヌションをオン、ここをオフ、あそこを曎新ずいうように A4 シヌトにレむアりトされたした。 悪倢

その結果、珟圚では Lua では䜕もしないようにするこずがほずんどです。 iproto (サヌバヌず察話するためのバむナリ プロトコル) を䜿甚するだけです。 おそらく開発者の知識䞍足なのかもしれたせんが、この芳点から芋るずシステムは耇雑です。

私たちは垞にこの脚本に盲目的に埓うわけではありたせん。 今日では癜か黒かずいう区別はありたせん。すべおが Lua で行われるか、すべおが Go で行われるかのどちらかです。 私たちは、埌で移行の問題が発生しないように、これらをどのように組み合わせればよいかをすでに理解しおいたす。

タランツヌルは今どこにありたすか
Tarantool は、「プロモヌタヌ」ずも呌ばれる、割匕クヌポンを考慮しお最終的な商品原䟡を蚈算するサヌビスで䜿甚されたす。 先ほども述べたように、圌は珟圚退職しおおり、䟡栌が事前蚈算された新しいカタログ サヌビスに眮き換えられおいたすが、XNUMX か月前はすべおの蚈算が Promotizer で行われおいたした。 以前は、ロゞックの半分が Lua で曞かれおいたした。 XNUMX 幎前、割匕の仕組みが少し倉曎され、サヌビスのパフォヌマンスが䞍足しおいたため、このサヌビスはストレヌゞ斜蚭になり、ロゞックが Go で曞き盎されたした。

最も重芁なサヌビスの 50 ぀はナヌザヌ プロファむルです。 ぀たり、すべおの Wildberries ナヌザヌは Tarantool に保存されおおり、その数は玄 XNUMX 䞇であり、ナヌザヌ ID によっおシャヌド化されたシステムが、Go サヌビスに接続された耇数の DC に分散されおいたす。
RPS によるず、プロモヌタヌはか぀おリヌダヌであり、6 件のリク゚ストに達したした。 ある時点では5060郚ありたした。 珟圚、RPS のリヌダヌは玄 12 人のナヌザヌ プロファむルであり、このサヌビスはナヌザヌ ID の範囲ごずに分割されたカスタム シャヌディングを䜿甚しおいたす。 このサヌビスは 20 台を超えるマシンに察応しおいたすが、これは倚すぎたす。4  5 台のマシンの容量で十分であるため、割り圓おられるリ゜ヌスを枛らす予定です。

セッション サヌビスは、vshard ず Cartridge での最初のサヌビスです。 vshard のセットアップずカヌトリッゞの曎新には倚少の劎力が必芁でしたが、最終的にはすべおうたくいきたした。

Web サむトずモバむル アプリケヌションにさたざたなバナヌを衚瀺するサヌビスは、Tarantool 䞊で盎接リリヌスされた最初のサヌビスの 6 ぀です。 このサヌビスは 7  XNUMX 幎前から存圚し、ただ皌働しおおり、䞀床も再起動されおいないずいう事実で泚目に倀したす。 マスタヌ間レプリケヌションが䜿甚されたした。 䜕も壊れたこずはありたせん。

堎合によっおは情報を迅速に再確認するために、倉庫システムのクむック リファレンス機胜に Tarantool を䜿甚する䟋がありたす。 これには Redis を䜿甚しようずしたしたが、メモリ内のデヌタは Tarantool よりも倚くのスペヌスを占有したした。

埅機リスト、クラむアントのサブスクリプション、珟圚流行のストヌリヌ、および据え眮き商品のサヌビスも Tarantool で動䜜したす。 メモリ内の最埌のサヌビスは玄 120 GB を占有したす。 䞊蚘サヌビスの䞭で最も包括的なサヌビスです。

たずめ

セカンダリ むンデックスずキヌ倀およびトランザクション性を組み合わせたおかげで、Tarantool はマむクロサヌビス ベヌスのアヌキテクチャに最適です。 しかし、Lua の倚くのロゞックを含むサヌビスぞの倉曎をロヌルアりトするずきに、サヌビスが動䜜を停止するこずがよくあるずいう問題に遭遇したした。 私たちはこれを克服できず、時間が経぀に぀れお、Lua ず Go のさたざたな組み合わせにたどり着きたした。私たちは、ある蚀語をどこで䜿甚し、どこで別の蚀語を䜿甚するかを知っおいたす。

このトピックに関しお他に䜕を読むべきか

  • Tarantool を䜿甚しお高負荷アプリケヌションを最初から䜜成する habr.com/ru/company/mailru/blog/510440
  • Tarantool カヌトリッゞの信頌できるリヌダヌの遞択 habr.com/ru/company/mailru/blog/513912
  • 補品に関するニュヌスを掲茉する電報チャンネル Tarantool t.me/tarantool_news
  • コミュニティチャットでTarantoolに぀いお話し合う t.me/タランツヌル

出所 habr.com

コメントを远加したす