Tarantool 1.6-さあ始めましょう

少し前まで、NoSQLベースに関する記事がHabréに掲載されました- 「一人称のTarantool 1.6」 。 このデータベースはそのサークルでよく知られており、すでに人気を集めていると確信しています。 また、タランツールを実際に試してみたいと思っている初心者もいます。 この興味深い製品に慣れるために、簡単な例を挙げたいと思う人向けです。 記事の名前が示すように、これはTarantool 1.6です。



インストールする



プロジェクトWebサイトでは、さまざまなシステムのインストールオプションについて詳しく説明しています。 Ubuntuの場合、次のようになります。



wget http://tarantool.org/dist/public.key sudo apt-key add ./public.key release=`lsb_release -c -s` cat > /etc/apt/sources.list.d/tarantool.list <<- EOF deb http://tarantool.org/dist/master/ubuntu/ $release main deb-src http://tarantool.org/dist/master/ubuntu/ $release main EOF sudo apt-get update sudo apt-get install tarantool
      
      





こんにちは世界!



Tarantoolは、組み込み言語としてLuaを使用します(LuaJIT 2.0に基づくLua 5.1)。 lua言語は複雑ではありません。 ここまたはHabrの出版物「Lua in 15 minutes」でその基本をすばやく学ぶことができます。 TarantoolをLuaインタープリターとして使用できます。



 $ /usr/bin/tarantool /usr/bin/tarantool: version 1.6.4-509-ga4af00e type 'help' for interactive help tarantool> 2 + 3 --- - 5 ... tarantool> print ('Ola lua!') Ola lua! --- ...
      
      





Luaのスクリプトを使用して独自のロジックを作成することもできます。 Tarantoolを起動して「Hello world」を出力するための開始init.luaを作成しましょう。



主なtarantoolライブラリの1つはboxです。 box.cfg(lua {...}はテーブル)を使用して、起動構成を作成します。



 box.cfg { listen = 3311, logger = 'tarantool.log', }
      
      





Tarantoolはポート3311で起動され、ログをtarantool.logに保存します。



