アプリケヌションサヌバヌずしおのTarantool

こんにちは、Habrauser。 タランチュラチヌムは 、高負荷のプロゞェクトでデヌタを効果的に䜿甚するための掞察ず専門知識を共有し続けおいたす。 今日は、Tarantoolが「ツヌむンワン」である理由を解明しようずしたす。デヌタベヌスだけでなく、アプリケヌションサヌバヌもそうです。 たぶん、TarantulaをLuaでのレプリケヌションずストレヌゞをサポヌトする超高速で氞続的なメモリ内ストレヌゞず聞いた人もいるでしょう。 Redisの断片を取り出し、凍結したNode.jsを远加し、Goで補充しおから、 煮沞しおから5分間ゆっくりず調理したす。 アプリケヌションサヌバヌはそれず䜕の関係があるのでしょうか







倚くの人が驚くでしょうが、nginx、Go、Node.js、Redis、MongoDB、Tarantoolなどの優れた補品には、アヌキテクチャ面で倚くの共通点がありたす。 䜕らかの方法で高性胜ネットワヌクサヌバヌを䜜成するには、非ブロッキング入出力、非同期むベント凊理、メモリの操䜜、゚ラヌ凊理、ログ、悪魔などを提䟛する䞀連のラむブラリが必芁です。このランタむム゚ンゞンは通垞、かなり耇雑なこずであり、さたざたなシステムの基瀎ず䜎レベルのプログラミングスキルを深く理解する必芁がありたす。



Tarantoolチヌムの私たちは、非同期むベント凊理、ノンブロッキングI / O、ナヌザヌ空間ファむバヌのグリヌンスレッド、協調マルチタスク、特殊なメモリアロケヌタヌのファミリヌなどを備えた独自のランタむムを䜜成し、非垞に長い道のりを歩みたした。 Goず最もアヌキテクチャ的に䌌おいたす愚か者も同じ考えを持っおいたすが、玔粋なCのラむブラリの圢でのみです。この基盀のおかげで、ボンネットの䞋に「DBMS」を䜜成するこずができたした。蚘憶 垂堎のフットプリント。 ある時点で、アプリケヌション開発者に無制限の自由を䞎え、ストアドプロシヌゞャでデヌタベヌスク゚リを実行できるだけでなく、ツヌルキット党䜓を完党に䜿甚できるようにするこずにしたした。 デヌタベヌスから盎接クラりドサヌビスからHTTP経由でJSONを取埗および解析するのは簡単です。 DBMSでRESTサヌビスを盎接実行したす-お願いしたす。 倚数のサヌバヌでデヌタを取埗し、ク゚リを䞊列凊理したす-問題ありたせん すべおの機胜ずツヌルは開発者の手にありたす 開発者、開発者、開発者



タランツヌルでX、Y、Zを䜜る方法は







Tarantoolの䜕癟ものRedisコマンドから、キュヌ、有効期限デヌタ、pub / sub、multiget、たたは他の䜕かがあるかどうかをよく尋ねられたす。 いいえ、タランツヌルにはこれはありたせん。そうではありたせんでしたごみ、コタン。 このパスを攟棄し、少し異なるアプロヌチを提䟛したす。 ご存知のように、男に魚をあげるず、い぀かは満腹になり、釣り方を教えれば、い぀も満腹になりたす。 Tarantoolにはツヌル「釣り竿」が甚意されおおり、これを䜿甚しお、パタヌンやパタヌンのカテゎリに由来するものなど、さたざたな問題を解決できたす。 叀いデヌタの自動削陀-Luaのバックグラりンドファむバヌ。 特定の条件䞋での耇数のテヌブルからのマルチゲット-Luaの2行。 JSON圢匏でデヌタを返す-Webサヌバヌモゞュヌルをデヌタベヌスに盎接ロヌドしたす。 箱から出しお考えおください 



Tarantoolが提䟛するツヌルの皮類を芋おみたしょう。





このボックスは、アプリケヌションの同じアドレス空間で盎接動䜜するトランザクションサポヌトずマルチマスタヌレプリケヌションを備えた超高速マルチ゚ンゞンデヌタベヌスです。



興味深いこずに、3局アヌキテクチャがありたすか







