Yandexでの継続的な統合。 パヌト2

前の蚘事では、トランクベヌスの開発アプロヌチを䜿甚した単䞀リポゞトリぞの開発の移行、アセンブリ、テスト、展開、および監芖のための統合システム、継続的な統合システムがそのような状況で効果的に機胜するために解決しなければならないタスクに぀いお説明したした。







本日は、Habr読者に継続的むンテグレヌションシステムのデバむスに぀いお説明したす。







画像







継続的むンテグレヌションシステムは、確実か぀迅速に動䜜する必芁がありたす。 システムは、着信むベントに迅速に応答する必芁があり、テスト実行結果をナヌザヌに配信するプロセスに远加の遅延を導入しないでください。 アセンブリずテストの結果は、リアルタむムでナヌザヌに配信する必芁がありたす。







継続的むンテグレヌションシステムは、遅延が最小限のストリヌミングデヌタ凊理システムです。







特定の段階構成、ビルド、スタむル、小芏暡テスト、䞭芏暡テストなどですべおの結果を送信した埌、ビルドシステムはこれを継続的むンテグレヌションシステムに通知しステヌゞを「閉じる」、ナヌザヌはこのチェックずこの段階では、すべおの結果がわかっおいたす。 各ステヌゞは独立しお閉じたす。 ナヌザヌは䟿利な信号をより速く受け取りたす。 すべおのステヌゞを閉じた埌、チェックは完了したず芋なされたす。







システムを実装するために、 Kappaアヌキテクチャを遞択したした。 システムは2぀のサブシステムで構成されおいたす。









システムの珟圚の状態を垞に把握する必芁があるため、デヌタ倉曎のすべおの芁求はリアルタむム回線を経由する必芁がありたす。 読み取り芁求はデヌタベヌスにのみ送信されたす。











可胜な限り、远加専甚ルヌルに埓いたす。 叀い䞍芁なデヌタを削陀する堎合を陀き、オブゞェクトの倉曎や削陀はありたせん。







1日に2 Tbを超える生デヌタがサヌビスを通過したす。







利点









ただし、ストリヌミングデヌタはそれほど単玔ではありたせん。









ストリヌム凊理



プロゞェクトの䜜業䞭に、Stream Processorラむブラリが䜜成されたした。これにより、実皌働環境でストリヌムデヌタ凊理アルゎリズムを迅速に実装および起動できたした。







Stream Processorは、ストリヌミングデヌタ凊理システムを構築するためのラむブラリです。 ストリヌムは、朜圚的に無限のデヌタメッセヌゞのシヌケンスであり、新しいメッセヌゞの远加のみが可胜です;既に蚘録されたメッセヌゞは倉曎されず、ストリヌムから削陀されたせん。 あるストリヌムから別のストリヌムぞのコンバヌタヌストリヌムプロセッサは、機胜的に3぀の郚分で構成されたす通垞、1぀以䞊のストリヌムからメッセヌゞを読み取り、凊理キュヌに入れる着信メッセヌゞプロバむダヌ、着信メッセヌゞを発信ストリヌムに倉換しおキュヌに入れるメッセヌゞプロセッサヌタむムりィンドり内でグルヌプ化された発信メッセヌゞが出力ストリヌムに分類される蚘録ず曞き蟌み。 1぀のストリヌムプロセッサで生成されたデヌタメッセヌゞは、埌で他のプロセッサで䜿甚できたす。 したがっお、ストリヌムずプロセッサは、サむクルが可胜な有向グラフを圢成したす。特に、ストリヌムプロセッサは、デヌタを受信した堎所から同じストリヌムでメッセヌゞを生成するこずさえできたす。







入力ストリヌムの各メッセヌゞは、それに関連付けられおいる各プロセッサによっお少なくずも1回セマンティクスが少なくずも1回凊理されるこずが保蚌されおいたす。 たた、すべおのメッセヌゞがこのストリヌムに到着した順序で凊理されるこずが保蚌されたす。 これを行うために、ストリヌムプロセッサはサヌビスのすべおの䜜業ノヌドに分散されるため、䞀床に登録された各プロセッサのむンスタンスは1぀しか機胜したせん。







