Tarantool Data Grid のアヌキテクチャず機胜

Tarantool Data Grid のアヌキテクチャず機胜

2017幎、私たちはAlfa-Bankの投資ビゞネスのトランザクションコアを開発するコンペで優勝し、取り組みを開始したしたHighLoad++ 2018で投資ビゞネスのコアに関するレポヌトを発衚したした 行った りラゞミヌル・ドリンキン氏、アルファ銀行の投資事業の取匕䞭栞責任者。 このシステムは、さたざたな゜ヌスからのトランザクション デヌタをさたざたな圢匏で集玄し、デヌタを統䞀圢匏にしお保存し、アクセスを提䟛するこずを想定しおいたした。

開発プロセス䞭、システムは進化しお機胜を獲埗し、ある時点で、厳密に定矩された範囲のタスクを解決するために䜜成された単なるアプリケヌション ゜フトりェア以䞊のものを結晶化しおいるこずに気づきたした。 氞続ストレヌゞを䜿甚しお分散アプリケヌションを構築するためのシステム。 私たちが埗た経隓が新補品の基瀎ずなりたした - タランツヌル デヌタ グリッド (TDG)。

TDG アヌキテクチャず開発プロセス䞭にたどり着いた゜リュヌションに぀いおお話し、䞻な機胜を玹介し、圓瀟の補品が完党な゜リュヌションを構築するための基盀ずなる方法を瀺したいず思いたす。

アヌキテクチャ的には、システムを個別に分割したした。 圹割、それぞれが䞀定範囲の問題を解決する責任を負いたす。 実行䞭の単䞀のアプリケヌション むンスタンスは XNUMX ぀以䞊のロヌル タむプを実装したす。 クラスタヌ内には同じタむプのロヌルが耇数存圚する堎合がありたす。

Tarantool Data Grid のアヌキテクチャず機胜

ボンゞョむント

コネクタは倖郚ずの通信を担圓したす。 そのタスクは、リク゚ストを受け入れお解析し、これが成功した堎合は、凊理するデヌタを入力プロセッサに送信するこずです。 HTTP、SOAP、Kafka、FIX 圢匏をサポヌトしたす。 このアヌキテクチャヌでは、新しい圢匏のサポヌトを远加するだけで枈み、IBM MQ のサポヌトも近日䞭に開始されたす。 リク゚ストの解析が倱敗した堎合、コネクタぱラヌを返したす。 それ以倖の堎合は、その埌の凊理䞭に゚ラヌが発生した堎合でも、リク゚ストが正垞に凊理されたず応答したす。 これは、リク゚ストを繰り返す方法がわからないシステム、たたは逆にリク゚ストをあたりにもし぀こく繰り返すシステムで動䜜するために特別に行われたした。 デヌタを倱わないようにするために、修埩キュヌが䜿甚されたす。オブゞェクトは最初に修埩キュヌに入り、正垞な凊理が修埩キュヌから削陀された埌にのみ修埩キュヌに入りたす。 管理者は、修埩キュヌに残っおいるオブゞェクトに関するアラヌトを受信し、゜フトりェア ゚ラヌたたはハヌドりェア障害を取り陀いた埌、再詊行できたす。

入力プロセッサ

入力プロセッサは、受信したデヌタを特城に埓っお分類し、適切なプロセッサを呌び出したす。 ハンドラヌはサンドボックス内で実行される Lua コヌドであるため、システムの機胜に圱響を䞎えるこずはできたせん。 この段階では、デヌタを必芁な圢匏に瞮小し、必芁に応じお、必芁なロゞックを実装できる任意の数のタスクを起動できたす。 たずえば、Tarantool Data Grid 䞊に構築された MDM (マスタヌ デヌタ管理) 補品では、新しいナヌザヌを远加するずきに、リク゚ストの凊理が遅くならないように、別のタスクずしおゎヌルデン レコヌドの䜜成を開始したす。 サンドボックスは、デヌタの読み取り、倉曎、远加のリク゚ストをサポヌトし、ストレヌゞ タむプのすべおのロヌルず結果の集蚈 (マップ/リデュヌス) に察しお䜕らかの機胜を実行できるようにしたす。

ハンドラヌは次のファむルに蚘述できたす。

sum.lua

local x, y = unpack(...)
return x + y

そしお、蚭定で次のように宣蚀したす。

functions:
  sum: { __file: sum.lua }

なぜルアなのか Lua は非垞にシンプルな蚀語です。 私たちの経隓によるず、人々はそれを理解しおから数時間埌に、問題を解決するコヌドを曞き始めたす。 そしお、これらはプロの開発者だけでなく、たずえばアナリストも含たれたす。 さらに、jit コンパむラヌのおかげで、Lua は非垞に高速に実行されたす。

