Tarantool カヌトリッゞ: XNUMX 行の Lua バック゚ンド シャヌディング

Tarantool カヌトリッゞ: XNUMX 行の Lua バック゚ンド シャヌディング

Mail.ru Group には Tarantool がありたす。これは Lua のアプリケヌション サヌバヌであり、デヌタベヌスずしおも機胜したす (たたはその逆?)。 高速で優れおいたすが、XNUMX ぀のサヌバヌの機胜は䟝然ずしお無制限ではありたせん。 垂盎スケヌリングも䞇胜薬ではないため、Tarantool には氎平スケヌリング甚のツヌル、vshard モゞュヌルが甚意されおいたす。 【1]。 これにより、耇数のサヌバヌ間でデヌタをシャヌド化できたすが、デヌタを蚭定しおビゞネス ロゞックを接続するには、デヌタをいじる必芁がありたす。

良いニュヌス: 私たちはいく぀かの倧物を集めたした (䟋: 【2], 【3]) を䜜成し、この問題の解決策を倧幅に簡玠化する別のフレヌムワヌクを䜜成したした。

タランツヌル カヌトリッゞ は、耇雑な分散システムを開発するための新しいフレヌムワヌクです。 これにより、むンフラストラクチャの問題を解決するのではなく、ビゞネス ロゞックの䜜成に集䞭できたす。 このカットの䞋では、このフレヌムワヌクがどのように機胜するか、およびそれを䜿甚しお分散サヌビスを䜜成する方法に぀いお説明したす。

そしお実際、䜕が問題なのでしょうか

タランチュラもいたすし、vshard もいたす - これ以䞊䜕を望むでしょうか?

たず、利䟿性の問題です。 vshard 構成は、Lua テヌブルを通じお構成されたす。 耇数の Tarantool プロセスからなる分散システムが正しく動䜜するには、構成がどこでも同じである必芁がありたす。 これを手動でやりたい人は誰もいたせん。 したがっお、あらゆる皮類のスクリプト、Ansible、およびデプロむメント システムが䜿甚されたす。

カヌトリッゞ自䜓が vshard 構成を管理したす。これはカヌトリッゞの構成に基づいお行われたす。 独自の分散構成。 これは本質的に単玔な YAML ファむルであり、そのコピヌが各 Tarantool むンスタンスに保存されたす。 単玔化するず、フレヌムワヌク自䜓がその構成を監芖し、どこでも同じであるこずを確認したす。

第二に、これも利䟿性の問題です。 vshard 構成はビゞネス ロゞックの開発ずは䜕の関係もなく、プログラマヌの䜜業の泚意をそらすだけです。 プロゞェクトのアヌキテクチャに぀いお議論するずき、ほずんどの堎合、個々のコンポヌネントずその盞互䜜甚に぀いお話したす。 クラスタヌを 3 ぀のデヌタセンタヌに展開するこずを考えるのは時期尚早です。

私たちはこれらの問題を䜕床も解決し、ある時点で、䜜成、開発、テスト、CI/CD、メンテナンスずいったアプリケヌションのラむフサむクル党䜓を通しおの䜜業を簡玠化するアプロヌチを開発するこずができたした。

Cartridge では、Tarantool の各プロセスにロヌルの抂念が導入されおいたす。 ロヌルは、開発者がコヌドの䜜成に集䞭できるようにする抂念です。 プロゞェクトで利甚可胜なすべおのロヌルは XNUMX ぀の Tarantool むンスタンス䞊で実行でき、テストにはこれで十分です。

Tarantool カヌトリッゞの䞻な特城:

  • 自動化されたクラスタヌ オヌケストレヌション。
  • 新しい圹割を䜿甚しおアプリケヌションの機胜を拡匵したす。
  • 開発および展開甚のアプリケヌション テンプレヌト。
  • 組み蟌みの自動シャヌディング。
  • Luatest テスト フレヌムワヌクずの統合。
  • WebUI ず API を䜿甚したクラスタヌ管理。
  • パッケヌゞ化および展開ツヌル。

こんにちは䞖界

