Tarantool 1.6をマスターする



エフゲニー・シャドリン(Sberbank Digital Ventures)


過去数年のニュースを追跡すると、新しいNoSQLソリューション、いくつかのリリースがほぼ2週間ごとに表示されることがわかります。 もちろん、それらの多くは存続せず、競争に負け、消滅しますが、NoSQLの世界は頻繁に新しいソリューションで補充されます。

会議では、人生でNoSQLを使用したことのない人と、プロジェクトや企業で5年以上NoSQLを使用している人がいます。 オープンソースプロジェクトに参加する人もいます。 それらは少数ですが、そのようなものもあります。

私の名前はユージーンです。 私はSberbank Digital Venturesの小さな支店で働いています。SberbankDigital Venturesは、革新的な製品とソリューションの実装に取り​​組んでいます。 私たちは、新しい技術の接点でITプロトタイプを作成します。

このレポートでは、ユーザー側でNoSQLソリューションを使用する場合について説明したいので、最初は理論について簡単に説明します。

NoSQLとは何ですか?



私は頭字語をSQLだけでなく、つまり使用しています。 SQL だけではありません 。 これらは、リレーショナルとは異なり、いくつかの問題を解決するために設計されたデータモデルを含むソリューションです。 たとえば、スケーリングの容易さの問題。 多くの場合、データを保存および操作するためのNoSQLソリューションは、特定のスキーム、エンティティ、および多くの構成を指定する必要がないため、スケーリングの問題を解決し、多数のノードを持つ大規模なクラスターを展開し、これらのノードを追加および削除することは非常に簡単で簡単です。 また、NoSQLソリューションは多くの場合非常に専門化されています。 各開発チームは常に大規模な普遍的なプロジェクトを作成しようとするのではなく、問題を解決しようとします。 このようなソリューションの特殊化により、特定のタスクで非常に高いパフォーマンスインジケーターを実現できます。 このようなタスクでは、NoSQLソリューションを使用すると便利で簡単になります。



ここでは、最も人気のあるデータベースを分類順に示しました。 RedisリポジトリとRiakリポジトリのKey-Valueについて聞いたことがあります。これらは、Key-Valueモデルを使用してデータを保存します。 MongoDBのドキュメント指向データベースは非常に一般的で有名です。 ドキュメント指向モデルは、キー値モデルよりもやや複雑であり、非常に大きな階層情報を保存できます。 さらに、表形式のマトリックスデータベース(Apache HBaseなど)があります。 彼らは多くの分散情報を扱うことができます。 それとは別に、OrientDBは際立っています-マルチパラダイムをサポートするデータベースですが、グラフモデルをサポートするデータベースの例として挙げました。 グラフモデルには利点があります。データ間の関係を追跡することは非常に便利です。これは、ソーシャルネットワークに似たプロジェクトで作業する場合は悪くありません。

こうした多様性の中から、自分に合ったソリューションを選択する方法は? 私は次の原則を使用します。




また、NoSQLが解決するケースの簡単なリスト。



私はそれらのほとんどに個人的に出会った。


もちろん、ケースはもっと多くありますが、私が遭遇したケースについて話しました。 一般に、Sberbank Digital Venturesでは、リアルタイムで動作し、サーバーから情報を受信、保存、処理、内容を理解し、サーバーに正しい答えを提供することを主な目的とするシステムを開発しています。

たとえば、インターネットのどこかを歩いているユーザーに関する必要な情報を取得します。 収集、分析できるすべてのデータを取得し、ユーザーをセグメント化して、1つまたは別のカテゴリ、つまり たとえば、これは車に興味がある25歳の若者、または大学に進学して入学のために賄briを受け取る場所を探している18歳の少女です。



私の問題を解決するために、NoSQL Tarantoolデータベースを使用します。 将来的には、なぜそれを使用するのか、なぜ使用するのか、そして目の前で発生する問題の解決にどのように役立つのかを説明します。

スライドには、開発者サイトのメインページからの引用があります。これはプロジェクトの位置付けです。 「Luaアプリケーションサーバーで実行されているNoSQLデータベース」、つまり 開発者自身がTarantoolを2つの部分で構成されるプロジェクトとして位置付けています。最初の部分は非リレーショナルデータベースであり、2番目の部分はLuaアプリケーションサーバーです。 Lua言語を使用するアプリケーションサーバー。