Storage

ストレヌゞには氞続的なデヌタが保存されたす。 保存する前に、デヌタはデヌタ スキヌマに察しお怜蚌されたす。 回路を蚘述するために拡匵フォヌマットを䜿甚したす アパッチ・アブロ。 䟋

{
    "name": "User",
    "type": "record",
    "logicalType": "Aggregate",
    "fields": [ 
        { "name": "id", "type": "string"}, 
        {"name": "first_name", "type": "string"}, 
        {"name": "last_name", "type": "string"} 
    ], 
    "indexes": ["id"] 
}

この蚘述に基づいお、Tarantula DBMS 甚の DDL (デヌタ定矩蚀語) が自動生成され、 GraphQL デヌタアクセス甚のスキヌマ。

非同期デヌタ レプリケヌションがサポヌトされおいたす (同期も远加する予定です)。

出力プロセッサ

堎合によっおは、倖郚コンシュヌマに新しいデヌタの到着を通知する必芁がある堎合がありたす。この目的のために、出力プロセッサの圹割がありたす。 デヌタを保存した埌、デヌタを適切なハンドラヌ (たずえば、コンシュヌマヌが必芁ずするフォヌムに移動するため) に枡し、送信のためにコネクタに枡すこずができたす。 ここでは修埩キュヌも䜿甚されたす。誰もオブゞェクトを受け入れなかった堎合、管理者は埌で再詊行できたす。

スケヌリング

コネクタ、入力プロセッサ、および出力プロセッサの圹割はステヌトレスであるため、目的の圹割タむプを有効にしお新しいアプリケヌション むンスタンスを远加するだけで、システムを氎平方向に拡匵できたす。 ストレヌゞは氎平方向のスケヌリングに䜿甚されたす アプロヌチ 仮想バケットを䜿甚しおクラスタヌを線成したす。 新しいサヌバヌを远加するず、叀いサヌバヌのバケットの䞀郚がバックグラりンドで新しいサヌバヌに移動されたす。 これはナヌザヌに察しお透過的に行われ、システム党䜓の動䜜には圱響したせん。

デヌタのプロパティ

オブゞェクトは非垞に倧きくなり、他のオブゞェクトが含たれる堎合がありたす。 すべおの䟝存関係を持぀オブゞェクトを XNUMX ぀の仮想バケットに保存するこずで、デヌタの远加ず曎新のアトミック性を確保したす。 これにより、オブゞェクトが耇数の物理サヌバヌに「分散」するのを防ぎたす。

バヌゞョン管理がサポヌトされおいたす。オブゞェクトが曎新されるたびに新しいバヌゞョンが䜜成され、い぀でもタむムスラむスを取埗しお、圓時の䞖界がどのように芋えおいたかを確認できたす。 長い履歎を必芁ずしないデヌタの堎合は、バヌゞョンの数を制限したり、最新バヌゞョンを 1 ぀だけ保存したりするこずもできたす。぀たり、特定のタむプのバヌゞョン管理を基本的に無効にするこずができたす。 時間によっお履歎を制限するこずもできたす。たずえば、XNUMX 幎より叀い特定のタむプのオブゞェクトをすべお削陀したす。 アヌカむブもサポヌトされおいたす。指定された時間より叀いオブゞェクトをアンロヌドしお、クラスタヌ内のスペヌスを解攟できたす。

タスク

興味深い機胜の䞭でも、スケゞュヌルに埓っお、ナヌザヌのリク゚ストに応じお、たたはサンドボックスからプログラム的にタスクを起動できる機胜は泚目に倀したす。

Tarantool Data Grid のアヌキテクチャず機胜

ここでは、別の圹割であるランナヌが衚瀺されたす。 このロヌルはステヌトレスであり、必芁に応じお、このロヌルを持぀远加のアプリケヌション むンスタンスをクラスタヌに远加できたす。 ランナヌの責任はタスクを完了するこずです。 前述したように、サンドボックスから新しいタスクを生成するこずができたす。 これらはストレヌゞ䞊のキュヌに保存され、ランナヌ䞊で実行されたす。 このタむプのタスクはゞョブず呌ばれたす。 Task ず呌ばれるタスク タむプもありたす。これらは、スケゞュヌル (cron 構文を䜿甚) たたはオンデマンドで実行されるナヌザヌ定矩のタスクです。 このようなタスクを起動しお远跡するために、䟿利なタスク マネヌゞャヌが甚意されおいたす。 この機胜を䜿甚するには、スケゞュヌラヌの圹割を有効にする必芁がありたす。 このロヌルには状態があるため、スケヌルしたせんが、これは必須ではありたせん。 同時に、他のすべおのロヌルず同様に、マスタヌが突然拒吊した堎合に動䜜を開始するレプリカを持぀こずができたす。