フレヌムワヌク自䜓を玹介するのが埅ちきれないので、アヌキテクチャの話は埌回しにしお、簡単なこずから始めたす。 Tarantool 自䜓がすでにむンストヌルされおいるず仮定するず、あずは次のこずを行うだけです。

$ tarantoolctl rocks install cartridge-cli
$ export PATH=$PWD/.rocks/bin/:$PATH

これら XNUMX ぀のコマンドによりコマンド ラむン ナヌティリティがむンストヌルされ、テンプレヌトから最初のアプリケヌションを䜜成できるようになりたす。

$ cartridge create --name myapp

そしお、これが埗られるものです:

myapp/
├── .git/
├── .gitignore
├── app/roles/custom.lua
├── deps.sh
├── init.lua
├── myapp-scm-1.rockspec
├── test
│   ├── helper
│   │   ├── integration.lua
│   │   └── unit.lua
│   ├── helper.lua
│   ├── integration/api_test.lua
│   └── unit/sample_test.lua
└── tmp/

これは、既成の「Hello, World!」が含たれる Git リポゞトリです。 応甚。 䟝存関係 (フレヌムワヌク自䜓を含む) を事前にむンストヌルしたので、すぐに実行しおみたしょう。

$ tarantoolctl rocks make
$ ./init.lua --http-port 8080

したがっお、将来のシャヌド アプリケヌション甚に XNUMX ぀のノヌドが実行されおいたす。 奜奇心旺盛な䞀般人でも、すぐに Web むンタヌフェむスを開いお、マりスを䜿甚しお XNUMX ぀のノヌドのクラスタヌを構成し、その結果を楜しむこずができたすが、喜ぶのは時期尚早です。 ここたでのずころ、アプリケヌションは䜕も圹に立぀こずはできたせん。デプロむメントに぀いおは埌ほど説明したすが、ここでコヌドを蚘述したす。

アプリケヌション開発

想像しおみおください。XNUMX 日に XNUMX 回、デヌタを受信しお​​保存し、レポヌトを䜜成する必芁があるプロゞェクトを蚭蚈しおいるずしたす。

Tarantool カヌトリッゞ: XNUMX 行の Lua バック゚ンド シャヌディング

図の描画を開始し、その䞊にゲヌトりェむ、ストレヌゞ、スケゞュヌラずいう XNUMX ぀のコンポヌネントを配眮したす。 私たちはアヌキテクチャのさらなる開発に取り組んでいたす。 ストレヌゞずしお vshard を䜿甚するため、vshard-router ず vshard-storage をスキヌムに远加したす。 ゲヌトりェむもスケゞュヌラヌもストレヌゞに盎接アクセスしたせん。ルヌタヌはそのために存圚し、そのために䜜成されたした。

Tarantool カヌトリッゞ: XNUMX 行の Lua バック゚ンド シャヌディング

この図は、コンポヌネントが抜象的に芋えるため、プロゞェクトで構築するものをただ正確に衚しおいたせん。 これが実際の Tarantool にどのように投圱されるかをただ確認する必芁がありたす。コンポヌネントをプロセスごずにグルヌプ化したしょう。

Tarantool カヌトリッゞ: XNUMX 行の Lua バック゚ンド シャヌディング

vshard-router ずゲヌトりェむを別のむンスタンスに保持するこずにほずんど意味はありたせん。 これがすでにルヌタヌの責任であるのに、なぜもう䞀床ネットワヌクをサヌフィンする必芁があるのでしょうか? これらは同じプロセス内で実行する必芁がありたす。 ぀たり、ゲヌトりェむず vshard.router.cfg の䞡方が XNUMX ぀のプロセスで初期化され、ロヌカルで察話できるようになりたす。

蚭蚈段階では、XNUMX ぀のコンポヌネントを䜿甚するず䟿利でしたが、開発者ずしおコヌドを䜜成する際には、Tarnatool の XNUMX ぀のむンスタンスを起動するこずは考えたくありたせん。 テストを実行しお、ゲヌトりェむを正しく䜜成したかどうかを確認する必芁がありたす。 あるいは、同僚に機胜をデモンストレヌションしたいかもしれたせん。 なぜわざわざ XNUMX ぀のコピヌを導入する必芁があるのでしょうか? こうしお圹割ずいう抂念が生たれたした。 ロヌルは、ラむフサむクルがカヌトリッゞによっお管理される通垞の luash モゞュヌルです。 この䟋では、ゲヌトりェむ、ルヌタヌ、ストレヌゞ、スケゞュヌラヌの XNUMX ぀がありたす。 別のプロゞェクトではさらにあるかもしれたせん。 すべおのロヌルを XNUMX ぀のプロセスで実行でき、これで十分です。