ところで、最近のほとんどのNoSQLデータベースアイコンはグレーと赤の色を使用していることに注意してください。 これはおそらくトレンドにあります=)

さらに、コード例を示します。 誰かに機会があれば、サーバーtry.tarantool.orgへのリンクをたどることができます。これは、Tarantoolをすぐに使用できるインタラクティブなサービスです。 これは一種のインタラクティブなTarantoolであり、開発サーバーで際立っています。 おそらく誰かがそこにコード例を駆動したいと思うでしょう。

TarantoolをNoSQLテクノロジーの大規模なスタックと区別するものは何ですか?



Tarantoolはすべてのデータをメモリに保存するため、すぐにアクセスできます。 Tarantoolがメモリにそれらを保存するという事実は、それが安全ではなく、データを失う可能性があることを意味しません。 Tarantoolには、ログとバイナリ状態のスナップショットというデータストレージメカニズムがあります。 これらの2つのメカニズムは連携して機能します。保存されたデータと、このデータを使用して前後に実行されたアクションの説明を含むポイントがあります。 この情報により、いつでも正しい状態に到達できます。

かつて、データをメモリに保存すると、このメモリが非常に早く終了するという事実に至りました。 現在は終了していますが、それでもRAMの量は絶えず増加しており、同様のデータベースはより広範なアプリケーションを取得しています。 Tarantoolはドキュメントベースのデータモデルを使用しています。 彼はすべてのデータをドキュメントと呼ばれる抽象概念に保存します。 このドキュメントには独自のフィールドがあり、Tarantoolで使用できます。

データベースとしてのTarantoolの機能の1つは、セカンダリインデックスの可用性です。 セカンダリインデックスが存在することで、データを使ったアクションをより活発に、興味深く、より速くすることができます。

私はプロジェクトでトランザクションをまだ使用していませんが、Tarantoolは本格的なトランザクションをサポートしています。 私が知る限り、一部の企業(AvitoのMail.Ru Group)では、それらを使用して問題を解決しています。 Tarantoolには、軽量スレッドまたはグリーンスレッドのモデルがあります。 これはマルチスレッドモデルであり、Unixレベルではなく、アプリケーション自体の内部でスレッドのみが作成されます。これにより、何らかの非同期イベントイベントモデルを実装できます。

Tarantoolはネットワークとファイルでも動作します。独自のHTTPサーバー、ファイルを保存および開く独自のライブラリを備えています。 また、問題の解決にも役立ちました。

TarantoolはLuaアプリケーションサーバーであり、LuaはTarantool埋め込み言語です。 ここでは、Luaが何であるかを示すために実際には絶対に使用されない非常に人工的なスクリプトの例を示しました。

#!/usr/bin/tarantool -- This is lua script function hw(a, b) print (a.hello..b.world) end b = {} a = { hello = 'Hello ' } b['world'] = 'world!' hw(a, b) 

Lua言語はブラジルのカトリック大学で開発されました。 これは、データを処理し、データベースを処理するために強化されたSOL言語から来ました。 ここで、これは単なるスクリプトではなく、実行可能なスクリプトであることがわかります。 ポンド記号と感嘆符は、このスクリプトを誰がどのように実行するかを指定できるメカニズムです。 コンソールにtarantool script.luaと入力すると、画面にhello worldが表示されます。 ここでは、2つのオブジェクトで機能する関数を参照し、以下ではこれらのオブジェクト自体を初期化します。

Luaの主なデータ構造はテーブルです。 オブジェクトabはテーブルであり、Luaが非常に柔軟で構文的に優れていることを示すために、意図的に異なる方法で初期化しました。 これらのテーブルには、他のデータが含まれている場合があります。たとえば、同じテーブルに他のデータが含まれている場合があります。 時々、経験の浅さが非常に大きなネストを構成していました。 関数はテーブル内に保存することもできます。 一般に、テーブルと同様に「関数」オブジェクトを操作することもできます。これにはメソッドがあります。