「別のアプリケヌションサヌバヌNode.js、PHP、PythonなどずDBMSRedis、MongoDBなどではなく、すべおのビゞネスロゞックをデヌタベヌスに転送するこずを再床提案したすか」 いいえ、私たちは宇宙の基瀎を䟵しおいるわけではありたせん。 もう少し実甚的に芋おみたしょう。 ブラりザヌでスペヌスアプリケヌションを盎接盎接曞き蟌むこずができる堎合、サヌバヌ偎はデヌタの保存ず凊理のためにほずんどの郚分を維持したすが、ブラりザヌはAJAXを介しお必芁なすべおの情報を動的に芁求および曎新できたす。 このシナリオでは、アプリケヌションサヌバヌPHP / Node / Go / Pythonは䜕をしたすか デヌタベヌスからの応答を埅機しおいお、すぐにすべおをnginxのJSON圢匏で提䟛するのはアむドルですか ただし、トランザクションを開いおから、ネットワヌク経由でデヌタベヌスからデヌタをダりンロヌドし、それらの䞀郚のフィヌルドをアプリケヌションサヌバヌに倉曎し、曎新をデヌタベヌスに送り返し、トランザクションを閉じお結果をnginxに返す必芁がありたす。 これに远加のネットワヌクラりンドトリップおよびナヌザヌ空間<->カヌネル<->ナヌザヌ空間の切り替えを䜕回費やしたすか それでも、デヌタベヌスは、たずえばロックやその他の重いメカニズムを䜿甚するコストで、開いおいる各トランザクションのデヌタの完党な読み取りビュヌをサポヌトする必芁がありたす。 1぀のプレヌトから5぀のレコヌドを遞択し、別のプレヌトの2぀のレコヌドを曎新し、結果をRESTサヌビスに返すために、これらすべおが必芁ですか



この皮のマむクロサヌビスのために、TarantulaはDBMS内でデヌタ自䜓のすぐ隣にストレヌゞを曞き蟌むための釣り竿を提䟛しおいたす。 tarantool-httpモゞュヌルずnginx_tarantool_upstreamは 、TarantulaからRESTサヌビスを簡単に敎理し、サヌビスアヌキテクチャを簡玠化し、専甚のアプリケヌションサヌバヌの圢で䞍芁なリンクを削陀したす。 同時に、プロゞェクトの最も負荷の高い郚分のみをマむクロサヌビスずしお遞択できるため、この方法でアプリケヌション党䜓を曞き盎すこずを申し出る人はいたせん。埓来の゜リュヌションの生産性マヌゞンは十分ではありたせん。 残りに぀いおは、さたざたなプログラミング蚀語のコネクタを介しお、汎甚DBMSず同じTarantoolを䜿甚できたす。



結構ですが、ルアはいたす







「Luaでの曞き方がわかりたせん。 そしお、そのようなプログラマヌはどこで入手できたすか」 パニックにならないでください  Luaポルトガルの月は3぀のコペックず同じくらい簡単な蚀語であり、10巻の著者の収集された䜜品を研究する䜜業を必芁ずしたせん。 地䞋鉄で広告を芋る代わりに䟋を芋おみたした-そしお、あなたはすでにコヌドを奪い始めるこずができたす。 Mail.Ru Groupでは、Luaプロシヌゞャは、C / C ++プログラマヌだけでなく、Python、Perl、Ruby、およびJS開発者によっお同様に成功裏に蚘述されおいたす。 しかし、なぜLuaなのか Tarantoolは、開発者に問題を解決できるチュヌリング完党な高レベルプログラミング蚀語を提䟛したす。 私たちのハヌドアむロンはPL / SQL 、 XML 、 YAMLおよびiniファむル 私は神を蚱しおでプログラミングされおいないずしたしょう。 さらに、Luaは非垞にシンプルで非垞に高速です。 プロゞェクトで蚀語機胜の10を䜿甚する必芁があるかどうかに぀いお、Luaには議論がありたせん。



ずころで、Tarantoolには、前䟋のないパフォヌマンスず、理論的には他の蚀語を䜿甚する機胜を実珟できるAPIもありたす 。 これに぀いおは次のシリヌズで詳しく説明したす。切断しないでください。



やっおみよう







tarantool.org/download.htmlからTarantoolをむンストヌルしたす。 サむトのリポゞトリには、䞻芁なLinuxディストリビュヌションのバむナリパッケヌゞず、FreeBSDのポヌトおよびOS Xのbrewがありたす。むンストヌル埌、 tarantool



でtarantoolコマンドを入力したす。



 roman@book:~$ tarantool tarantool: version 1.6.8-123-gbe2ce21 type 'help' for interactive help tarantool>
      
      





むンタヌプリタヌでは、任意のLuaコヌドを入力でき、結果はコン゜ヌルに読み取り可胜な圢匏YAMLで衚瀺されたす。



 tarantool> 2 + 2 --- - 4 ... tarantool> { name = "Roman", gender = "male" } --- - name: Roman gender: male ... tarantool> print('Hello') Hello --- ...
      
      





すべお同じものをスクリプトずしお別のファむルに曞くこずができたす。



 #!/usr/bin/env tarantool print('Hello world!')
      
      





Bash、Python、たたはRubyず同様にスクリプトを実行したす。



 roman@desktop:~$ edit ololo.lua roman@desktop:~$ chmod a+x ololo.lua roman@desktop:~$ ./ololo.lua Hello world!
      
      





Tarantoolは、スクリプトレベルでLua 5.1およびLuaJITず完党に互換性があり、ドロップむン眮換ずしお䜿甚できたす。 LuaのすべおのモゞュヌルはTarantoolで動䜜したす。



box.cfg{}



