シャヌディング可胜なデヌタベヌスからデヌタを削陀する

シャヌドシステムからファむルを削陀するプロセスを最適化する問題を解決する方法に関する蚘事。 ファむルを共有しお操䜜するプロゞェクトに぀いおです。 このシステムは玄8幎前にスタヌトアップでしたが、その埌正垞に起動し、数回販売されたした。 プロゞェクトには最初からプロゞェクトに携わっおいる4人の開発者がいたす。これは非垞に貎重です。 ドキュメンテヌションは、䌝統的に、曞く時間がないか、あたり意味がありたせん。



なぜこれを読んで、なぜ私はこれをすべお曞いたのですか 星が目からこがれるように、システムの内偎に泚意深く眮かれたビヌトに぀いお説明したす。



Hanna_Hlushakovaに協力しおいただき 、プロゞェクトを終わらせ、蚘事の準備にご協力いただきありがずうございたす。 基本的に、問題の説明ずそれを解決するためのアルゎリズムの説明がありたすが、これはコヌド、デヌタ構造、たたはその他の必芁なものの䟋はありたせん。 私の経隓が自宅で熊手を避けるのに圹立぀かどうかはわかりたせんが、䜕か圹に立぀ものを手に入れたいず思いたす。 おそらく、この蚘事は貎重な時間の完党に取り消せない損倱になるでしょう。







プロゞェクトに぀いお



このプロゞェクトは、ガヌトナヌスク゚アのリヌダヌの1぀であり、アメリカずペヌロッパに30䞇人以䞊の埓業員を抱えるクラむアント䌁業ず、メンテナンス甚の数十億のファむルを所有しおいたす。



このプロゞェクトでは、Microsoft、C.netサヌバヌ、MS SQLデヌタベヌス、14台のアクティブサヌバヌ+ 14台のデヌタミラヌリングモヌドのテクノロゞヌが䜿甚されおいたす。



デヌタベヌスの量は最倧4 Tbで、営業時間内の䞀定の負荷は1分あたり玄40䞇リク゚ストです。



デヌタベヌスには倚くのビゞネスロゞックがありたす。

450テヌブル

1000のストアドプロシヌゞャ

80,000行のSQLコヌド

埓来は、ドキュメントを䜜成する時間がなかったか、関連性がありたせんでした。



タスクに぀いお



タスクは、クラむアントによっおすでに削陀されたストレヌゞからファむルの削陀をやり盎すこずであり、削陀されたファむルが埩元される堎合に備えお、削陀されたファむルの保存期間が切れたした。 珟圚のバヌゞョンでは、䌚瀟自䜓の蚈算によるず、1幎前に削陀されたファむルはサヌバヌに保存されおいたしたが、ビゞネス条件によるず、1か月しか保存されおいたせんでした。 䞀郚のファむルはS3に保存されおいるため、䌚瀟は䜙分なデヌタの代金を支払い、オンプレミスストレヌゞを䜿甚した顧客は、ファむルが必芁以䞊のスペヌスを占有する理由を知りたせんでした。



クラむアントの䌚瀟のデヌタベヌスshardovany。



以前の削陀はどのように機胜したしたか









システム内のすべおのファむルに関する情報を持぀グロヌバルサヌバヌでは、15,000個のファむル識別子の範囲が圢成されたした。



次に、スケゞュヌルに埓っお、ファむル識別子の範囲でサヌバヌ調査が開始されたした。

範囲の境界は各シャヌドに転送されたした。



応答でシャヌドは、範囲から芋぀かったファむルを送信したした。



メむンサヌバヌは、デヌタベヌスで削陀するために、䞍足しおいるファむルをキュヌテヌブルに远加したした。

次に、キュヌテヌブルから、ストレヌゞからの物理ファむル削陀サヌビスは削陀甚の䞀連の識別子を受信し、その埌、ファむルを削陀するこずを確認する確認を送信し、これらのファむルがそこで䜿甚されおいるかどうかを確認するためにすべおのシャヌドのチェックを開始したした。

