NoSQLテクノロジー用のリレーショナルDBMSのテスト経験を活用

Tarantoolは、オープンで高性能なデータウェアハウスです。 シンプルさとパフォーマンスなどのシステムの特性は、主にその適用範囲を決定します。 データストレージソリューションの規模では、TarantoolはMySQLのような従来のリレーショナルシステムとmemcachedのようなデータキャッシュソリューションの中間に位置しています。 このシステムは、永続的なデータウェアハウスに基づいており、RAMに完全にマップされ、ハッシュとバイナリツリーに基づいてデータにアクセスするための高性能なインデックスを備えています。

Tarantoolに取り組んで最初の数か月で、以前のオープンソースプロジェクトであるMySQLのものと同様のテストツールを作成しようとしました。

なぜなら mysql-test-run、mysqltest、 pushbuildなどのツールは、MySQLエコシステム以外ではほとんど知られていません。いくつかのブログ投稿で作成したものを説明します。各投稿は個別のコンポーネント当てられます。

要するに、現代のオープンソースプロジェクトでは、「文明化された」開発を可能にする一連のツールが使用されています。 一部のプロジェクトではツールキットの一部のみを使用していますが、私の意見では、開発サイクル全体を自動化することで最良の結果を得ることができます。

これらは次の自動化コンポーネントです。

-自動回帰テスト、
-機能テストと単体テスト用のツール、
-自動連続統合テスト、
-製品インストール用のパッケージとディストリビューションの自動作成。

これらのツールは、組み立てられて一緒に動作し、製品に追加される新しい機会ごとに生息地を決定し、サイクル全体の開発に伴い、エンジニアがより良いコードを作成し、ルーチンを排除し、プロジェクト全体が成長する機会を与えます。

自動化タスクの作業を始めたとき、私が直面しなければならないことを完全に知らなかったことを認めなければなりません。

Tarantoolは分散可能なキー/値ストレージですが、機能回帰テストの問題、つまりMySQLで行われた方法に最大限の注意を払ってタスクに取り組みました。

NoSQLについての最初の理解は、それが単なる生産性の高いストレージであるということでしたが、本格的なDBMSの機能の一部のみを提供します。
私はまったく正しくありませんでした。

機能的なタランツールのテスト

Tarantoolは、データを操作するための基本的なコマンドセット(GET、PUT、SET、DELETE)をサポートするシンプルなバイナリプロトコルを顧客に提供します。

「SAVE SNAPSHOT」、「SHOW STAT」などの管理コマンドは、テキストで表示される個別の管理ポートで送信されます。

現時点でTarantoolが認可スキームをサポートしていないという理由だけで、管理用の別のポートが必要です。

プロジェクトに関する私の作業の開始までに、Tarantoolにはすでにいくつかの機能テストがありましたが、自動モードでは機能しませんでした。 一言で言えば、このテスナがあなたによって書かれた場合、あなたはおそらくそれを使用しないでしょう。

既存のテストとは異なり、テストを記述し、すでに記述されているものを理解するのも同様に簡単なテスト言語を探していました。 Tarantoolの開発者とテストエンジニアの両方が話せる言語であるはずでした。

新しい環境で見つかったすべてのエラーのテストスクリプトを作成できることも重要でした。

もちろん、元SQLプログラマにとって、SQLは非常に魅力的に見えました。 最後に、少なくともSQLの標準がありますが、最新のNoSQLシステムの「言語」には共通のサブセットさえありません。

そのため、テストを記述するための言語としてSQLが選択されました。 SQLの観点から、Tarantoolは4つのデータ演算子INSERT、SELECT、UPDATE、DELETEを提供します。

もちろん、SQLの文法はTarantoolの機能よりもはるかに豊富ですが、私の意見では、これは受け入れられました。 リポジトリのキー/値機能の一部がSQLの観点から表現できないことは喜ばしい驚きではありませんでした。

まず第一に、TarantoolはSQL標準のような関係(タプルのセット)ではなく、キー/値のペアで動作します。 複数の操作はありません。複数のタプルで機能する操作でさえ、実際には複数の操作をパッケージに結合し、セット全体では機能しません。
SQLに関しては、これはすべてのデータ操作ステートメントにWHERE句と一意のキー参照が含まれている必要があることを意味します。

さらに、Tarantoolのベースオブジェクトは、名前ではなくインデックスによってアドレス指定されます。 SQLの「テーブル」の代わりに、0〜Nの番号が付けられた「キースペース」が使用されます。

さらに、本質的に多数の異なるサイズのタプルである各スペースには、さまざまなフィールドまたはフィールドの組み合わせに対して複数のインデックスが存在する可能性があります。
データは、番号や列名ではなく、インデックス番号(「キー」という用語は「インデックス」の代わりによく使用されますが、データ構造ではなく個々の値を「キー」と呼びます)によってアクセスされます。 インデックス#0は常に主キーと見なされます。

OK、TarantoolのSQL文法は短縮され、数字で終わる識別子のみが許可されます。

その後、 キースペースにはディメンションも固定構造もありません。タプルの一部のみを操作することはできません。UPDATEを除くすべての演算子は、タプル全体を操作します。

したがって、SELECT SQLは「*」のみを受け入れます。

文法の削減が終わったとき、TarantoolではINSERT、UPDATE、およびDELETEが戻り値として古いタプル値を返すことができることがわかりました。 このための標準SQLサブセットには適切な構成がありませんでした。
しかし、全体として、私は目標を達成しました-シンプルで、よく知られた、理解しやすい構文でマイクロ言語を作成します。

なぜなら 自動化インフラストラクチャーのプログラミング言語としてPythonを選択し、YAPPSライブラリーを使用してSQLパーサーを作成しました。 このソリューションの長所と短所については、ブログで別々に書きました。

パーサーを介して管理コマンドを渡さないようにするために、SQLクエリから早い段階でコマンドをフィルターできる正規表現を追加しました。 このようなコマンドは、管理ポートを介してサーバーに直接送信されました。

その結果、非常に便利なコマンドラインクライアントが作成され、その上でテストを簡単に作成できました。

kostja@shmita:~/work/tarantool/test$ ./tarantool
tarantool> select * from t0 where k0 = 1
No match
tarantool> insert into t0 values (1, "My first tuple"
Insert OK, 1 row affected
tarantool> select * from t0 where k0 = 1
Found 1 tuple:
[1, 'My first tuple']
tarantool> save snapshot
---
ok
...
tarantool> show info
---
info:
version: "1.3.2-264-ga7bb270"
uptime: 73
pid: 22101
wal_writer_pid: 22102
lsn: 2
recovery_lag: 0.000
recovery_last_update: 0.000
status: primary
...


次のコンポーネントは、新しい言語で書かれたテストの実行の自動化でした。 これについては別の記事で書きます。

PSはい、Tarantoolはオープンソース製品であり、私がやったことはすべてgithubのメインプロジェクトツリーですでに利用可能です。

どのように動作するか試してみるのは簡単です。ソースコードのクローンを作成し、必要なライブラリ(主にPythonライブラリ)をインストールし、コンパイル(cmake。&& make)サーバーを起動します(cd test && ./run --start-and-exit)新しいクライアントを使用して接続します(cd test && ./tarantool)。

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


All Articles