さらに、制作の一部で変更および使用できる、より実用的なスクリプトの例を示します。 彼は小さな問題を解決し、非常に簡単に解決します。彼はページ上のユニークビジターの数を考慮します。

 #!/usr/bin/tarantool -- Tarantool init script local log = require('log') local console = require('console') local server = require('http.server') local HOST = 'localhost' local PORT = 8008 box.cfg { log_level = 5, slab_alloc_arena = 1, } console.listen('127.0.0.1:33013') if not box.space.users then s = box.schema.space.create('users') s:create_index('primary', {type = 'tree', parts = {1, 'NUM'}}) end function handler(self) local id = self:cookie('tarantool_id') local ip = self.peer.host local data = '' log.info('Users id = %s', id) if not id then data = 'Welcome to tarantool server!' box.space.users:auto_increment({ip}) id = box.space.users:len() return self:render({ text = data}): setcookie({ name = 'tarantool_id', value = id, expires = '+1y' }) else local count = box.space.users:len() data = 'You id is ' .. id .. '. We have ' .. count .. ' users' return self:render({ text = data }) end end httpd = server.new(HOST, PORT) httpd:route({ path = '/' }, handler) httpd:start() 

これは、いわゆる実行可能なLuaスクリプトであり、Tarantoolで起動され、それに埋め込まれた一連のアクションを実行します。

ここにあるもののブロックを簡単に見てから、詳細を分析します。

上部で、必要なメカニズム(ログ、コンソール、サーバー)を介して必要なパッケージを接続します。 使用するいくつかの定数を定義します。

次のステップは、 box.cfgモジュールを使用してTarantoolデータベースを構成することです。ここで、必要な2つのパラメーターを設定します。 コンソールを起動し、 box.schema.space.create('users')を使用してデータベースエンティティを作成します。 ユーザースペースを作成しました。 これについては少し後で説明します。

スクリプトの2番目の部分はTarantoolサーバーで動作しています。 handler関数(要求ハンドラー)について説明し、以下でサーバーを作成し、処理用のrouteを作成してこのサーバーを起動します。

ユーザー側から見ると、このスクリプトの実行結果は次のようになります。



ユーザーは、たとえばlocalhostにログオンし、ウェルカムメッセージを見ました。 将来、彼がページを更新すると、彼はすでにcookieへのリンクを持ち、ある種のidが割り当てられ、このページにアクセスしたユニークユーザーの数がわかります。

この小さなスクリプトは、私が必要とするいくつかの問題を解決します-これは、なぜLua言語を使用するのかという質問に対する答えです。

Lua言語は非常にシンプルです。 「15分でルア」、「30分で」という記事がすべてあります。この興味深い言語に慣れるには、少しだけ必要です。 数時間で、そのすべての機能を学習します。

主なデータ構造がテーブルであると非常に便利です。 これにより、他のすべてのデータを均一に処理できます。

標準のLuaインタープリター自体は非常に高速ではなく、むしろ非常に高速ではありませんが、JITコンパイルを行う同様のLuaJITインタープリターがあり、はるかに高速です。 Luaを非常に生産的な言語にするのは彼です。

機能的なスタイルでLuaでプログラムできるようにするluafunライブラリがあります。 LuaJITのおかげで、このライブラリは非常に高速です。 あなたはグーグル、それについて読んで、そのパフォーマンスに関するレビューを見ることができます-非常に興味深い。

Luaは埋め込み言語としても非常に優れており、C言語との優れた統合性を備えています。 有名なWorld of Warcraftゲームの非常に多くの拡張機能、クエスト、およびさまざまなゲームメカニクスとロジックは、Luaで記述されています。

Tarantoolは本格的なLuaインタープリターです。 Tarantoolを起動しただけであれば、Luaを簡単に使用できます。



Tarantoolは、2つのエンティティで起動できます。


上記のinit.lua起動スクリプトの例をさらに詳しく見てみましょう。



作業は、その構成を持つデータベース、つまり box.cfgメカニズムは、内部にcfgラベルを含むboxパッケージであり、いくつかのパラメーターを設定できます。 ボックスはボックスです。 このパッケージは、データベースを直接管理します。 Tarantoolの起動、プロシージャ、関数の実行、メッセージの書き込みなどを実行できますが、 box.cfgを構成しないとデータベースは起動しません。 この場合、表示したい2つのパラメーターを設定します。 まず、印刷されるログのレベルを設定します-これは5番目のレベルであるDEBUGです。 また、非常に重要なパラメーターslab_alloc_arena設定しました。これは、割り当てとデータ配置のためにTarantoolで、より正確にはRAMで割り当てられるメモリです。 この場合、「1」は1 GBです。

