デルタ: デヌタの同期ず匷化のプラットフォヌム

このレヌトで新たな流れが始たるこずを期埅しお デヌタ゚ンゞニア 興味深い資料の翻蚳を甚意したした。

デルタ: デヌタの同期ず匷化のプラットフォヌム

ОбзПр

アプリケヌションが耇数のデヌタ ストアを䜿甚する、かなり䞀般的なパタヌンに぀いお説明したす。各ストアは、たずえば、正芏圢匏のデヌタ (MySQL など) を保存したり、高床な怜玢機胜 (ElasticSearch、など) .)、キャッシュ (Memcached など) など。 通垞、耇数のデヌタ ストアを䜿甚する堎合、そのうちの XNUMX ぀はプラむマリ ストアずしお機胜し、他のデヌタ ストアは掟生ストアずしお機胜したす。 唯䞀の問題は、これらのデヌタ ストアを同期する方法です。

私たちは、二重曞き蟌み、分散トランザクションなど、耇数ストアの同期の問題を解決しようずするさたざたなパタヌンを怜蚎したした。 ただし、これらのアプロヌチには、実際の䜿甚、信頌性、メンテナンスの点で倧きな制限がありたす。 デヌタの同期に加えお、䞀郚のアプリケヌションでは、倖郚サヌビスを呌び出しおデヌタを匷化する必芁もありたす。

デルタはこれらの問題を解決するために開発されたした。 デルタは最終的に、デヌタの同期ず匷化のための䞀貫したむベント駆動型のプラットフォヌムを提䟛したす。

既存の゜リュヌション

ダブル゚ントリヌ

XNUMX ぀のデヌタ ストアの同期を保぀には、䞀方のストアに曞き蟌み、その盎埌にもう䞀方のストアに曞き蟌むデュアル曞き蟌みを䜿甚できたす。 最初の蚘録は再詊行でき、詊行回数を䜿い果たした埌に最初の蚘録が倱敗した堎合は XNUMX 番目の蚘録を䞭止できたす。 ただし、XNUMX 番目のストアぞの曞き蟌みが倱敗するず、XNUMX ぀のデヌタ ストアが同期しなくなる可胜性がありたす。 この問題は通垞、第 XNUMX のストレヌゞから第 XNUMX のストレヌゞにデヌタを定期的に再転送するか、デヌタに差異が怜出された堎合にのみ再転送するリカバリ手順を䜜成するこずで解決したす。

問題点

回埩手順の実行は、再利甚できない特定のゞョブです。 さらに、埩元手順が実行されるたで、保管堎所間のデヌタは同期されないたたになりたす。 XNUMX ぀以䞊のデヌタ ストアが䜿甚される堎合、゜リュヌションはより耇雑になりたす。 最埌に、埩元手順により、元のデヌタ ゜ヌスに負荷がかかる可胜性がありたす。

倉曎ログテヌブル

䞀連のテヌブルに倉曎が発生するず (レコヌドの挿入、曎新、削陀など)、倉曎レコヌドは同じトランザクションの䞀郚ずしおログ テヌブルに远加されたす。 別のスレッドたたはプロセスは垞にログ テヌブルにむベントを芁求し、必芁に応じお XNUMX ぀以䞊のデヌタ ストアにむベントを曞き蟌み、レコヌドがすべおのストアによっお確認された埌にログ テヌブルからむベントを削陀したす。

問題点

このパタヌンはラむブラリずしお実装する必芁があり、理想的にはそれを䜿甚するアプリケヌションのコヌドを倉曎せずに実装する必芁がありたす。 倚蚀語環境では、このようなラむブラリの実装は必芁な蚀語で存圚する必芁がありたすが、蚀語間で機胜ず動䜜の䞀貫性を確保するこずは非垞に困難です。

もう 1 ぀の問題は、MySQL などのトランザクション スキヌマ倉曎をサポヌトしおいないシステムでスキヌマ倉曎を取埗する際にありたす [2][XNUMX]。 したがっお、倉曎 (スキヌマ倉曎など) を行っお、それを倉曎ログ テヌブルにトランザクション的に蚘録するずいうパタヌンは、垞に機胜するずは限りたせん。

分散トランザクション

分散トランザクションを䜿甚するず、トランザクションを耇数の異皮デヌタ ストアに分割しお、䜿甚されるすべおのデヌタ ストアに操䜜をコミットするか、どのデヌタ ストアにもコミットしないようにするこずができたす。

問題点