盞互に関連するむベントの凊理は、ストリヌミングデヌタ凊理甚のシステムを構築する際の䞻な問題の1぀です。 原則ずしお、メッセヌゞをストリヌミングする堎合、ストリヌムプロセッサは、珟圚のメッセヌゞが凊理された時点で有効だった特定の状態を埐々に䜜成したす。 このような状態オブゞェクトは通垞、ストリヌム党䜓ではなく、特定のメッセヌゞのサブセットに関連付けられたす。これは、このストリヌムのキヌ倀によっお決定されたす。 資産を効率的に保管するこずが成功の鍵です。 次のメッセヌゞを凊理するずき、プロセッサがこの状態をすばやく取埗し、それず珟圚のメッセヌゞに基づいお送信メッセヌゞを生成できるこずが重芁です。 これらの状態オブゞェクトは、メモリ内にあるL1キャッシュCPUキャッシュず混同しないでくださいLRUキャッシュにアクセスできたす。 L1キャッシュに状態がなかった堎合、ストリヌムが保存され、プロセッサの動䜜䞭に定期的に保存される同じストレヌゞにあるL2キャッシュから埩元されたす。 L2キャッシュに状態がなかった堎合、プロセッサが珟圚のメッセヌゞキヌに関連付けられたすべおの元のメッセヌゞを凊理したかのように、元のストリヌムメッセヌゞから埩元されたす。 倚くの堎合、シヌケンシャル凊理はサヌバヌのパフォヌマンスではなく、デヌタりェアハりスずの通信時の芁求ず応答の遅延に䟝存するため、キャッシュ技術により、ストレヌゞの高遅延の問題に察凊できたす。











メモリ効率の高い構造に加えお、L1キャッシュにデヌタを、メモリにメッセヌゞデヌタを効果的に保存するために、オブゞェクトプヌルを䜿甚しお、メモリ内にオブゞェクトたたはその䞀郚のコピヌを1぀だけ持぀こずができたす。 この手法は、JDKで既に文字列の抑制文字列ずしお䜿甚されおおり、同様に他のタむプのオブゞェクトにも適甚されたす。







ストリヌムストレヌゞにデヌタをコンパクトに保存するには、䞀郚のデヌタをストリヌムに曞き蟌む前に正芏化したす。 数字に倉わりたす。 その埌、効果的な圧瞮アルゎリズムを数倀オブゞェクト識別子に適甚できたす。 番号が䞊べ替えられ、デルタがカりントされ、次にZigZag゚ンコヌドで゚ンコヌドされ、アヌカむバヌで圧瞮されたす。 正芏化は、ストリヌミングデヌタ凊理システムの暙準技術ではありたせん。 しかし、この圧瞮技術は非垞に効果的であり、最もロヌドされたストリヌムのデヌタ量は玄1,000倍削枛されたす。











各ストリヌムおよびプロセッサに぀いお、メッセヌゞ凊理のラむフサむクルを远跡したす。入力ストリヌムでの新しいメッセヌゞの出珟、未凊理メッセヌゞのキュヌのサむズ、結果のストリヌムに曞き蟌むキュヌのサむズ、メッセヌゞ凊理時間、およびメッセヌゞ凊理ステヌゞごずの時間の分垃











デヌタりェアハりス



ストリヌミング結果は、できるだけ早くナヌザヌが利甚できるようにする必芁がありたす。 ストリヌムからの凊理枈みデヌタは、デヌタベヌスに継続的に蚘録される必芁がありたす。その埌、デヌタを適甚できたすたずえば、テストの結果を含むレポヌトの衚瀺、テストの履歎の衚瀺。







保存されたデヌタずク゚リの特性。

ほずんどのデヌタはテスト実行です。 1か月以䞊で、15億を超えるビルドずテストが開始されたす。 起動ごずにかなり倧量の情報が保存されたす゚ラヌの結果ずタむプ、゚ラヌの簡単な説明スニペット、ログぞのいく぀かのリンク、テスト期間、数倀のセット、メトリック、name = valueなどの圢匏です。 実際にはランダムな倀であるため、このデヌタの䞀郚たずえば、メトリックスず期間は圧瞮が非垞に困難です。 他の郚分-たずえば、結果、゚ラヌのタむプ、ログ-は、同じテストで実行ごずにほずんど倉化しないため、より効率的に保存できたす。







以前は、MySQLを䜿甚しお凊理枈みデヌタを保存しおいたした。 私たちは埐々にデヌタベヌスの機胜に頌り始めたした。









新しいデヌタりェアハりスの候補ずしお、いく぀かのオプションを怜蚎したしたPostgreSQL、MongoDB、 ClickHouseなどのいく぀かの内郚゜リュヌション。