hello()関数を作成しましょう

 local function hello() print ('Hello world!) end hello()
      
      





開始して確認します。



 $ tarantool init.lua Hello world!
      
      





データベース



tarantoolでは、タプルはスペースに格納されます-テーブルの一種です。



ツリーを使用してインデックスを保存するテストスペースとその中にプライマリ(プライマリ)インデックスを作成します(レコードのすべてのフィールドにセカンダリインデックスを作成することもできます)。



 s = box.schema.space.create('test') p = s:create_index('primary', {type = 'tree', parts = {1, 'NUM'}})
      
      





テストをフォーム{key、number}のレコードで埋めます:



 for i = 1, 10 do s:insert({i, i}) end
      
      





この場合、sオブジェクトはbox.space.testオブジェクトへの参照です。 したがって、次のように書くことができました。



 box.space.test:insert({i, i})
      
      





ところで、tarantoolを再起動すると、次のようなエラーが発生する場合があります。



 $ tarantool init.lua Hello world! main/101/init.lua F> Space 'test' already exists
      
      





TarantoolはすべてのデータをRAMに保存します。 それらを保持するために、Tarantoolはスナップショットとバイナリログ(xlog)を取得します。 このエラーは、起動時にTarantoolが.snapファイル(スナップショット)および.xlog(デフォルトでは作業ディレクトリにある)を使用して最後に使用したデータをダウンロードするために発生します。 したがって、テストスペースはすでにデータベースに存在しています。 .snapおよび.xlogを起動するたびに削除するか、スペースの存在のチェックを追加できます。



 s = box.space.test if not s then s = box.schema.space.create('test') p = s:create_index('primary', {type = 'tree', parts = {1, 'NUM'}}) for i = 1, 10 do s:insert({i, i}) end end
      
      





データが保存されたかどうか、Tarantoolを実行する際の設定を確認することは非常に良いことです。 このために、管理者用のコンソールが提供されています。 一般に、luaでは、さまざまなモジュール、組み込みパッケージ、およびその他のファイルをコードで接続する実装は、requireメカニズムを介して行われます。



 local console = require('console') console.listen(127.0.0.1:3312)
      
      





Tarantoolの起動後、nc / telnetおよびrlwrapユーティリティ(便宜上)を使用して、ポート3312で管理コンソールに接続できます。 接続することで、Tarantoolを直接操作できます。 たとえば、テストスペースのデータを見てみましょう。



 $ rlwrap nc 0 3312 Tarantool 1.6.4-509-ga4af00e (Lua console) type 'help' for interactive help box.space.test:select() --- - - [1, 1] - [2, 2] - [3, 3] - [4, 4] - [5, 5] - [6, 6] - [7, 7] - [8, 8] - [9, 9] - [10, 10] ... box.space.test:get(6) --- - [6, 6] ...
      
      





Tarantoolの構成パラメーターを見てみましょう。



box.cfg
 box.cfg --- - snapshot_count: 6 too_long_threshold: 0.5 slab_alloc_factor: 2 slab_alloc_maximal: 1048576 background: false logger: tarantool.log slab_alloc_arena: 1 sophia: page_size: 131072 threads: 5 node_size: 134217728 memory_limit: 0 listen: '3311' logger_nonblock: true snap_dir: . coredump: false sophia_dir: . wal_mode: write slab_alloc_minimal: 64 panic_on_snap_error: true panic_on_wal_error: true rows_per_wal: 500000 wal_dir: . log_level: 5 readahead: 16320 snapshot_period: 0 wal_dir_rescan_delay: 0.1 ...
      
      







したがって、スペースを作成したら、次のタスクを実行します。キーが5を超えるレコードでは、保存されている数値の値を10増やします。

必要な選択には、 box.indexライブラリを使用します。



 for k,v in box.space.test.index.primary:pairs(5, {iterator = box.index.GT}) do s:update(v[1], {{'=', 2, v[2] + 10}}) end
      
      





box.space.index.primary-テストスペースとそのプライマリインデックスを操作することを意味します。

ペア()は、反復子(ループ内の変数k)と値のテーブル(一連のレコードvで構成される)を返す反復関数であり、キー(5)の入力値を受け取ります-反復と反復子のタイプを開始します。

iterator = box.index.GT-GTイテレーター(より大きい)は、指定されたキーより大きいキーを持つレコードを返します。

update()-データベース内のレコードを更新し、レコードキーの値(v [1])を取得します。

{'='、2、v [2] + 10}-2番目の値のv [2] + 10への更新( '=')を示します。



管理コンソールを使用して、スペースの値を見てみましょう。



 box.space.test:select() --- - - [1, 1] - [2, 2] - [3, 3] - [4, 4] - [5, 5] - [6, 16] - [7, 17] - [8, 18] - [9, 19] - [10, 20] ...
      
      





init.luaスクリプトの一般的なコード:
 --  init c  tarantool --       --     local console = require('console') --    console.listen('127.0.0.1:3312') --  tarantool box.cfg { listen = 3311, logger = 'tarantool.log', } local function hello() print ('Hello world!') end --   hello hello() --     space,    s = box.space.test if not s then s = box.schema.space.create('test') --   p = s:create_index('primary', {type = 'tree', parts = {1, 'NUM'}}) for i = 1, 10 do s:insert({i, i}) end end --      ,     5 for k,v in box.space.test.index.primary:pairs(5, {iterator = box.index.GT}) do s:update(v[1], {{'=', 2, v[2] + 10}}) end
      
      







もちろん、Tarantoolを完全にマスターするには、その微妙さを知るために、プロジェクトのWebサイトでドキュメントを読む必要があります。 実際、すべてに加えて、Tarantoolはデータベースであるだけでなく、luaアプリケーションサーバーでもあります。 たとえば、 httpサーバーキューがあります 。 しかし、最初の一歩を踏み出しました-Tarantoolの小さなスクリプトを作成しました。



Habréの他の記事でTarantoolについて読むこともできます(例ではプロジェクトの古いバージョンがあります)。

「タランツール+ Luaの学習」

「Tarantoolのユニークな機能。」



インストールなしでtry.tarantool.orgでTarantoolを試すこともできます。



All Articles