ボックスパッケージには、次のような多くの他の補助的なものとツールも含まれています。



パラメーターを設定した後にTarantoolインタープリターでbox.cfgとbox.cfgすると、そこにあるすべてのパラメーターの説明を含むオブジェクトが取得されます。設定したパラメーターだけでなく、デフォルトで設定されているパラメーターもあります。

ここで、 slab_alloc_arena -1 GBの割り当てスペース、5番目のレベルlog_level (DEBUG)、重要なパラメーターsnapshot_countが設定されていることがわかります。これはTarantoolが保存するスナップショットの数です。 この場合、特定の期間に撮影された最新の6枚の写真が保存されます。 ところで、この期間はまた、 snapshot_periodパラメーターを使用してここで設定されます。 デフォルトでは、その値は3600秒です。 Tarantoolは1時間に1回スナップショットを撮ります。 自分で必要なセキュリティレベルを選択することができ、少なくとも1秒ごとまたは1分ごとに写真を撮ることができますが、リソースを非常に占有します。 snap_dirおよびwal_dir 、スナップショットとログをそれぞれ保存する場所を決定します。



次に、 box.infoパッケージの例をbox.infoます。 ここでは、Tarantoolに関する情報、つまり Tarantoolがデーモンとして実行されている場合、そのpid、バージョン(現在、バージョン1.6.5が関連しています)、稼働時間、およびマシンのステータスを確認できます。

データを設定したら、Tarantool内のエンティティ自体、データ自体の作成に進むことができます。



ここで、ドキュメントから写真を取りました。 これは、Tarantoolデータモデルの画像です。 Tarantoolでは、データはスペースに格納され、各スペースにはタプルエンティティがあります。これらは、プライマリまたはセカンダリの指定したレコードとインデックスです。

構成が完了したら、データベースの入力に進みます。 ユーザー情報を設定するスペースが必要です。



この情報を条件付き構造に入れていることに気づくかもしれません。 これは特定の目的のために行われました:何らかの理由でTarantoolが停止し、保存された画像とログで再起動した場合、起動前に状態を復元します。 スナップショットを取り、xlogからアクションを実行します。 この方法で実行すると、必要なユーザースペースを作成できませんが、ほとんどの場合は必要ないため、エラーが発生しないようにこのようなチェックを挿入することが非常に多くあります。 そのようなスペースを作成していない場合は、スペースとそのインデックスを作成します。 この場合、これはprimary -単一の数値であるツリー形式のプライマリインデックス。

将来、スクリプトに新しいユーザーエントリを追加する必要があります。 キーと値のペアを渡す標準のinsert操作を使用してこれを行うことができますが、私の場合、この単純なスクリプトではauto_incrementを使用してこれを行うのが便利auto_increment 。 ユーザーはログインし、その時点でデータベース内のレコード数よりも1つ多くキーが自動的に割り当てられます。 データベース内のレコード数を調べたい場合は、標準のlen()メカニズムを使用できます。 ご覧のとおり、構文は非常にシンプルで簡単です。



前述のように、Tarantoolは単なるデータベースではなく、本格的なLuaアプリケーションサーバーです。 おそらく、ここでの開発者は、Luaで任意のモジュールとパッケージを作成し、それによって必要なロジックを実装できることを意味しました。 実際、あなたは大きな自転車を発明しません-あなたが本当にそれを必要とするか、他のソリューションで必要としないなら、あなたはいくつかの小さな自転車を発明することができます。

これらはすべて、GitHubのリポジトリで確認できます。 何らかの形で使用される主なモジュールは、httpとキューです。 たとえば、 try.tarantool.orgは完全にTarantoolで記述されており、TarantoolサーバーであるTarantoolリポジトリを使用します。 Tarantoolは、LuaRocksもサポートしています。LuaRocksは、そのリポジトリと連携し、パッケージのインストールに非常に便利なパッケージマネージャーです。 これは1つのチームによって行われます。



パッケージ。 パッケージを接続する必要があります。