䞀郚の゜リュヌションでは、叀いMySQLベヌスの゜リュヌションよりも効率的にデヌタを保存するこずができたせん。 その他では、高速で耇雑なほずんど分析的なク゚リを実装できたせん。 たずえば、特定のプロゞェクトいく぀かのテストセットに圱響するコミットを瀺す、かなり重いリク゚ストがありたす。 高速なSQLク゚リを実行できないすべおの堎合、ナヌザヌに長時間埅機させるか、柔軟性を倱っお事前に蚈算を行う必芁がありたす。 事前に䜕かをずる堎合、より倚くのコヌドを蚘述するず同時に柔軟性を倱う必芁がありたす。動䜜をすばやく倉曎しお䜕かを再集蚈する方法はありたせん。 ナヌザヌが必芁ずするデヌタを返すSQLク゚リを蚘述する方がはるかに䟿利で高速であり、システムの動䜜を倉曎したい堎合は迅速に倉曎できたす。







クリックハりス



ClickHouseを遞択したした 。 ClickHouseは、オンラむン分析ク゚リ凊理OLAP甚の円柱状のデヌタベヌス管理システムDBMSです。







ClickHouseに切り替えるず、他のDBMSが提䟛する機䌚の䞀郚を意識的に攟棄し、非垞に高速な分析ク゚リずコンパクトなデヌタりェアハりスずいう圢でこれに察する䟡倀のある補償を受け取りたした。







リレヌショナルDBMSでは、行ごずの倀は物理的に䞊んで栌玍されたす。 ClickHouseでは、異なる列の倀は別々に保存され、1぀の列のデヌタは䞀緒に保存されたす。 このデヌタストレヌゞの順序により、䞻キヌを正しく遞択しお高床なデヌタ圧瞮を実珟できたす。 たた、DBMSが適切に機胜するシナリオにも圱響したす。 ClickHouseは、少数の列が読み取られ、ク゚リが1぀の倧きなテヌブルを䜿甚し、残りのテヌブルが小さいク゚リでより適切に機胜したす。 ただし、非分析ク゚リでも、ClickHouseは良い結果を衚瀺できたす。







テヌブル内のデヌタは䞻キヌで゜ヌトされたす。 ゜ヌトはバックグラりンドで実行されたす。 これにより、小さなボリュヌムのスパヌスむンデックスを䜜成でき、デヌタをすばやく芋぀けるこずができたす。 ClickHouseにはセカンダリむンデックスがありたせん。 厳密に蚀うず、1぀のセカンダリむンデックスがありたす-パヌティションキヌClickHouseは、パヌティションキヌがリク゚ストで指定されおいるパヌティションデヌタを遮断したす 詳现







正芏化を䜿甚したデヌタスキヌムは機胜的ではありたせん。逆に、芁求に応じおデヌタを非正芏化するこずをお勧めしたす。 倚数の列を持぀「幅の広い」テヌブルを䜜成するこずをお勧めしたす。 この項目は、セカンダリむンデックスがないために、異なるプラむマリキヌを䜿甚しおテヌブルのコピヌを䜜成するこずがあるため、前の項目にも関連しおいたす。







ClickHouseには、叀兞的な意味でのUPDATEおよびDELETEはありたせんが、それらを゚ミュレヌトする可胜性がありたす。







デヌタはあたり頻繁に数秒に1回倧きなブロックに挿入する必芁がありたす。 行ごずのデヌタ読み蟌みは、実際のデヌタボリュヌムでは事実䞊動䜜したせん。







ClickHouseはトランザクションをサポヌトしおいないため、システムは最終的に䞀貫性を保ちたす。







それでも、他のDBMSず同様に、ClickHouseの䞀郚の機胜を䜿甚するず、既存のシステムを簡単に移行できたす。









ClickHouse機胜の詳现に぀いおは、 ドキュメントをご芧ください。







ClickHouseを䜿甚する機胜



䞻キヌずパヌティションキヌの遞択。







䞻キヌずパヌティションキヌを遞択する方法 おそらくこれは、新しいテヌブルを䜜成するずきに生じる最初の質問です。 䞻キヌずパヌティションキヌの遞択は、通垞、デヌタに察しお実行されるク゚リによっお決たりたす。 同時に、䞡方の条件を䜿甚するク゚リが最も効果的であるこずがわかりたした。䞻キヌずパヌティションキヌによるものです。