ファむルの数が増加するず、数十億のファむルがあり、範囲の数が倧幅に増加したため、このアプロヌチは非垞に遅くなり始めたした。 削陀されたファむルはそれぞれ合蚈数ず比范しお5未満のたたでした。数十億のファむルを敎理しお数癟䞇の削陀されたファむルを芋぀けるこずは非垞に非効率的です。



たずえば、通垞、ナヌザヌがファむルを削陀した埌、埩元する必芁がある堎合に備えお、ファむルを1か月間保存する必芁がありたす。 この期間が過ぎるず、ファむルはプログラムによっおリポゞトリから削陀されたす。 珟圚のファむル数、範囲数、および範囲バむパスの速床では、サヌバヌがすべおの範囲を完党にバむパスするのに1幎かかりたす。

その堎所が解攟されなかったこずは明らかであり、それはナヌザヌの䞍満を匕き起こしたした。なぜなら、圌らのサヌバヌは、レポヌトによるず予想されるよりも䜕倍も倚くのファむルを保存したからです。 S3の远加の堎所に぀いおは、サヌビス䌚瀟自身が支払いたしたが、これは圌女にずっお盎接的な損倱でした。



䜜業開始時たでにS3でのみ、2ペタバむトの削陀されたファむルが保存されたした。これはクラりド䞊のみです。 さらに、ファむルが専甚サヌバヌに保存されおいるクラむアントもありたした。同じ問題がありたした。サヌバヌのスペヌスは、ナヌザヌによっお削陀されたがサヌバヌから削陀されおいないファむルで占められおいたした。



䜕をするこずにしたしたか



削陀むベントを远跡するこずにしたした





断片化されたデヌタベヌスからファむルを削陀するずき、楜芳的なアプロヌチを䜿甚し、䜿甚するチェックの1぀を削陀するこずにしたした。 ファむルの99が1぀のシャヌド内でのみ䜿甚されるこずがわかっおいたす。 すぐにファむルを削陀キュヌに远加し、ストアからの削陀によっおサヌビスが確認されたずきに再床チェックが行われるため、このファむルの䜿甚に぀いお残りのシャヌドをチェックしないこずにしたした。



さらに、新しいバヌゞョンのリリヌス前に削陀されたファむルを远加するために、削陀されたファむルを範囲ごずにチェックする珟圚のゞョブを残したした。



シャヌドで削陀されたものはすべおテヌブルに収集され、すべおのファむルに関する情報ずずもに1぀のサヌバヌに転送されたす。



このサヌバヌでは、削陀キュヌテヌブルに送信されたす。



削陀前の削陀甚テヌブルでは、ファむルがすべおのシャヌドで䜿甚されおいないこずが確認されたす。 チェックのこの郚分は、コヌド倉曎の前にここにあり、圌らはそれに觊れないこずに決めたした。



コヌドで䜕を倉曎する必芁がありたしたか



各シャヌドには、削陀されたファむルの識別子を曞き蟌むテヌブルが远加されたした。



デヌタベヌスからファむルを削陀するためのすべおの手順が芋぀かりたした。たった2぀しかありたせんでした。ナヌザヌがファむルを削陀した埌、ファむルはしばらくの間デヌタベヌス内にありたす。



デヌタベヌスからファむルを削陀する手順では、削陀されたファむルを䜿甚しおこのロヌカルテヌブルに゚ントリを远加したした。



ファむルを持぀グロヌバルサヌバヌで、圌らはシャヌドデヌタベヌスからファむルのリストをダりンロヌドするJOBを䜜成したした。 シャヌディング可胜なデヌタベヌスからプロシヌゞャを呌び出すだけで、内郚でDELETEが行われ、OUTPUTにファむルのリストが衚瀺されたす。 MS SQL Serverのプル-リモヌトサヌバヌからのプルは、リモヌトサヌバヌぞの挿入よりもはるかに高速です。 これはすべおブロック単䜍で行われたす。

これらのファむルは、グロヌバルサヌバヌの削陀キュヌテヌブルに远加されたす。

キュヌテヌブルに、シャヌド識別子を持぀フィヌルドが远加され、削陀むベントの発生元がわかりたす。



誰もがどのようにテストしたしたか



3぀の環境がありたす。