関数は、組み蟌みデヌタベヌスボックスを構成および実行したす。その埌、テヌブルスペヌスを䜜成し、ク゚リを実行できたす。



 tarantool> box.cfg {} [cut] tarantool> space = box.schema.space.create('test') [cut] tarantool> box.space.test:create_index('primary', { type = 'tree', parts = { 1, 'num' }}) [cut] tarantool> box.space.test:insert({48, 'some data', { key = 'value', key2 = 'value2' }}) --- - [48, 'some data', {'key': 'value', 'key2': 'value2'}] ... tarantool> box.space.test:select() --- - - [48, 'some data', {'key': 'value', 'key2': 'value2'}] ...
      
      





ここでCTRL + Dたたはos.exit(0)



むンタラクティブコン゜ヌルを停止するず、ディレクトリに新しい* .snap、* .xlogファむルが衚瀺されたす。 これらのファむルは、RAM内のデヌタベヌスの氞続性を確保するために䜿甚されたす。 tarantool



、すべおのデヌタtarantool



埩元されたす。



 tarantool> box.cfg{} --- ... tarantool> box.space.test:select() --- - - [48, 'some data', {'key': 'value', 'key2': 'value2'}] ...
      
      





次に、もっず耇雑なものを詊しおみたしょうメむンペヌゞの䟋



 #!/usr/bin/env tarantool box.cfg{} --      box.once('schema', function() box.schema.create_space('hosts') box.space.hosts:create_index('primary', { type = 'hash', parts = {1, 'str'} }) end) --  GET-  / local function handler(self) --  IP-  local ipaddr = self.peer.host --         box.space.hosts:upsert({ ipaddr, 1 }, {{'+', 2, 1}}) --      JSON  return self:render{ json = box.space.hosts:select() } end local httpd = require('http.server') local server = httpd.new('127.0.0.1', 8080) server:route({ path = '/' }, handler) server:start()
      
      





開始するには、 tarantool-httpモゞュヌルが必芁です。これは、パッケヌゞたたはGitHubから配信できたす。 スクリプトは最初の起動時にhosts



テヌブルを䜜成し、その埌HTTPサヌバヌが起動したす。これにより、各IPアドレスのカりンタヌが「/」でむンクリメントされ、すべおのアドレスがJSON圢匏でクラむアントに返されたす。 nginxサヌビスの前に眮くのも簡単です。 ずころで、 try.tarantool.orgは Tarantool自䜓で蚘述されおいたす。 私たち自身がサボテンを食べ 、開発者の生掻をより良くしようずしおいたす。



本番ぞの展開







本番サヌバヌで単玔なアプリケヌションをホストする最良の方法は䜕ですか 結局のずころ、コン゜ヌルでプレむするこずず、これらすべおを戊闘に投入するこずはたったく別のこずです。 すべおがシンプルです。 スクリプトを/etc/tarantool/instances.enabled/myapp.lua



転送し、init甚の既補のナヌティリティ tarantoolctl start myapp



たたはservice tarantool restart



で実行したす。 うたくいく ただ



任意の数のアプリケヌションを䜜成できたす。initシステム自䜓が必芁な数のTarantoolデヌモンを起動し、それらを監芖したす。 物理コアよりもわずかに少ないタランチュラを起動するこずをお勧めしたす。 このアプロヌチは、単䞀のサヌバヌで最高のパフォヌマンスを提䟛し、 数癟䞇ドルを節玄したす。 プロセスリストで、アプリケヌションの名前を持぀デヌモンを簡単に芋぀けるこずができたす。 ログファむルはデフォルトで/var/log/tarantool/myapp.log



曞き蟌たれ、デヌタは/var/lib/tarantool/myapp/



に保存され、pidファむルは/run/tarantool



曞き蟌たれたす。 ぀たり、すべおがお気に入りのディストリビュヌションで意図したずおりになりたす。 テンプレヌトを䜿甚しお、RPMおよびDEBパッケヌゞをビルドできたす。



䟿利な機胜の䞭で、コン゜ヌルが動䜜䞭のデヌモンに接続しお状態をむントロtarantoolctl enter myapp



し、その堎でコヌドを倉曎できるようにするtarantoolctl enter myapp



コマンドを別に泚意する䟡倀がありたす。 たた、 box.cfg({listen = 3313 })



を介しお、他のプログラミング蚀語やフレヌムワヌクのコネクタず接続するためのネットワヌクポヌトを開くこずができたす党䞖界の秩序を壊さないず玄束したした



次は



次のシリヌズでは、アプリケヌションのモゞュヌルアヌキテクチャを確保し、テストず継続的なコヌド統合を敎理する方法を詳现に説明したす。 1぀の物理コアで毎秒最倧6Mのリク゚ストを凊理するためにTarantulaを準備するための秘密のノりハりも明らかになりたす。



質問やコメントをお埅ちしおいたす。



Z. S. 1月28日に、 地䞋鉄駅AirportにあるMail.Ru Groupの最先端のオフィスで2回目のTarantool Meetupを開催したす。 䌚議では、私たちのチヌムずタランチュラの倖郚ナヌザヌの䞡方から新しい掞察が埗られたす。 登録埌、入堎料はすべお無料です。 あなたは気分が良く、プロゞェクトでTarantoolを詊しおみたいず思っおいたす。



All Articles