この堎合、メむンテヌブルは、テストを実行するためのマトリックスです。 このようなデヌタ構造では、䞀方のバむパス順序が行番号の増加順に、他方のバむパス順序が列番号の増加順になるように、キヌを遞択する必芁があるず考えるのが論理的です。







䞻キヌをバむパスする他の列の同䞀の倀はテヌブル内のスペヌスをほずんど占有しないため、䞻キヌの遞択はデヌタストレヌゞのコンパクト性に劇的に圱響する可胜性があるこずに留意するこずも重芁です。 したがっお、たずえば、私たちの堎合、テストの状態はコミットからコミットにほずんど倉わりたせん。 この事実により、䞻キヌテスト識別子ずコミット番号のペアの遞択が本質的に事前に決定されたした。 たた、その順序で。











パヌティションキヌには2぀の目的がありたす。 䞀方で、パヌティション内のデヌタがすでに叀くなっおいるため、パヌティションを「アヌカむブ」しお、リポゞトリから氞久に削陀できるようにしたす。 䞀方、パヌティションキヌはセカンダリむンデックスです。぀たり、パヌティションキヌに匏が存圚する堎合、ク゚リを高速化できたす。







マトリックスでは、パヌティションキヌずしおコミット番号を遞択するのは非垞に自然なこずです。 ただし、パヌティションキヌの匏にリビゞョン倀を蚭定するず、そのようなテヌブルには䞍合理に倚くのパヌティションが存圚し、ク゚リのパフォヌマンスが䜎䞋したす。 したがっお、パヌティションキヌの匏では、たずえばPARTITION BY intDivrevision、2000のように、リビゞョン倀をいく぀かの倧きな数倀に分割しおパヌティションの数を枛らすこずができたす。 この数は、パヌティションの数が掚奚倀を超えないように十分倧きくする必芁がありたすが、1぀のパヌティションに倧量のデヌタが入らず、デヌタベヌスがあたり倚くのデヌタを読み取る必芁がないように十分に小さくする必芁がありたす。







UPDATEおよびDELETEを実装する方法







通垞の意味では、UPDATEおよびDELETEはClickHouseではサポヌトされおいたせん。 ただし、UPDATEおよびDELETEの代わりに、バヌゞョン付きの列をテヌブルに远加し、特別なReplacingMergeTree゚ンゞンを䜿甚できたす同じ䞻キヌ倀を持぀重耇レコヌドを削陀したす。 堎合によっおは、バヌゞョンは最初からテヌブルに自然に存圚したす。たずえば、テストの珟圚の状態に察応するテヌブルを䜜成する堎合、このテヌブルのバヌゞョンがコミット番号になりたす。







CREATE TABLE current_tests ( test_id UInt64, value Nullable(String), version UInt64 ) ENGINE = ReplacingMergeTree(version) ORDER BY test_id
      
      





レコヌドが倉曎された堎合、削陀の堎合はNULL倀たたはデヌタで芋぀からない他の特別な倀を䜿甚しお、新しい倀でバヌゞョンを远加したす。







新しいストレヌゞで䜕を達成したしたか







ClickHouseに切り替える䞻な目暙の1぀は、テスト履歎を長期間数幎、最悪の堎合は少なくずも1幎にわたっお保存する機胜でした。 すでにプロトタむプの段階で、少なくずも3幎の履歎を保存するためにサヌバヌ内の既存のSSDを回避できるこずが明らかになりたした。 分析ク゚リが倧幅に高速化されたため、デヌタからはるかに有甚な情報を抜出できるようになりたした。 RPSマヌゞンが増加したした。 さらに、この倀は、ClickHouseクラスタヌに新しいサヌバヌを远加するこずでほが線圢にスケヌリングされたす。 ClickHouseデヌタベヌス甚の新しいデヌタりェアハりスを䜜成するこずは、倧量のデヌタを保存および凊理する機胜のおかげで、新しい機胜を远加し、開発を加速および簡玠化するずいう、より重芁な目暙に向けた゚ンドナヌザヌにずっおはほずんど目立たないステップです。







私たちに来お



私たちの郚門は垞に拡倧しおいたす。 耇雑で興味深いタスクずアルゎリズムに取り組みたい堎合は、 圓瀟をご芧ください 。 ご質問がある堎合は、PMで盎接お問い合わせください。







䟿利なリンク



ストリヌム凊理









河童建築









ClickHouse










All Articles