パッケージとは、何らかのロジックを実装する他のLuaスクリプトを指します。 このパッケージを接続すると、このファイルからメソッド、このファイルからのデータ、変数を取得できます。 この例では、Luashメカニズムのrequireメカニズムを使用して、 consolelog 2つのパッケージを接続します。

localhostでconsoleを実行し、ポート33013でハングさせlogパッケージを使用して、 log書き込むことができます。 ここでコンソールとは、管理者コンソールまたはリモート管理コンソールを意味し、Tarantoolのステータスを監視できます。 これを行うのは難しくありません。コンソールが実行されている場合は、標準のUnixツールまたはその他のツール(telnetやrlwrapなど)が適しています。 ポートに接続してリッスンするにはtelnetが必要です。コマンドの便利な入力とコマンドの履歴の保存にはrlwrapが必要です。

自分に合ったTarantoolにアクセスして、 box.infoまたはbox.statからの情報をbox.infoできbox.stat



私が使用し、非常に頻繁に必要なパッケージはhttpです。 これはまだ制限されたHTTPサーバーですが、必要なメカニズムの多くで機能します。 この場合、パッケージを接続し、サーバーを作成し、処理用のrouteを切断して起動しました。 次に、 handler関数で、テキスト情報の形式でサーバーに応答を返しcookieユーザーtarantool_idvalue = id cookie設定cookieます。 また、有効期限も設定します。 除去時間; cookieはここに保存されます。



httpパッケージの基本的なメカニズムにより、最小限のロジックを実装できます。 非常に完全なサーバーがあり、クライアントがあります。 このパッケージはCookieで動作し、Luaをテンプレート内の一部の変数のある種の埋め込み可能言語としてサポートします。 LuaのHTML内に小さなプロシージャを作成できます。

 #!/usr/bin/tarantool -- Tarantool init script local log = require('log') local console = require('console') local server = require('http.server') local HOST = 'localhost' local PORT = 8008 box.cfg { log_level = 5, slab_alloc_arena = 1, } console.listen('127.0.0.1:33013') if not box.space.users then s = box.schema.space.create('users') s:create_index('primary', {type = 'tree', parts = {1, 'NUM'}}) end 

このスクリプトの要点を説明しようとしたので、既に明確になっているはずです。 修正するには、もう一度歩くことができます。 コメント付きの実行可能なTarantoolスクリプトがあります。 次に、 requireを介してパッケージを接続します。 HOSTPORT 2つの変数があります。 次に、Tarantoolがbox.cfgを介して構成され、 log_level (ロギングレベル)とslab_alloc_arena (割り当て用のスペース)の2つのパラメーターを設定します。

使用する管理コンソールを作成しています。 さらに、必要なスペースがない場合は、 box.schema.space.createを使用してusersスペースを作成し、そのインデックスを作成します。

 function handler(self) local id = self:cookie('tarantool_id') local ip = self.peer.host local data = '' log.info('Users id = %s', id) if not id then data = 'Welcome to tarantool server!' box.space.users:auto_increment({ip}) id = box.space.users:len() return self:render({ text = data}): setcookie({ name = 'tarantool_id', value = id, expires = '+1y' }) else local count = box.space.users:len() data = 'You id is ' .. id .. '. We have ' .. count .. ' users' return self:render({ text = data }) end end httpd = server.new(HOST, PORT) httpd:route({ path = '/' }, handler) httpd:start() 

処理機能では、ページにアクセスしたユーザーが保持するcookieを取得します。 私は彼のIPを見て、ログに書き込みます。 id tarantool_idにない場合、このユーザーのIP情報を自動的にデータベースに入力し、そのidを確認してウェルカム情報dataを返し、 cookieid設定します。 それ以外の場合は、テーブル内のレコードの数をカウントし、ユーザーに一意の訪問者の数を返すだけです。 そして最後に、関数を説明したときに、サーバー自体を起動して、既にそれを使用しています。

これは簡単な例ですが、モジュールとLua言語のアクセスの拡張性のおかげで、追加、追加、追加ができ、しばらくすると実際のプロジェクトで使用される状態になります。