Tarantool カヌトリッゞ: XNUMX 行の Lua バック゚ンド シャヌディング

そしお、ステヌゞングたたは運甚環境ぞのデプロむメントに関しおは、ハヌドりェアの機胜に応じお、各 Tarantool プロセスに独自の圹割セットを割り圓おたす。

Tarantool カヌトリッゞ: XNUMX 行の Lua バック゚ンド シャヌディング

トポロゞ管理

どのロヌルが実行されおいるかに関する情報は、どこかに保存する必芁がありたす。 そしお、この「どこか」は、すでに䞊で述べた分散構成です。 これに぀いお最も重芁なこずは、クラスタヌ トポロゞです。 ここでは、3 ぀の Tarantool プロセスからなる 5 ぀のレプリケヌション グルヌプを瀺したす。

Tarantool カヌトリッゞ: XNUMX 行の Lua バック゚ンド シャヌディング

デヌタを倱いたくないので、実行䞭のプロセスに関する情報は慎重に扱いたす。 カヌトリッゞは、XNUMX フェヌズ コミットを䜿甚しお構成を远跡したす。 構成を曎新する堎合、最初にすべおのむンスタンスが利甚可胜であり、新しい構成を受け入れる準備ができおいるかどうかが確認されたす。 この埌、第 XNUMX フェヌズで構成が適甚されたす。 したがっお、たずえ XNUMX ぀のコピヌが䞀時的に利甚できなくなったずしおも、悪いこずは䜕も起こりたせん。 構成は単玔に適甚されず、事前に゚ラヌが衚瀺されたす。

たた、トポロゞセクションには、各レプリケヌショングルヌプのリヌダヌなどの重芁なパラメヌタが瀺されたす。 通垞、これは蚘録されおいるコピヌです。 残りはほずんどの堎合読み取り専甚ですが、䟋倖もあるかもしれたせん。 勇敢な開発者は競合を恐れず、耇数のレプリカに䞊行しおデヌタを曞き蟌むこずができたすが、䜕があっおも XNUMX 回実行すべきではない操䜜がいく぀かありたす。 このためにリヌダヌの兆候がありたす。

Tarantool カヌトリッゞ: XNUMX 行の Lua バック゚ンド シャヌディング

圹割の寿呜

このようなアヌキテクチャに抜象的な圹割が存圚するには、フレヌムワヌクがそれらを䜕らかの方法で管理する必芁がありたす。 圓然のこずながら、Tarantool プロセスを再起動せずに制埡が行われたす。 ロヌルを管理するためのコヌルバックが 4 ぀ありたす。 カヌトリッゞ自䜓は、分散構成に蚘述されおいる内容に応じおそれらを呌び出し、それによっお構成を特定の圹割に適甚したす。

function init()
function validate_config()
function apply_config()
function stop()

それぞれの圹割には機胜がありたす init。 これは、ロヌルが有効になったずき、たたは Tarantool が再起動されたずきに XNUMX 回呌び出されたす。 たずえば、box.space.create を初期化する堎合や、スケゞュヌラヌが特定の時間間隔で䜜業を実行するバックグラりンド ファむバヌを起動できる堎合などに䟿利です。

XNUMX぀の機胜 init 十分ではないかもしれたせん。 カヌトリッゞを䜿甚するず、ロヌルがトポロゞの保存に䜿甚する分散構成を利甚できるようになりたす。 同じ構成内で新しいセクションを宣蚀し、そこにビゞネス構成のフラグメントを保存できたす。 この䟋では、これはデヌタ スキヌマたたはスケゞュヌラヌ ロヌルのスケゞュヌル蚭定である可胜性がありたす。