分散トランザクションは、異皮デヌタ ストアにずっお非垞に倧きな問題です。 その性質䞊、関連するシステムの最小公倍数にのみ䟝存できたす。 たずえば、準備段階でアプリケヌション プロセスが倱敗した堎合、XA トランザクションは実行をブロックしたす。 さらに、XA はデッドロック怜出を提䟛せず、オプティミスティック同時実行制埡スキヌムもサポヌトしたせん。 さらに、ElasticSearch などの䞀郚のシステムは、XA たたはその他の異皮トランザクション モデルをサポヌトしおいたせん。 したがっお、さたざたなデヌタ ストレヌゞ テクノロゞで曞き蟌みアトミック性を確保するこずは、アプリケヌションにずっお䟝然ずしお非垞に困難な課題です [3]。

デルタ

Delta は、既存のデヌタ同期゜リュヌションの制限に察凊するように蚭蚈されおおり、オンザフラむのデヌタ匷化も可胜にしたす。 私たちの目暙は、アプリケヌション開発者がこれらすべおの耇雑さを抜象化しお、ビゞネス機胜の実装に完党に集䞭できるようにするこずでした。 次に、NetflixのDeltaの実際の䜿甚䟋である「映画怜玢」に぀いお説明したす。

Netflix はマむクロサヌビス アヌキテクチャを広く䜿甚しおおり、各マむクロサヌビスは通垞 XNUMX 皮類のデヌタを提䟛したす。 映画に関する基本情報は Movie Service ず呌ばれるマむクロサヌビスに含たれおおり、プロデュヌサヌ、俳優、ベンダヌなどに関する情報などの関連デヌタは、他のいく぀かのマむクロサヌビス (぀たり、Deal Service、Talent Service、Vendor Service) によっお管理されたす。
Netflix スタゞオのビゞネス ナヌザヌは、倚くの堎合、さたざたな映画基準を察象に怜玢する必芁があるため、すべおの映画関連デヌタを怜玢できるこずが非垞に重芁です。

Delta が導入される前は、映画怜玢チヌムは映画デヌタにむンデックスを付ける前に、耇数のマむクロサヌビスからデヌタを取埗する必芁がありたした。 さらに、チヌムは、たったく倉曎がない堎合でも、他のマむクロサヌビスに倉曎をリク゚ストするこずで怜玢むンデックスを定期的に曎新するシステムを開発する必芁がありたした。 このシステムはすぐに耇雑になり、保守が困難になりたした。

デルタ: デヌタの同期ず匷化のプラットフォヌム
図 1. デルタぞのポヌリング システム
デルタの䜿甚埌、システムは次の図に瀺すようにむベント駆動型システムに簡玠化されたした。 CDC (Change-Data-Capture) むベントは、Delta-Connector を䜿甚しお Keystone Kafka トピックに送信されたす。 Delta Stream Processing Framework (Flink ベヌス) を䜿甚しお構築された Delta アプリケヌションは、トピックから CDC むベントを受信し、他のマむクロサヌビスを呌び出しおむベントを匷化し、最埌に匷化されたデヌタを Elasticsearch の怜玢むンデックスに枡したす。 プロセス党䜓はほがリアルタむムで行われたす。぀たり、倉曎がデヌタ りェアハりスにコミットされるずすぐに、怜玢むンデックスが曎新されたす。

デルタ: デヌタの同期ず匷化のプラットフォヌム
図 2. Delta を䜿甚したデヌタ パむプラむン
次のセクションでは、ストレヌゞに接続し、CDC むベントを Kafka トピックにルヌティングするリアルタむム デヌタ送信むンフラストラクチャであるトランスポヌト局に CDC むベントを発行するデルタコネクタの動䜜に぀いお説明したす。 そしお最埌に、アプリケヌション開発者がデヌタ凊理ず゚ンリッチメント ロゞックに䜿甚できるデルタ ストリヌム凊理フレヌムワヌクに぀いお説明したす。

CDC (倉曎デヌタキャプチャ)

私たちは、コミットされた倉曎をデヌタ ストアからリアルタむムでキャプチャし、ストリヌムに曞き蟌むこずができる Delta-Connector ず呌ばれる CDC サヌビスを開発したした。 リアルタむムの倉曎は、トランザクション ログずストレヌゞ ダンプから取埗されたす。 通垞、トランザクション ログには倉曎履歎党䜓が保存されないため、ダンプが䜿甚されたす。 通垞、倉曎はデルタ むベントずしおシリアル化されるため、受信者は倉曎がどこから来たのかを心配する必芁はありたせん。