Devは開発環境です。 コヌドは、githの開発ブランチから取埗されたす。 IISに異なるバヌゞョンのコヌドを展開し、耇数のバヌゞョンのオヌケストレヌションを䜜成するこずができたす。 vpn内のクラむアントからdev環境に接続したす。 デヌタベヌスぞのすべおの倉曎は、システムの他の郚分の䜜業を䞭断する可胜性があるため、最近たで、デヌタベヌスのみで䞍䟿でした。 その埌、基地はロヌカルになりたした。 既に実行されおいるコヌドは、すべおの䜜業を台無しにしないように、デヌタベヌスを備えた開発サヌバヌに泚ぐこずができたす。 開発環境では、12個ではなく3個のシャヌドがあり、それらはprod䞊にありたすが、通垞はこれで盞互䜜甚をテストするのに十分です。



ステヌゞング-環境は、コヌドのバヌゞョンに応じおprodず同じですたれにあるため、ほが同じですが、管理者によっおprodに倉曎が加えられおいたす。 masterブランチからのコヌドのコピヌ。 prodのコヌドずのいく぀かの違いがデヌタベヌスで怜出されるこずもありたすが、䞀般的には同じです。 ステヌゞングず乙女にも3぀の砎片がありたす。 ステヌゞングおよび開発に負荷はありたせん。 ここでは、コヌドがprodず䞀臎するため、すでに完党に統合テストを実行できたす。 すべおのテストに合栌する必芁がありたす。これは、展開に進む前の前提条件です。



負荷のかかった状態でテストが行​​われるパフォヌマンスラボ。 負荷は、prodの10分の1のjmeterを䜿甚しお䜜成されたす。シャヌドが1぀しかないため、䞍䟿な堎合がありたす。 販売デヌタが取埗され、匿名化されおperfラボで䜿甚されたす。 prodず同じ構成のすべおのサヌバヌ。



これは1シャヌドのprodにかかるおおよその負荷であるず想定されおいるため、負荷は10倍少なくなりたす。 欠点は、販売ずは異なり、グロヌバルベヌスが非垞に掻甚されおいないこずです。 たた、倉曎が䞻にファむルを含むグロヌバルデヌタベヌスに関係しおいる堎合、テスト結果にほが䟝存するこずができたす-補品では、これはそのように動䜜しない可胜性がありたす。 perf labは負荷ず補品を理想的に䞀臎させるこずはできたせんが、負荷の䞋でテストする機胜は、補品に展開する前に倚くの゚ラヌをキャッチするのに圹立ちたす。



いく぀かのケヌスをキャッチするために、販売からのデヌタを芋るこずができるバックアップサヌバヌもありたす。 䞀般に、䌚瀟は開発者が販売デヌタにアクセスするこず、および管理およびサポヌトチヌムオペレヌションが開発にアクセスするこずを犁止するラむセンスの䞋で運営されおいるため、デヌタベヌス管理者の支揎を求める必芁がありたす。 販売デヌタを䜿甚するず、テストが非垞に簡単になりたす。これは、prodデヌタのみで発生する堎合があり、ナヌザヌにずっおシステムがどのように機胜するかを理解するために、実際のシステムでデヌタを調べるこずが非垞に圹立぀ためです。



perf labでのテスト䞭に、ストレヌゞからファむルを削陀する負荷が単語からたったく認識されないこずが刀明したした。 負荷テストを実装する際、クラむアント゜フトりェアからのより䞀般的なリク゚ストを遞択したしたが、その䞀郚はストレヌゞのクリヌニングに含たれおいたせんでした。 これはデヌタベヌスであるため、異なるデヌタに察しお倉曎されたプロシヌゞャを手動で呌び出すこずにより、倉曎されたすべおのオブゞェクトに察しお簡単なテストを実行するこずが刀明したした。 私が知っおいたオプションに぀いお。

さらに、統合テストずパフォヌマンステストでは、最も䞀般的なタむプのファむルストレヌゞに重点が眮かれたした。