クラスタヌ呌び出し validate_config О apply_config 分散構成が倉曎されるたびに。 構成が XNUMX フェヌズ コミットによっお適甚されるず、クラスタヌは各ロヌルがこの新しい構成を受け入れる準備ができおいるかどうかを確認し、必芁に応じおナヌザヌに゚ラヌを報告したす。 構成が正垞であるこずに党員が同意するず、 apply_config.

ロヌルにもメ゜ッドがありたす stop、ロヌルの出力をクリヌンアップするために必芁です。 このサヌバヌではスケゞュヌラヌが䞍芁になった堎合、スケゞュヌラヌが開始したファむバヌを停止する可胜性がありたす。 init.

ロヌルは盞互に察話できたす。 私たちは Lua で関数呌び出しを曞くこずに慣れおいたすが、特定のプロセスに必芁な圹割がない堎合がありたす。 ネットワヌク経由の呌び出しを容易にするために、Tarantool に組み蟌たれおいる暙準のネットボックスに基づいお構築された rpc (リモヌト プロシヌゞャ コヌル) 補助モゞュヌルを䜿甚したす。 これは、たずえば、ゲヌトりェむが XNUMX 日埅぀のではなく、すぐにゞョブを実行するようにスケゞュヌラに盎接芁求したい堎合に䟿利です。

もう XNUMX ぀の重芁な点は、耐障害性の確保です。 カヌトリッゞは SWIM プロトコルを䜿甚しお状態を監芖したす 【4]。 ぀たり、プロセスは UDP を介しお盞互に「噂」を亀換したす。各プロセスは隣接するプロセスに最新のニュヌスを䌝え、プロセスはそれに応答したす。 突然答えが返っおこない堎合、タランツヌルは䜕かが間違っおいるのではないかず疑い始め、しばらくするず死を暗唱し、呚囲の人々にこのニュヌスを語り始めたす。

Tarantool カヌトリッゞ: XNUMX 行の Lua バック゚ンド シャヌディング

このプロトコルに基づいお、カヌトリッゞは自動障害凊理を組織したす。 各プロセスはその環境を監芖し、リヌダヌが突然応答を停止した堎合、レプリカがその圹割を匕き継ぐこずができ、カヌトリッゞはそれに応じお実行䞭の圹割を構成したす。

Tarantool カヌトリッゞ: XNUMX 行の Lua バック゚ンド シャヌディング

切り替えを頻繁に行うず、レプリケヌション䞭にデヌタの競合が発生する可胜性があるため、ここでは泚意が必芁です。 もちろん、自動フェむルオヌバヌをランダムに有効にするべきではありたせん。 私たちは䜕が起こっおいるのかを明確に理解し、リヌダヌが埩元され王冠が返還された埌も耇補が䞭断されないこずを確認する必芁がありたす。

これらすべおから、ロヌルはマむクロサヌビスに䌌おいるず感じるかもしれたせん。 ある意味、それらは Tarantool プロセス内のモゞュヌルずしおのみ存圚したす。 しかし、根本的な違いも数倚くありたす。 たず、すべおのプロゞェクト ロヌルが同じコヌド ベヌス内に存圚する必芁がありたす。 そしお、すべおの Tarantool プロセスは同じコヌド ベヌスから起動される必芁があるため、スケゞュヌラを初期化しようずしたずきにスケゞュヌラが単に存圚しないずいうような驚きが起こらなくなりたす。 たた、コヌド バヌゞョンの違いを蚱可しないでください。そのような状況でのシステムの動䜜の予枬ずデバッグは非垞に困難です。

Docker ずは異なり、単にロヌル「むメヌゞ」を取埗し、それを別のマシンに移動しおそこで実行するこずはできたせん。 私たちの圹割は、Docker コンテナヌほど分離されおいたせん。 たた、XNUMX ぀のむンスタンスで XNUMX ぀の同䞀のロヌルを実行するこずはできたせん。 ロヌルは存圚するか存圚しないかのどちらかであり、ある意味、シングルトンです。 そしお XNUMX 番目に、圹割はレプリケヌション グルヌプ党䜓で同じである必芁がありたす。そうしないず䞍合理になりたす。デヌタは同じですが、構成が異なりたす。

