re:invent でアナウンスのあった、Babelfish for Amazon Aurora PostgreSQL が面白そうなので、情報を調べてみました。
Preview の申し込みはしてみましたが、まだ触れているわけではないので、情報収集ですが。
PostgreSQL に TDS のエンドポイントを作成できるのは面白いですね~。
本ブログの投稿を見なくても、次の記事を見ればばっちりだと思います。
- [速報]Aurora PostgreSQLにSQL Server互換レイヤを実装する「Babelfish for Aurora PostgreSQL」発表。オープンソースとしても公開へ。AWS re:Invent 2020
- [速報] SQL ServerからAurora PostgreSQLへの移行を促進するBabelfish for Aurora PostgreSQL (Preview) が発表されました #reinvent
Contents
公式の情報を確認してみる
Babelfish for Amazon Aurora PostgreSQL
まずは、AWS から発表されている情報としてどのようなものがあるかを見ていきたいと思います。
公式の情報としては、次の 3 つですかね。
Babelfish for Amazon Aurora は、Amazon Aurora 用の新しい、Transration layer となり、SQL Server からクエリを実行する際に使用されている TDS ベースのアクセスを Amazon Aurora PostgreSQL で受け付けることができるようになります。
これにより、SQL Server 向けのクライアントインタフェースを使用して、Amazon Aurora PostgreSQL に対して、Transact-SQL (T-SQL) を実行することができ、SQL Server 向けのアプリケーションのクエリの実行先として Amazon Aurora PostgreSQL を指定することができるということになります。
Babelfish を使用することで、SQL Server への接続文字列を、Amazon Aurora PostgreSQL に向ける変更を行うだけで、SQL Server を利用しているアプリケーションの参照先を変更できるということですね。
SQL Server から、PostgreSQL に移行を行う際に必要となる、データベースアクセスのクライアントライブラリの変更が必要なくなり、移行容易性の向上が望めます。
通常、データベースの移行を行う際には、
- スキーマの移行
- データの移行
- アプリケーションの移行
- (クエリの最適化)
が必要となると思います。
今までのデータベース移行では、1.~3. まで同時に実施し、移行完了時には 3. が完了している必要がありました。
しかし、Baelfish が利用できることで1. / 2. が終わった後に、3. の箇所を既存のコードを活かしたまま、並行して、PostgreSQL 向けに変更を行うことで、新しいデータベース環境をいち早く利用しだすことができる / 新しいデータベースを使用しながら段階的な移行を行うことができるのではないでしょうか。
Babelfish は T-SQL の要求を受け付けるものですが、受け付けた T-SQL のクエリが PostgreSQL 上でどのように実行されるかはよくわかっていないので、実際のプロジェクトではクエリの実行効率も重要ですが。
T-SQL を PostgreSQL 用の SQL に変換して実行するのだとおもいますが、その際にどのようなクエリに変換されているのかは気になりますよね。
実行後のデータについても TDS に変換されてストリームされると思いますので、PostgreSQL にネイティブにクエリを実行した場合との処理性能の比較についても気になるところです。
クエリの互換性
Babelfish はクエリの Translation Layer となりなすので、SQL Server の TDS を PostgreSQL で実行可能なように変換を行います。
このような動作となるとクエリの互換性が気になります。
公開されている情報には、次のような記載があります。
Babelfish understands the SQL Server wire-protocol and T-SQL, the Microsoft SQL Server query language, so you don’t have to switch database drivers or re-write all of your application queries.
so your apps that were originally written for SQL Server can now work with Aurora with fewer code changes.
変換を行う際には、高い互換性を目指しているかと思いますが、「多少のコードの変更」が必要となるケースは出てくるのかと。
ただし、SQL Server のクエリをいちから PostgreSQL ように変換するよりはサービスレイヤーで変換が行われたほうが、はるかに効率がよく楽ができますので、単純に移行を行よりは、はるかに効率的でしょうね。
変換が行われるのは、あくまでも「クエリ」の部分のみとなりますので、SQL Server 固有の機能を使用している場合の対応や、クエリの実行効率の変化の確認は必要となりますので、このあたりの考慮は必要となるかと思います。
SQL Server 固有の構文がどこまで対応しているのか (対応していないクエリを実行した際にどのようなエラーとなるのか) も気にかかります。
コスト
Babelfish is a built-in capability of Amazon Aurora, and does not have an additional cost. You can enable Babelfish on your Amazon Aurora cluster with a just few clicks in the RDS management console.
Babelfish は、ビルトインの機能となるため、追加のコストはかからず、RDS のコンソールで数回クリックするだけで有効化できるそうです。
追加コストがかからず、TDS のエンドポイントを有効化できるのはうれしいですね。
Open Soure Project
Babelfish source code will soon be available on GitHub under the Apache 2.0 license.
Babelfish は AWS が開発を行った機能です。Open Source Projet であり、ソースはまだ公開されていませんが、GitHub ページ で情報の公開は行われています。(開発言語は C らしいです)
2021 年に GitHub で公開されるとのことですので、もういくつ寝るとソースが公開されるのではないでしょうか。
通常の PostgreSQL / Azure Database for PostgreSQL にも Babelfish が実装されてくると面白いですね。
ユースケースはどんなものがあるのだろう?
基本的なユースケース
GitHub ページに書かれている次の記載が基本的なものになるのでしょうね。
Why did you develop Babelfish for PostgreSQL?
We built Babelfish for PostgreSQL to make it easier to migrate applications from SQL Server to PostgreSQL. Today, there is a number of ways to migrate your data and database schema from SQL Server to PostgreSQL. However, once the initial database migration is done, manually re-writing application code, switching out database drivers, and verifying that the application behavior hasn’t changed requires significant effort. As a result, organizations struggle to start these types of projects because of the opportunity cost of tying up developers, and the risk of introducing errors when making extensive changes to the application code.
Babelfish が開発されたのは、SQL Server から PostgreSQL へのアプリケーションの移行容易性を向上させるためです。
異種データベースに移行を実施した場合、アプリケーションのコードの変更が必要となります。
このコード変更と、データベースが変わったことによる動作の変化への対応には多大な労力 / コストが必要となります。
これを改善するのが Babelfish の基本的なコンセプトとなるようですね。
異種データベースに対してのクエリ実行については、データ仮想化のような技術がありますが、データ仮想化は「リモートのデータソース」にデータがあることが前提となります。
Babelfish については、Amazon Aurora PostgreSQL 内に存在しているデータに対して、Transact-SQL でアクセスをする技術ですので、データ自体は、SQL Server から PostgreSQL に移行を行う必要があります。
実際のプロジェクトでは、AWS Database Migration Service で SQL Server からデータ移行を行うことと併用して使う形でしょうかね。
TDS エンドポイントがあると何がうれしいのだろう?
Babelfish は、「Amazon Aurora PostgreSQL 内にあるデータを SQL Server のクライアントインタフェース (Transact-SQL / TDS) でアクセスを可能にする」技術ですので、これがどのように活用できるかがポイントとなるのでしょうね。
- PostgreSQL 向けのクエリと SQL Server 向けのクエリを並行稼働させながらの段階的な移行
こちらがメインとなりそうではありますが、
- レポート用で使用しているクエリを接続先を変更することで、異種データベースの新 DB に切り替える
ということもできそうですので、「クエリを書き換えず、接続文字列ン変更のみで新しい異種データベースにアクセスできる」点のメリットがどのように出てくるのかを考えるのは楽しそうですね。
「SQL Server 固有の機能を使用しているクエリ」については、さすがに動作しないと思いますので、管理用のデータ取得系はさすがに動かないと思いますが、レポート / 帳票系のクエリが、接続先を変更するだけでそのまま動作するようですとユーザーインパクトは大きいのではないでしょうか。