Tarantoolにはさまざまなパッケージがあります。 JSONを操作するためのパッケージ、ファイバーパッケージ(以下でもう少し詳しく説明します)、yaml、暗号ライブラリダイジェスト(基本的な必要な暗号化メカニズムが含まれています)があります。 ノンブロッキングソケットのパッケージがあり、ネットワークで自分で作業し、いくつかのプロトコルを実装できます。 MessagePackには作業があり、ファイルを操作するためのライブラリfio(ファイル入力/出力)があります。 また、Tarantoolがバイナリプロトコルで動作することを可能にする興味深いnet.boxメカニズムがあります-たとえば、別のTarantoolで。 非常に迅速かつ便利です。 Net.box.sqlは、一部のリレーショナルSQLデータベースを操作するためにも実装されています。



ファイバーはいわゆるライトスレッドで、グリーンスレッドモデルに従って機能します。 それらと標準フローの主な違いは、それらが作成され、Tarantool内で動作することです。したがって、それらは十分に迅速に作成され、優れたスイッチングパフォーマンスを備えています。 何らかの非同期モデルを実装している場合や、メインロジックと並行して何か他のことをしているデーモンを起動する必要がある場合に役立ちます。

ファイバーを使用する基本的な原則:ファイバーを作成する必要があります。ファイバーをfiber.sleepでスタンバイモードにできます。また、fiber_objectはfiber.createです。いつでもスキャンして作業を終了できます。

非常に便利なfiber.timeライブラリ。これは、時間をカウントするイベントループから目的の値を常に推測できます。

ファイバーライブラリを使用して、非常に人気のある期限切れのライブラリが作成されました。これは、何らかの理由でデータベースから削除を実行できます。 通常は今回、つまり 1か月など、保存されているすべてのものを削除してクリーニングできます。

あなたはタランツールについて長い間話すことができます、私たちもすべてを知っているわけではありません。 開発者自身が彼についてすべてを知っているかどうかはわかりません。 tarantool.orgのドキュメントをいつでも読むことができますが、最近変更され、より読みやすくなりました。



Tarantoolは、ほとんどのUnixライクシステムをサポートし、独自のBuildbotを備えており、新しいパッケージの出現を常に監視しています-Red Hat Enterprise Linuxで作業しています。 また、Tarantool開発者は、同じDebianでTarantoolパッケージを公式にサポートしています。

そして、私が気に入っている非常に重要な点:Tarantoolでは、開発者とのコミュニケーションが可能です。 質問がありましたが、Skypeで開発者を見つけました。 Tarantoolのチーフ開発者であるKostya Osipovは、この会議のキューに関する短いレポートを読みました。 開発者、特に初心者にとって、アドバイスを求め、これを行う方法を直接学ぶことが非常に重要です。 あなたは、オープンソースアプリケーションを開発する人たちが非常に独特であり、彼らが非常に独特なコミュニティを持っていることを覚悟しなければなりません。 おそらく、この写真は私ができる以上のことを言うことができます:



しかし同時に、コミュニティでのコミュニケーションは非常に興味深い経験となり、自分自身を成長させ、プロジェクトを少し良くすることができます。

最後に、レポートを要約したいと思います。



各NoSQLソリューションには、独自のアプリケーション分野があります。 どのベースが良いか悪いか、どちらが生産的であるかを言うのは非常に難しい場合がよくあります。 彼らは本当にさまざまな問題を解決します。

開発ツールは非常に重要です。正しく選択されたツールを使用すると、迅速かつ簡単に開発でき、多くの問題を回避できます。 しかし、より重要なのはアイデア、目標であることを忘れないでください。 それでも、各開発者の課題は、問題を解決し、彼のアイデアの一部を実現し、この世界を少し良くすることです。

Tarantoolが完全に単純であり、使用することもできることをお見せできたことを願っています。 ご清聴ありがとうございました。

このレポートは、負荷の高いシステムHighLoad ++ Juniorの開発者のトレーニング会議で行われた最高のプレゼンテーションの1つです。

また、これらの資料の一部は、高負荷システムHighLoadの開発に関するオンライントレーニングコースで使用されますガイドは、特別に選択された文字、記事、資料、ビデオのチェーンです。 私たちの教科書にはすでに30以上のユニークな資料があります。 接続してください!

さて、主なニュースは、 HighLoad ++ Juniorを含む8つの会議を含む春祭り「 Russian Internet Technologies 」の準備を開始したことです。

Source: https://habr.com/ru/post/J319968/


All Articles