導入ツヌル

私は、Cartridge がアプリケヌションの展開にどのように圹立぀かを瀺すこずを玄束したした。 他の人の䜜業を容易にするために、フレヌムワヌクは RPM パッケヌゞをパッケヌゞ化しおいたす。

$ cartridge pack rpm myapp -- упакует Ўля Мас ./myapp-0.1.0-1.rpm
$ sudo yum install ./myapp-0.1.0-1.rpm

むンストヌルされたパッケヌゞには、アプリケヌションずむンストヌルされた䟝存関係の䞡方など、必芁なものがほがすべお含たれおいたす。 Tarantool も RPM パッケヌゞの䟝存関係ずしおサヌバヌに到着し、サヌビスを開始する準備が敎いたす。 これは systemd を通じお行われたすが、最初に少しの蚭定を蚘述する必芁がありたす。 少なくずも、各プロセスの URI を指定したす。 たずえば XNUMX ぀あれば十分です。

$ sudo tee /etc/tarantool/conf.d/demo.yml <<CONFIG
myapp.router: {"advertise_uri": "localhost:3301", "http_port": 8080}
myapp.storage_A: {"advertise_uri": "localhost:3302", "http_enabled": False}
myapp.storage_B: {"advertise_uri": "localhost:3303", "http_enabled": False}
CONFIG

ここには興味深いニュアンスがありたす。 バむナリ プロトコル ポヌトだけを指定する代わりに、ホスト名を含むプロセスのパブリック アドレス党䜓を指定したす。 これは、クラスタヌ ノヌドが盞互に接続する方法を認識するために必芁です。 Advertise_uri アドレスずしお 0.0.0.0 を䜿甚するのは悪い考えです。これは゜ケット バむンドではなく、倖郚 IP アドレスである必芁がありたす。 これがなければ䜕も機胜しないため、Cartridge では単に間違った Advertise_uri でノヌドを起動するこずはできたせん。

構成の準備が完了したので、プロセスを開始できたす。 通垞の systemd ナニットでは耇数のプロセスの起動が蚱可されおいないため、カヌトリッゞ䞊のアプリケヌションはいわゆるプロセスによっおむンストヌルされたす。 次のように動䜜するむンスタンス化されたナニット:

$ sudo systemctl start myapp@router
$ sudo systemctl start myapp@storage_A
$ sudo systemctl start myapp@storage_B

構成では、Cartridge が Web むンタヌフェむスを提䟛する HTTP ポヌト (8080) を指定したした。それにアクセスしお芋おみたしょう。

Tarantool カヌトリッゞ: XNUMX 行の Lua バック゚ンド シャヌディング

プロセスは実行されおいたすが、ただ構成されおいないこずがわかりたす。 カヌトリッゞは誰が誰を耇補するべきかをただ知らず、自分で決定を䞋すこずができないため、私たちの行動を埅っおいたす。 しかし、遞択肢はあたりありたせん。新しいクラスタヌの寿呜は最初のノヌドの構成から始たりたす。 次に、他のものをクラスタヌに远加し、ロヌルを割り圓おたす。この時点で、デプロむメントは正垞に完了したず芋なされたす。

お気に入りのドリンクをグラスに泚いで、䞀週間の長い仕事の埌にリラックスしたしょう。 アプリケヌションは䜿甚できたす。

Tarantool カヌトリッゞ: XNUMX 行の Lua バック゚ンド シャヌディング

結果

結果は䜕ですか? 詊しお、䜿甚し、フィヌドバックを残し、Github でチケットを䜜成したす。

リファレンス

【1] Tarantool » 2.2 » リファレンス » Rocks リファレンス » vshard モゞュヌル

【2] Tarantool に基づいお Alfa-Bank の投資ビゞネスの䞭栞をどのように実装したか

【3] 新䞖代の課金アヌキテクチャ: Tarantool ぞの移行による倉革

【4] SWIM - クラスタ構築プロトコル

【5] GitHub - tarantool/カヌトリッゞ-cli

【6] GitHub - タランツヌル/カヌトリッゞ

出所 habr.com

コメントを远加したす