こんにちは、プロダクト開発本部近藤です。
db tech showcase 2025 1日目の「PA4」のセッションである「Amazon Aurora DSQLの仕組みと特徴」のレポートをお届けします。
セッション概要
昨年末のre:Invent 2024で発表されたOLTPに最適化された分散データベースであるAmazon Aurora DSQLが一般提供されました。すでにAmazon Aurora DSQLを触ってみた方もいらっしゃると思いますが、今一度、Amazon Aurora DSQLの仕組みや特徴をおさらいしつつ、通常のデータベースと異なる点、設計上で注意すべき点を確認します。
スピーカー名:
アマゾンウェブサービスジャパン合同会社
データ事業本部 スペシャリストソリューション本部
シニアPostgreSQLスペシャリスト
ソリューションアーキテクト
新久保 浩二 様
はじめに
今年の5月末に一般利用が可能となったAurora DSQLですが、実際に触ったことのある人はまだ少ないようで、会場の参加者に利用経験のある方はいませんでした。 私もそのうちの一人で、存在は知っていたもののこれまで触れる機会が無かったため、これを機に実際に触ってみることにしました。
本レポートではセッションで紹介されたAmazon DSQLの特徴と注意点を中心にまとめます。
※「DSQL」の読み方は「でぃー・しーくうぇる」「でぃー・えすきゅーえる」どちらでも良いそうです(海外のカンファレンスでは前者が多いそうです)。
セッション内容
# Aurora DSQLのアーキテクチャと主な特徴
Amazon Aurora DSQLは、Aurora/RDSとは異なり、サーバーレスの分散SQLデータベースです。 セッションで強調されていた主な特徴は下記のとおりです。
## 1. サーバーレスアーキテクチャ
DSQLの最大の特徴は、インスタンスという概念が無いことです。
ユーザーに提供されるのは単一のエンドポイントのみで、その裏側でコンピューティング、ストレージ、トランザクション処理など各コンポーネントが完全に分離・分散されています。
これにより、各リソースがワークロードに応じて独立して、かつ自動的にスケーリングします。
読み込みも書き込みも異なるコンポーネントのパスを通るため、互いに干渉しないという特徴があります。
## 2. 高い可用性とマルチリージョン対応
アーキテクチャ全体で単一障害点を排除するように設計されています。
- シングルリージョン: 複数のAZにまたがるActive-Active構成
- マルチリージョン: 東京-大阪のようなリージョン間でAcrive-Active構成を組むことが可能
## 3. PostgreSQLとの互換性
基本的なSQLやデータ型はPostgreSQLと互換性があります。
ただし、一部使用できないPostgreSQLの文法が存在します。データ型は全く同じものをサポートしており、精度や丸め方は一致します。
接続にはPostgreSQLのプロトコルを使用し、psqlやDBeaverなどの既存のクライアントツールが利用可能です。
## 4. 楽観的同時実行制御
従来の多くのRDBMSとAurora DSQLではトランザクションの仕組みが大きく異なります。
多くのRDMSで採用する「ロック」を取得してリソースを占有する仕組みとは異なり、Aurora DSQLはロックを取得しません。 Aurora DSQLは楽観的同時実行制御を採用しています。
これは、まず処理を実行させ、最後のCOMMITのタイミングで競合を検証するアプローチです。
1. トランザクションAがデータを更新する。
2. トランザクションBが同じデータを更新する。
3. トランザクションAがCOMMITする。この時点では競合が無いため成功する。
4. トランザクションBがCOMMITする。この時、先にトランザクションAがCOMMITしたため、トランザクションBはabortされる。
## 5.開発する上での注意点
- リトライ処理: 前述の通り、あとからCOMMITしたトランザクションはエラーで失敗します。そのため、アプリケーション側でこの種のエラーを検知し、リトライする処理を実装する必要があります。
- ロングトランザクションは不向き: Aurora DSQLはOLTPワークロードに最適化されており、ロングトランザクションには不向きです。
# Aurora DSQLの動作確認
セッションで解説されていた特徴的な挙動を、実際に確認してみました。
確認: トランザクションの競合
2つのpsqlセッションを使い、同一行を更新して、「楽観的同時実行制御」の挙動を確認します。
【手順】
- テスト用のテーブルを作成し、データを1行挿入
- CREATE TABLE accounts (id INT PRIMARY KEY, balance INT);
- INSERT INTO accounts VALUES (1, 10000);
- トランザクション開始
- データ更新(同じ行を更新)
- セッション1を先にCOMMIT、その後、セッション2をコミット

この結果から、Aurora DSQLがロック無しで動作し、競合発生時に後からコミットしたトランザクションがエラーとなることを確認できました。
聴講した感想
Amazon Aurora DSQLが提供するサーバーレスな運用と高いスケーラビリティはとても魅力的に感じました。
一方、トランザクションの仕組みの違いや、PostgreSQL互換ではあるものの一部使用できない機能が存在するなど注意が必要な点も存在します。
そのため、Aurora DSQLへの移行を検討する際は、この非互換性、特にトランザクションの挙動を正しく理解し、アプリケーションが意図的に動作するか、入念なテストを実施することが不可欠と感じました。