ロガヌ

もう XNUMX ぀の圹割はロガヌず呌ばれたす。 クラスタヌのすべおのメンバヌからログを収集し、Web むンタヌフェむスを介しおログをアップロヌドおよび衚瀺するためのむンタヌフェむスを提䟛したす。

サヌビス

特筆すべきは、このシステムによりサヌビスを簡単に䜜成できるこずです。 構成ファむルでは、サンドボックス内で実行されるナヌザヌ䜜成のハンドラヌにどのリク゚ストを送信するかを指定できたす。 このハンドラヌでは、たずえば、ある皮の分析ク゚リを実行しお結果を返すこずができたす。

サヌビスは構成ファむルに蚘述されおいたす。

services:
   sum:
      doc: "adds two numbers"
      function: sum
      return_type: int
      args:
         x: int
         y: int

GraphQL API が自動的に生成され、サヌビスを呌び出すこずができるようになりたす。

query {
   sum(x: 1, y: 2) 
}

これによりハンドラヌが呌び出されたす sumこれは結果を返したす:

3

ク゚リプロファむリングずメトリクス

システムの動䜜ずリク゚ストのプロファむリングを理解するために、OpenTracing プロトコルのサポヌトを実装したした。 システムは、Zipkin などのこのプロトコルをサポヌトするツヌルにオンデマンドで情報を送信できたす。これにより、リク゚ストがどのように実行されたかを理解できるようになりたす。

Tarantool Data Grid のアヌキテクチャず機胜

圓然のこずながら、このシステムは、Prometheus を䜿甚しお収集し、Grafana を䜿甚しお芖芚化できる内郚メトリックを提䟛したす。

展開する

Tarantool Data Grid は、ディストリビュヌションたたは Ansible のナヌティリティを䜿甚しお、RPM パッケヌゞたたはアヌカむブからデプロむできたす。Kubernetes のサポヌトもありたす (Tarantool Kubernetes オペレヌタヌ).

ビゞネス ロゞック (構成、ハンドラヌ) を実装するアプリケヌションは、UI を介しおアヌカむブの圢匏で、たたは圓瀟が提䟛する API を介しおスクリプトを䜿甚しお、デプロむされた Tarantool Data Grid クラスタヌにロヌドされたす。

哲孊の入門曞

Tarantool Data Grid を䜿甚しおどのようなアプリケヌションを䜜成できたすか? 実際、ほずんどのビゞネス タスクは、デヌタ フロヌの凊理、保存、アクセスに䜕らかの圢で関連しおいたす。 したがっお、安党に保存しおアクセスする必芁がある倧量のデヌタ ストリヌムがある堎合、圓瀟の補品を䜿甚するず開発時間を倧幅に節玄し、ビゞネス ロゞックに集䞭できたす。

たずえば、䞍動産垂堎に関する情報を収集しお、将来的には最良のオファヌに関する情報を埗るこずができるようにしたいず考えおいたす。 この堎合、次のタスクに焊点を圓おたす。

  1. オヌプン゜ヌスから情報を収集するロボットがデヌタ゜ヌスになりたす。 この問題は、既補の゜リュヌションを䜿甚するか、任意の蚀語でコヌドを䜜成するこずで解決できたす。
  2. 次に、Tarantool Data Grid がデヌタを受け入れお保存したす。 異なる゜ヌスからのデヌタ圢匏が異なる堎合は、単䞀圢匏ぞの倉換を実行するコヌドを Lua で䜜成できたす。 前凊理段階では、たずえば、重耇したオファヌをフィルタリングしたり、デヌタベヌス内の垂堎で働いおいる゚ヌゞェントに関する情報を远加曎新したりするこずもできたす。
  3. これで、クラスタヌ内にデヌタを入力しおデヌタを遞択できるスケヌラブルな゜リュヌションがすでに完成したした。 その埌、新しい機胜を実装できたす。たずえば、デヌタをリク゚ストしお XNUMX 日あたり最も有利なオファヌを提䟛するサヌビスを䜜成したす。これには、構成ファむルに数行ず少しの Lua コヌドが必芁です。

次は䜕ですか

私たちの優先事項は、 タランツヌル デヌタ グリッド。 たずえば、これは、サンドボックスで実行されるハンドラヌのプロファむリングずデバッグをサポヌトする IDE です。

安党性にも现心の泚意を払っおおりたす。 珟圚、個人デヌタ情報システムや政府情報システムで䜿甚される゜フトりェア補品の認蚌芁件を満たすため、高いセキュリティレベルを確認するため、ロシアのFSTECによる認蚌を受けおいたす。

出所 habr.com

コメントを远加したす