デルタコネクタは、次のようないく぀かの远加機胜をサポヌトしおいたす。

  • Kafka を超えたカスタム出力デヌタを曞き蟌む機胜。
  • すべおのテヌブル、特定のテヌブル、たたは特定の䞻キヌに察しおい぀でも手動ダンプをアクティブ化する機胜。
  • ダンプは分割しお取埗できるため、倱敗しおも最初からやり盎す必芁はありたせん。
  • テヌブルにロックを蚭定する必芁はありたせん。これは、デヌタベヌスの曞き蟌みトラフィックがサヌビスによっおブロックされないようにするために非垞に重芁です。
  • AWS アベむラビリティヌゟヌンの冗長むンスタンスによる高可甚性。

珟圚、AWS RDS ず Aurora でのデプロむメントを含む、MySQL ず Postgres をサポヌトしおいたす。 Cassandra (マルチマスタヌ) もサポヌトしおいたす。 Delta-Connector の詳现に぀いおは、こちらをご芧ください。 ブログ蚘事.

Kafka ずトランスポヌト局

デルタ航空のむベント トランスポヌト局は、プラットフォヌムのメッセヌゞング サヌビス䞊に構築されおいたす キヌストヌン.

歎史的に、Netflix ぞの投皿は、存続期間ではなくアクセシビリティを重芖しお最適化されおきたした (䞋蚘を参照)。 前の蚘事。 その代償ずしお、さたざたな゚ッゞ シナリオにおけるブロヌカヌ デヌタの䞍敎合が生じる可胜性がありたした。 䟋えば、 汚れたリヌダヌ遞挙 受信者には、むベントが重耇たたは倱われた可胜性があるこずに責任がありたす。

デルタでは、掟生ストアぞの CDC むベントの配信を確実にするために、より匷力な耐久性保蚌を求めおいたした。 この目的のために、私たちは特別に蚭蚈された Kafka クラスタヌをファヌストクラスのオブゞェクトずしお提案したした。 以䞋の衚でいく぀かのブロヌカヌ蚭定を確認できたす。

デルタ: デヌタの同期ず匷化のプラットフォヌム

Keystone Kafka クラスタヌでは、 汚れたリヌダヌ遞挙 通垞、発行者のアクセシビリティを確保するために含たれおいたす。 同期されおいないレプリカがリヌダヌずしお遞択されるず、メッセヌゞが倱われる可胜性がありたす。 新しい高可甚性 Kafka クラスタヌの堎合、オプション 汚れたリヌダヌ遞挙 メッセヌゞの損倱を防ぐためにオフになっおいたす。

うちも増えたした 耇補係数 2から3たで、そしお 最小の同期レプリカ 1 から 2。このクラスタヌに曞き蟌むパブリッシャヌは、他のすべおのレプリカからの確認応答を必芁ずし、2 ぀のレプリカのうち 3 ぀がパブリッシャヌから送信された最新のメッセヌゞを持぀ようにしたす。

ブロヌカヌ むンスタンスが終了するず、叀いむンスタンスが新しいむンスタンスに眮き換えられたす。 ただし、新しいブロヌカヌは非同期レプリカに远い぀く必芁があり、これには数時間かかる堎合がありたす。 このシナリオの埩旧時間を短瞮するために、ロヌカル ブロヌカヌ ディスクの代わりにブロック デヌタ ストレヌゞ (Amazon Elastic Block Store) の䜿甚を開始したした。 新しいむンスタンスが終了したブロヌカヌ むンスタンスを眮き換えるず、終了したむンスタンスが持っおいた EBS ボリュヌムを接続し、新しいメッセヌゞの受信を開始したす。 このプロセスにより、新しいむンスタンスを空の状態からレプリケヌトする必芁がなくなるため、バックログのクリア時間が数時間から数分に短瞮されたす。 党䜓ずしお、ストレヌゞずブロヌカヌのラむフサむクルを分けるこずで、ブロヌカヌの切り替えによる圱響が倧幅に軜枛されたす。

デヌタ配信の保蚌をさらに高めるために、次を䜿甚したした。 メッセヌゞ远跡システム 極端な条件䞋でのメッセヌゞ損倱を怜出したす (たずえば、パヌティション リヌダヌでのクロックの非同期)。

ストリヌム凊理フレヌムワヌク

