こんな質問をされたので調べました。
「RDS MySQL と Aurora MySQL にあるテーブルをまたいで、SQL の JOIN できる?」
まず現時点での結論らしきもの
いくつかのドキュメントや仕様を追っていく限り、
❌ RDS MySQL と Aurora MySQL をまたいで、SQL の JOIN を直接実行することはできないらしい
という理解に落ち着きました。
断定というより、「構造上そう設計されているようだ」という感じです。
なぜできないのか?(構造を追ってみる)
調べていくと、ポイントは MySQL の JOIN の仕組みにあるようです。
MySQL の JOIN は、
同一の mysqld プロセス内部で最適化され、実行される仕組み
になっているらしく、別サーバー上のテーブルを直接結合する構文自体が存在しないようです。
SQL 的には、
- RDS MySQL = MySQL サーバーA
- Aurora MySQL = MySQL サーバーB
という扱いになり、A と B をまたぐ JOIN 文は MySQL には用意されていない、という構造のようです。
「Aurora は分散だから、つながるのでは?」と思った件
Aurora は「分散ストレージ」とよく言われます。 なので「分散しているなら、別 DB とも JOIN できるのでは?」と一瞬考えました。
しかし調べていくと、
- Aurora の分散は クラスタ内部のストレージ実装の話
- 外部の MySQL と分散クエリをする仕組みではない
という理解に至りました。
どうやら Aurora は「分散SQLエンジン」ではなく、「分散ストレージ型の MySQL 互換エンジン」という位置づけのようです。
MySQL の FEDERATED Storage Engine という可能性
「MySQL には FEDERATED という機能があるらしい」という情報にもたどり着きました。
FEDERATED とは何か?
MySQL 公式ドキュメントによると、 FEDERATED Storage Engine は、リモート MySQL のテーブルをローカルテーブルのように扱える仕組みのようです。
MySQL :: MySQL 8.4 Reference Manual :: 18.8 The FEDERATED Storage Engine
https://dev.mysql.com/doc/refman/8.4/en/federated-storage-engine.html
イメージはこうです。
MySQL A
|
| (FEDERATED)
|
MySQL B
MySQL A にリモート接続情報付きのテーブルを作ることで、MySQL B のテーブルを参照できるらしい。
理屈の上では、
SELECT *
FROM local_table
JOIN remote_table ON ...
のようなことも可能になる、という説明になっています。
「これならいけるのでは?」と思いました。
しかし、ここから状況が変わる
RDS MySQL ではサポートされていない
AWS 公式ドキュメントを見ると、はっきりとこう書かれています。
The Federated Storage Engine is currently not supported by Amazon RDS for MySQL.
MySQL feature support on Amazon RDS - Amazon Relational Database Service
https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/MySQL.Concepts.FeatureSupport.html
つまり、RDS MySQL では使えないようです。
Aurora MySQL でも使えないらしい
AWS re:Post の回答でも、
Aurora MySQL doesn’t support federated storage engine.
と明記されています。
AWS Aurora MYSQL enabling Federated Server | AWS re:Post
https://repost.aws/questions/QUoc3mbvqOSOeglHkx5Y6PLw/aws-aurora-mysql-enabling-federated-server
どうやらマネージド環境では有効化できない設計になっているようです。
さらに気になった点
MySQL 公式のドキュメントを見ると、FEDERATED はデフォルトで有効ではなく、明示的に有効化しないと使えない構成になっているようです。
MySQL :: MySQL 8.4 Reference Manual :: 18.8 The FEDERATED Storage Engine
https://dev.mysql.com/doc/refman/8.4/en/federated-storage-engine.html
また、設計上は
- ネットワーク越しに都度アクセス
- トランザクション整合性が弱い
- フェイルオーバーを考慮しない
といった性質もあるようで、本番用途として積極採用されているケースはあまり見かけません。
AWS Glue という別方向のアプローチ
「では AWS 側に横断 JOIN できる仕組みはないのか?」と探していくと、AWS Glue に行き当たりました。
AWS Glue とは
AWS 公式の説明では、Glue はフルマネージドの ETL(Extract, Transform, Load)サービスです。
What is AWS Glue? - AWS Glue
https://docs.aws.amazon.com/glue/latest/dg/what-is-glue.html
また、複数 VPC にまたがる DB へ接続して ETL を実行する構成も紹介されています。
Connect to and run ETL jobs across multiple VPCs using a dedicated AWS Glue VPC | AWS Big Data Blog
https://aws.amazon.com/blogs/big-data/connecting-to-and-running-etl-jobs-across-multiple-vpcs-using-a-dedicated-aws-glue-vpc/
Glue で RDS と Aurora を JOIN できるのか?
調べていくと、
✅ バッチ処理としてなら可能らしい
という理解になりました。
構成イメージはこうです。
RDS MySQL ─┐
├─ Glue が読み取る → Spark 上で JOIN → S3 / Redshift に出力
Aurora MySQL ─┘
Glue は内部で Spark を使い、
- RDS
- Aurora
それぞれからデータを読み込み、 Spark 上で JOIN して結果を書き出す、という流れのようです。
ただしこれは、
- アプリが SELECT … JOIN … を直接実行する
という形ではなく、
- ETL バッチとしてデータを統合する
という性格のものです。
Redshift の federated query という手もあるらしい
さらに調べると、Amazon Redshift には MySQL に対する federated query 機能があるようです。
Getting started with using federated queries to MySQL - Amazon Redshift
https://docs.aws.amazon.com/redshift/latest/dg/getting-started-federated-mysql.html
Redshift 側から RDS/Aurora の MySQL に接続し、外部スキーマとして扱える仕組みのようです。
これも用途としては、
- 分析
- 集計
- DWH
寄りの機能で、オンライン業務処理の代替というよりは分析基盤向けに見えます。
ここまで調べて見えてきたこと
いろいろ追いかけた結果、どうやら構造としてはこういうことのようです。
- MySQL の JOIN は同一 mysqld 内部の仕組み
- RDS と Aurora は別インスタンス
- FEDERATED は理論上可能だが、RDS/Aurora ではサポートされていない
- Glue や Redshift ならバッチ分析用途では横断 JOIN が可能
つまり、
マネージドな RDS / Aurora 環境で、SQL だけで横断 JOIN する道は用意されていない
という理解に至りました。
今回の調査のまとめ(現時点の理解)
| 項目 | 状況 |
|---|---|
| RDS ↔ Aurora を SQL で直接 JOIN | できないらしい |
| MySQL FEDERATED | リモート MySQL を参照できる仕組み |
| RDS MySQL | FEDERATED 非対応(AWS公式) |
| Aurora MySQL | FEDERATED 非対応(AWS回答) |
| AWS Glue | バッチ JOIN は可能 |
| Redshift federated query | 分析用途では可能 |