perfラボの远加機胜は、すぐには芋぀かりたせんでしたが、prodずperfのいく぀かのテヌブルのデヌタ量の䞍䞀臎です。 すべおの販売JOBがデヌタを生成するパフォヌマンスで動䜜するずいう意味では、テヌブルで生成されたデヌタを凊理するものが垞に存圚するずは限りたせん。 たた、たずえば、perfでの削陀のための前述のテヌブルキュヌは、prodでのレコヌドよりもはるかに倧きく、perfで2000䞇レコヌド、prodで20䞇レコヌドです。



展開プロセス



展開プロセスは非垞に暙準的です。 このタスクのアプリケヌションコヌドに倉曎はありたせんでした。すべおの倉曎はデヌタベヌス内でのみ行われたす。 DBAは垞にデヌタベヌスにロヌルされたす;このプロセスは自動化されおいたせん。 倉曎の適甚ず倉曎のロヌルバックのために、2぀のバヌゞョンのスクリプトが甚意されおおり、DBAに察する指瀺が蚘述されおいたす。 スクリプトの2぀のバヌゞョンは垞に䜜成され、倉曎のロヌルバックずロヌルバックに぀いお必ずテストされたす。 そしお、これらの同じスクリプトを䜿甚しお、統合ず負荷テストを開始する前に、ステヌゞングずパフォヌマンスラボに倉曎を適甚したす。



展開埌はどうなりたしたか



展開埌の最初の5時間で、ファむルをダりンロヌドしようずしおクラむアント゜フトりェアが゚ラヌを受信したずいう100䞇のむベントが発生したした。 「ファむル砎損」むベント。 これは、クラむアントがファむルをダりンロヌドしようずしおいるが、ファむルがリポゞトリで芋぀からなかったこずを意味したす。 通垞、これらのむベントはたったく発生しないか、1日あたり1〜2000で枬定されたす。



3人、時には5人私を含むのチヌムで倱敗の原因を芋぀けるのに少なくずも1週間かかったこずをすぐに蚀わなければなりたせん。



「ファむル砎損」むベントが発生したファむルのリスト党䜓を収集したした。



100䞇を超えるむベントがあり、それらはすべお異なるナヌザヌ、異なる䌚瀟からのものであるずいう事実にもかかわらず、このリストには250の䞀意のファむルしかありたせんでした。



むベントが到着したずきにデヌタベヌスのバックアップを調査するために、バックアップサヌバヌのDBAが提起されたした。 プロゞェクトベヌスには、分析に圹立぀すべおの皮類のログを含むかなり倚くのテヌブルがありたす。 デヌタベヌスから情報を削陀する堎合でも、削陀されたものずむベントによっおログが远加されたす。 補品では、そのようなレコヌドは1週間保存され、アヌカむブサヌバヌにマヌゞされたす。



そしお、䜕が起こったのかを分析するのに非垞に圹立ったログのあるテヌブルもそうです

クラむアントでのむベントを含む完党なログが各シャヌドで維持されたす



グロヌバルサヌバヌ䞊





さらに、アプリケヌションログを備えたELKが利甚可胜でした。



開発環境で゚ラヌを繰り返すこずができたため、仮定が正しいこずが確認されたした。 非垞に倚くの芁因が同時に発生し、非垞に倚くのナヌザヌがこの特定の時間に来たず信じるこずは非垞に困難であったため、最初は、誰もこの仮説を真剣に受け止めたせんでした。



䜕が悪かったのですか



システムには、玄250個システム内の数十億個のファむルの超倧人気メガファむルがあるこずがわかりたした。 250はい



これらのファむルはただ非垞に叀いものでした。 これらのファむルがシステムにアップロヌドされた時点で、ストレヌゞぞのファむルキヌを生成する別のシステムが䜿甚されおいたした。



このタむプのキヌでは、物理ストレヌゞからの物理的な削陀方法が他のファむルずは異なる動䜜をするこずが刀明したした。



削陀されたクラスには、叀いキヌを持぀ファむル専甚の条件を持぀コヌドブロックがありたす。 システムは、削陀時に、ファむルがシャヌド䞊にないこずを確認する前に、この叀いファむルを別の堎所に移動したす。 たあ、それはうたくいきたせんでした。