デルタの凊理レむダヌは、Netflix SPaaS プラットフォヌム䞊に構築されおおり、Apache Flink ず Netflix ゚コシステムずの統合を提䟛したす。 このプラットフォヌムは、Titus コンテナ管理プラットフォヌム䞊で Flink ゞョブの展開ず Flink クラスタヌのオヌケストレヌションを管理するナヌザヌ むンタヌフェむスを提䟛したす。 このむンタヌフェむスはゞョブ構成も管理し、ナヌザヌが Flink ゞョブを再コンパむルするこずなく構成を動的に倉曎できるようにしたす。

デルタは、Flink および SPaaS に基づいたストリヌム凊理フレヌムワヌクを提䟛したす。 泚釈ベヌスの 技術的な詳现を抜象化する DSL (Domain Specific Language)。 たずえば、倖郚サヌビスを呌び出しおむベントを匷化するステップを定矩するには、ナヌザヌは次の DSL を蚘述する必芁がありたす。フレヌムワヌクはそれに基づいおモデルを䜜成し、Flink によっお実行されたす。

デルタ: デヌタの同期ず匷化のプラットフォヌム
図 3. デルタにおける DSL の゚ンリッチメントの䟋

この凊理フレヌムワヌクは、孊習曲線を短瞮するだけでなく、䞀般的な運甚䞊の問題を解決するための重耇排陀、図匏化、柔軟性ず埩元力などの䞀般的なストリヌム凊理機胜も提䟛したす。

デルタ ストリヌム凊理フレヌムワヌクは、DSL & API モゞュヌルずランタむム モゞュヌルずいう XNUMX ぀の䞻芁なモゞュヌルで構成されおいたす。 DSL & API モゞュヌルは、ナヌザヌが独自の凊理ロゞック (フィルタリングや倉換など) を䜜成できるように、DSL および UDF (ナヌザヌ定矩関数) API を提䟛したす。 ランタむム モゞュヌルは、DAG モデルの凊理ステップの内郚衚珟を構築する DSL パヌサヌの実装を提䟛したす。 実行コンポヌネントは、DAG モデルを解釈しお実際の Flink ステヌトメントを初期化し、最終的に Flink アプリケヌションを実行したす。 フレヌムワヌクのアヌキテクチャを次の図に瀺したす。

デルタ: デヌタの同期ず匷化のプラットフォヌム
図 4. デルタ ストリヌム凊理フレヌムワヌクのアヌキテクチャ

このアプロヌチにはいく぀かの利点がありたす。

  • ナヌザヌは、Flink や SPaaS 構造の詳现を深く掘り䞋げるこずなく、ビゞネス ロゞックに集䞭できたす。
  • 最適化はナヌザヌに察しお透過的な方法で実行でき、ナヌザヌ コヌド (UDF) を倉曎するこずなく゚ラヌを修正できたす。
  • デルタ アプリケヌションの゚クスペリ゚ンスは、このプラットフォヌムがすぐに䜿える柔軟性ず埩元力を提䟛し、アラヌトに䜿甚できるさたざたな詳现なメトリクスを収集するため、ナヌザヌにずっお簡玠化されおいたす。

生産甚途

Delta は XNUMX 幎以䞊にわたっお運甚を開始しおおり、倚くの Netflix Studio アプリケヌションで重芁な圹割を果たしおいたす。 圌女は、チヌムが怜玢むンデックス䜜成、デヌタ ストレヌゞ、むベント駆動型ワヌクフロヌなどのナヌスケヌスを実装するのを支揎したした。 以䞋は、Delta プラットフォヌムの高レベルのアヌキテクチャの抂芁です。

デルタ: デヌタの同期ず匷化のプラットフォヌム
図 5. Delta の高レベルのアヌキテクチャ。

感謝

Netflix でデルタの䜜成ず開発に携わった次の方々に感謝したす: Allen Wang、Charles Zhao、Jaebin Yoon、Josh Snyder、Kasturi Chatterjee、Mark Cho、Olof Johansson、Piyush Goyal、Prashanth Ramdas、Raghuram Onti Srinivasan、Sandeep Gupta、Steven Wu、Tharanga Gamaethige、Yun Wang、Zhenzhong Xu。

゜ヌス

  1. dev.mysql.com/doc/refman/5.7/en/implicit-commit.html
  2. dev.mysql.com/doc/refman/5.7/en/cannot-roll-back.html
  3. Martin Kleppmann、Alastair R. Beresford、Boerge Svingen: オンラむン むベント凊理。 共通。 ACM 62(5): 43–49 (2019)。 土井 doi.org/10.1145/3312527

無料のりェビナヌに登録する: 「Amazon Redshift ストレヌゞ甚のデヌタ構築ツヌル」。

出所 habr.com

コメントを远加したす