Teiid — Data Virtualization (Tech Preview 2019–07)
Data Virtualization
昨今、Data Virtualization というキーワードをよく聞くようになりました。今年開催された AWS Summit 2019 では私はストレージベンダーの技術者として参加していましたが、目の前が Data Virtualization のブースでした。
Data Virtualization を利用すると複数のデータベース、その他データストアに散らばっているデータを統合(Integration)して、利用者に様々な方法で見せることができます。これにより、Tableau のような BI ツールでグラフィカルに分析したり、バッチ処理が必要だった処理をリアルタイムで見ることができるようになりました。
Red Hat も JBoss Data Virtualization(UpStream は Teiid)という製品がありましたが、2018年8月に販売を終了しました。
Red Hat Integration で復活
JBoss Data Virtualization は Red Hat Integration の一部、「Data Virtualization」として復活する予定です。現在 Tech Preview が公開されており、試してみることが可能です。
上記は 2019–07 版 Tech Preview です。
Teiid — Data Virtualization の UpStream
Red Hat Integration で提供される Data Virtualization の UpStream は Teiid のままですが、ランタイムとして Teiid SpringBoot を使用する点が異なります。
従来は JBoss 上に Teiid を載せるランタイム Teiid WildFly がベースになっており、モノリシックな形での提供になっていました。
Teiid SpringBoot では Kubernetes/OpenShift 上にデプロイされることを前提とした作りになっています。SpringBoot を利用することで UberJar として動作するためアプリケーションサーバーを用意する必要がありません。
Teiid SpringBootを試す
Tech Preview のドキュメントを読んでいただけるとわかるのですが、OpenShift で動作させる前提でドキュメントが記載されており、利用していない人にはハードルが高いので、ローカル PC で Upstream の Teiid SpringBoot を実行させてみます。
今回試す全体像は以下の通りとなります。
事前準備
事前に動作させる環境を準備しておきます。
- OpenJDK 8
- Maven 3.3.x
- Docker
Postgres の準備
まず、今回使用するデータベースを起動します。DockerHub にイメージを予め載せてあるので docker run コマンドで直接起動できます。
$ docker run -d --name sampledb -p 5432:5432 kkosugiredhat/sampledb:v1
参考までに Docker イメージを作成するために使用した Dockerfile は以下の通りとなっています。
Dockerfile の最終行の sql ファイルが実際にやっていることを以下に示します。Docker イメージ作成時に sampledb データベースを作成し、その DB に customer と address テーブルを作成しています(INSERT も)。
Teiid SpringBoot 用コードのダウンロード
Teiid SpringBoot のサンプルコードを GitHub に置いたので、git clone するか ZIP ダウンロードしてください。
$ git clone https://github.com/k-kosugi/sampledb.git
各コード・リソースファイルの解説
- src/main/resources/customer-vdb.ddl
Virtual Database(VDB) を定義するためのファイルです。
- Teiid SpringBoot 上に customer という仮想データベースを作成。
- customer 仮想データベースに Postgres の sampledb を accounts スキーマとしてインポート。
- customer 仮想データベースに portfolio バーチャルスキーマを作成、CustomerZip ビューを定義。これは Postgres 上の address テーブルと customer テーブルを左外部結合したものです。
Teiid 上には accounts スキーマに address、customer テーブルがあり、portfolio スキーマに CustomerZip ビューを定義しているので、計3つのテーブルが存在しているように見えるはず です。
- src/main/resources/application.properties
SpringBoot や Teiid がプロパティを読み込むためのファイルです。後述する DataSources.java を見ると分かりますが本ファイルに記載されている Postgres への接続情報を元に JDBC の DataSource インスタンスを生成しています。
Teiid で仮想データベースを定義するための DDL ファイルもここで定義されています。
- src/com/example/DataSources.java
上記 application.properties から Postgres への接続情報を元に DataSource を生成して返却しています。
Teiid SpringBoot の起動
ではコマンドを投入して SpringBoot を起動しましょう。
$ mvn spring-boot:run
上記のように、「TEIIDXXXXX VDB customer.1 added to the repository」 と出たら成功です。customer.1 という仮想データベースが作成されました。これまでの説明には出てこなかったのですが、OData と呼ばれる CRUD 用の REST API も同時に作成されています。
仮想データベースへのアクセス
Teiid SpringBoot は仮想データベースへ接続できるように 31000 ポートで LISTEN します。JetBrains の DataGrip という製品で Teiid JDBC ドライバを定義して仮想データベースへ接続してみます。
JDBC ドライバは Teiid のサイトからダウンロードでき、JDBC 接続文字列は以下のとおりです。
jdbc:teiid:<VDB名>@mm://<host名>:31000
VDB 名にはバージョン(customer.1 の .1) が必要なのでお間違いなく。また 31000 ポートは 0.0.0.0 でリスンしないようなので、netstat -an | grep 31000 でリスンしている IP を特定して以下の <host名> へ反映させることも必要です。
ユーザー名、パスワードはデフォルトでは不要です。
portfolio という新しいスキーマが作成されており、この中に CustomerZip ビューが存在します。中身をみてみると、address テーブルと customer テーブルの結合されたテーブルであることが分かります。
customer-vdb.ddl で宣言した通りの動作であることが分かります。
OData へのアクセス
実は Maven の設定ファイルである pom.xml には依存関係に Teiid の spring-odata というライブラリを宣言してしています。spring-odata を宣言するとユーザーが実装することなく OData を利用できるようになります。
ブラウザを使用して特定の URL にアクセスすると OData の metadata をみることができます。
1 は XML、2 は JSON で見ることができます。
ここでは portfolio スキーマで定義した CustomerZip を READ する REST API を JSON フォーマットで呼び出してみます。
http://localhost:8080/odata/CustomerZip?$format=json
仮想ビューである CustomerZip を HTTP の GET リクエストで受け取ることができました。
最後に
Data Virtualization の UpStream である Teiid SpringBoot(Tech Preview とほぼ同じ内容です)はいかがでしたでしょうか。Red Hat Integration が提供する Data Virtualization は GA までもうすぐとなっています。
Teiid SpringBoot は Kubernetes/OpenShift 上で動作するよう設計されており、適用箇所はCQRS(Command Query Responsibility Segregation) であったり、Kubernetes クラスタ外へのゲートウェイとして使うなど様々ユースケースが考えられます。
※ CQRS については以下を参照ください。
今回ご紹介した Teiid SpringBoot ではほんの一部分ですが、コードを記載する部分があり、開発経験者にしか理解できない内容も多く含んでいるかもしれません。
しかし、次回ご紹介する Kubernetes/OpenShift の Teiid Operator を使えばコードが不要になります。