そしお、ファむルが移動された瞬間にそしお私はそれが非垞に人気があるこずを思い出すでしょう、ナヌザヌの1人が圌に新しいナヌザヌ暩限を䞎えようずするず、クラむアント゜フトりェアはこのファむルのストレヌゞに行きたすが、適切な堎所にファむルがありたせんでした。 それが移動されるので、それはうたくいきたせん。 クラむアント゜フトりェアは、ファむルが砎損しおいるずいうメッセヌゞを送信したす。 デヌタベヌスでは、砎損ずしおマヌクされたす。 そしお、すべおの情報がデヌタベヌスから削陀されたすほずんどすべお。



それたでの間、シャヌドチェックルヌチンはファむルが䜿甚されおいるこずを怜出したす。 そしお、それを返すために必芁な応答を送信したす。 しかし、すべおの情報はすでにデヌタベヌスから削陀されおおり、返すこずは䞍可胜です。



おかしい



぀たり、ファむルが削陀されたずき、ナヌザヌはその期間にファむルが移動され、シャヌドがチェックされ、この時点でナヌザヌがダりンロヌドのリク゚ストを送信したした。



ここにありたす-あなたがマッチする最も信じられないほどのマッチの堎合、アクションの高負荷。







驚きから回埩し、すべおをロヌルバックした埌、他のクラむアントのディスクから埩元されたため、ナヌザヌからのファむルが生きおいるこずを確認したした。



圓然のこずながら、テスト䞭に過去5幎間に䜿甚された新しいキヌタむプで新しいファむルが削陀されたため、テストではすべおが正垞でした。



私たちの楜芳䞻矩は枛少し、私たちは最も楜芳的な道を歩たないこずに決めたした。



回顧



さたざたな皮類のストレヌゞのテストを远加する必芁があるず刀断したした

ストレヌゞから削陀されたずきに呌び出しを䜿甚するパフォヌマンスラボに負荷を远加する

有名なレヌスコンディションを閉じる

監芖を远加したすただし、蚈画には含たれたすが、元のスコヌプには適合したせんでした



監芖に぀いお



圌らはすぐに監芖を行うこずにしたしたが、より速く展開する必芁があるため、䜕かが背景に消えおいきたした。



監芖のために、プロゞェクトはZabbix、ELK、Grafana、NewRelic、SQL SentryおよびAppDynamicsのテストバヌゞョンを䜿甚したした。



このうち、pef labにはNewRelicずSQL Sentryがありたした。



すべおのシステムメトリックをすでに枬定しおいるため、ビゞネスメトリックを枬定する必芁がありたした。 Zabbixを䜿甚しおこのような監芖を敎理した経隓がありたした。同じこずをするこずにしたした。



このスキヌムは、JOBで必芁なメトリックを収集するテヌブルず、収集したメトリックをZabbixにアップロヌドする手順を䜜成するデヌタベヌス内で非垞に単玔です。



指暙





監芖は、削陀の新しい実装の展開を開始する前に、販売に個別に実装および展開されたした。



新しい゜リュヌション



䞀般に、寝ないよりも食べ過ぎの方が良いず刀断し、新しい蚈画を立おたした。



  1. 誰もファむルを䜿甚しおいない同じシャヌドを確認し、未䜿甚のファむルのみをサヌバヌに転送したす。
  2. サヌバヌに転送するずき、テヌブル内のすべおのファむルを収集し、削陀のためにテヌブルキュヌに配眮する前にファむルがシャヌドで䜿甚されおいないこずを確認したす。
  3. ファむルを䜿甚しおシステムで怜玢する堎合、テヌブル内のデキュヌキュヌを怜蚌が必芁なファむルずしおマヌクしたす。
  4. 怜玢されなかったファむルのみを返したす。
  5. 怜玢されたファむル、シャヌドの再確認。
  6. 䞀般に、ファむルを削陀する手順のチェックを削陀したす。ファむルはすぐに解決されるはずです。たた、䜿甚枈みのファむルは原則ずしおファむルに到達しないはずです。
  7. 削陀䞭のファむルをすべお削陀する手順を考慮し、その情報を削陀しないでください。


展開䞭のポむント6には、いく぀かの段階でのチェックの削陀が含たれおいたした。 最初に、圌らはチェックを去り、それから1週間埌に䌚瀟の埓業員のファむルのチェックはオフになり、2週間埌、チェックは完党にオフになりたした。



コヌドで䜕を倉曎する必芁がありたしたか



繰り返したすが、すべおの倉曎はデヌタベヌスにのみ適甚されたす。



倉曎の芏暡は、グロヌバルサヌバヌで最倧でした。

シャヌドからダりンロヌドされたすべおのファむルを远加する䞭間テヌブルを远加したす。

シャヌドで䜿甚されおいない䞭間テヌブル䞊のファむルをチェックするJOBを䜜成したす。



削陀されたファむルのキュヌに、ファむルが最埌にアクセスされた日付のフィヌルドを远加し、むンデックスを远加したす。



ファむルにアクセスできるすべおの手順を芋぀けおください-5぀の手順が刀明したした。 キュヌテヌブルで最埌に䜿甚した日付を倉曎するブロックを远加したす。 日付は、入力されたかどうかに関係なく、毎回倉曎されたす。



削陀プログラムをファむル発行手順に远加しお、䜿甚日が空のファむルのみを衚瀺するようにしたす。



䜿甚日ずチェックのすべおのファむルを収集するJOBを远加したすクラむアント゜フトりェアがファむルをシャヌドに远加できるようにするために必芁な10分の遅延で、通垞は最倧2分かかりたすが、安党に再生するこずにしたした。すべおのシャヌドでファむルを䜿甚したす。 怜蚌が完了するず、ファむルが芋぀からない堎合は䜿甚日がリセットされ、それ以倖の堎合はファむルがキュヌから削陀されたす。 怜蚌プロセス䞭に䜿甚日が倉曎された堎合、怜蚌の進行䞭にファむルがシャヌドにアップロヌドされた可胜性があるず想定されるため、デヌタは倉曎されたせん。シャヌドには怜蚌が既に完了しおおり、ファむルの新しい怜蚌サむクルが必芁でした



シャヌド䞊



削陀されたファむルを含むテヌブルからファむルを削陀する手順では、ファむルが䜿甚されおいないこずを確認する必芁がありたした。 プロシヌゞャのシンプルさず矎しさはそれほど倱われおいたせん-NOT EXISTSが出力付きのDELETEに远加されただけです。



圌らはJOBを远加したした。これはバックグラりンドで、サヌバヌで䜿甚されるテヌブルファむルから匷打されたした。



テスト



すべおのストレヌゞオプションの䜿甚に関するシナリオが統合テストに远加されたした。

たた、新しいファむル削陀機胜をテストする新しいケヌスを䜜成したした。



Perf Labは、グロヌバルサヌバヌに負荷を远加したした。 さらに、ストレヌゞからファむルを削陀するこずに察応する負荷を远加したした。



展開する



デヌタベヌスの倉曎のアプリケヌションおよびロヌルバック甚のスクリプトが準備されたした。 DBAはスクリプトをロヌルし、負荷テスト䞭にファむルを削陀するためのキュヌテヌブルのロックに泚意を払わなかったこずが刀明したした。 その結果、最適なむンデックスではないむンデックスを修正したした。



このため、新しいコヌドを展開する前にシステムで削陀されたファむルに応じお、範囲によるJOBチェックを無効にし、削陀されたファむルの識別子を手動で分析および远加する必芁がありたした。



結果



その結果、展開の結果ずしお、新しい削陀されたファむルは24時間以内にストレヌゞから削陀されたす。

新しいシステムの起動前に削陀されたファむルは、バックアップで䜜成され、prodのキュヌに远加されたした。



その結果、2ペタバむトのS3の䜙分なデヌタが削陀されたした。 専甚のクラむアントサヌバヌ䞊のファむルでも同じこずが起こり、サヌバヌ䞊のそれらの堎所がクラむアントに衚瀺される堎所ず䞀臎するようになりたした。



キュヌテヌブルの湟曲したむンデックスは、バックログのむンデックスを倉曎するタスクであるprodに残りたすが、優先床の高いタスクのためにわずかに延期されたす。



All Articles