これは PostgreSQL Advent Calendar 2024 2 枚目・5 日目の記事です。
ワイヤープロトコルレベルで PostgreSQL と互換性があり(SQL も PostgreSQL のサブセットをサポート)、リージョン分散型のリレーショナル DB である Aurora DSQL のプレビュー版が公開されたので、ちょっとだけ試してみました。
概要など
こちらの AWS Database Blog に記されています。
2024/12/11 追記:
日本語の記事はこちらです。
re:Invent では明確に(Google の)「Spanner」の名前を出して比較をしていたようですね。
同じ分散型リレーショナル DB でも、シャードの配置などをユーザーが指定するスタイルの Aurora Limitless Database とは完全に別物です。
なお、こちらに(楽観トランザクションによる)同時実行制御についての説明があります。
2024/12/11 追記:
日本語の記事はこちらです。
とりあえずクラスター(群)を立ててみる
Getting started の記事を参考に、早速触ってみます。
マネジメントコンソールの入口は RDS から独立?
先ほどの Getting started の記事にもリンクが記されていますが、RDS / Aurora のコンソール画面ではなく独立したコンソール画面からクラスターを作成するようです。
クラスターを立ててみる
リンククラスターをオハイオリージョンに、Witness リージョン(データのコピー(更新ログ)を配置するがエンドポイントは持たないリージョン)をオレゴンに配置します。
2024/12/5 時点では、オレゴンリージョンは Witness 専用リージョンのようです。
現時点の設定はこれだけです。
既報のとおり、VPC 外にエンドポイントが作られるようですね。
こちらはリンククラスター配置先のオハイオリージョンのクラスターです。
クライアントからバージニア北部リージョンのエンドポイントに接続してみる
今回は Administrator 権限を持つユーザーで CloudShell を使い、psql
コマンドでの接続を試します。
バージニア北部リージョンのクラスターの画面の下方で CloudShell を開いて、まずは Getting started の記事に示されたサンプルデータを配置します。
$ mkdir samples
$ cd samples
$ curl https://raw.githubusercontent.com/aws-samples/aurora-dsql-samples/refs/heads/main/quickstart_data/department-insert-multirow.sql > department-insert-multirow.sql
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 610 100 610 0 0 2225 0 --:--:-- --:--:-- --:--:-- 2250
$ curl https://raw.githubusercontent.com/aws-samples/aurora-dsql-samples/refs/heads/main/quickstart_data/invoice.csv > invoice.csv
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 233k 100 233k 0 0 4388k 0 --:--:-- --:--:-- --:--:-- 4412k
$ ll
total 240
-rw-r--r--. 1 cloudshell-user cloudshell-user 610 Dec 5 12:26 department-insert-multirow.sql
-rw-r--r--. 1 cloudshell-user cloudshell-user 239459 Dec 5 12:26 invoice.csv
$ cat department-insert-multirow.sql
BEGIN;
INSERT INTO example.department(id, name, email) VALUES
(1, 'Example Department One', 'example+one@example.com'),
(2, 'Example Department Two', 'example+two@example.com'),
(中略)
(9, 'Example Department Nine', 'example+nine@example.com');
COMMIT;
$ head invoice.csv
'2019-02-11T21:40:27.892Z',1,39.718145389078366
'2018-05-15T08:04:04.580Z',7,117.0376564084763
'2019-12-06T22:22:48.544Z',6,55.62208681964182
(中略)
'2017-05-03T16:00:54.923Z',2,81.67426959
'2020-01-17T01:44:37.233Z',3,102.77055805103969
$ tail invoice.csv
'2016-06-20T04:41:17.900Z',2,25.993077038947224
'2018-01-17T07:05:29.340Z',5,35.05190955068556
(中略)
'2019-12-29T14:38:55.070Z',2,87.93198397343093
'2016-05-18T16:02:59.284Z',3,63.546171761560245
'2019-08-30T17:26:07.144Z',6,56.50467195926748
$ cd ..
「Connect」ボタンをクリックすると接続に必要な情報が表示されます。
エンドポイントをコピーして、CloudShell からpsql
コマンドでバージニア北部リージョンのクラスターに接続します。
$ PGSSLMODE=require \
> psql --dbname postgres \
> --username admin \
> --host yiabtvdfljusl7rv6d2w2zbqpm.dsql.us-east-1.on.aws
Password for user admin:
パスワードは先ほどのポップアップウィンドウ右下の「Copy」ボタンをクリックしてペーストします(そして [Enter] キーを押す)。
psql (15.8, server 16.5)
WARNING: psql major version 15, server major version 16.
Some psql features might not work.
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_128_GCM_SHA256, compression: off)
Type "help" for help.
接続できました。
サンプルデータを投入する
Getting started の記事のとおり、example
スキーマと 2 つのテーブルと 1 つのインデックスを作成します。
postgres=> CREATE SCHEMA example;
CREATE SCHEMA
postgres=> CREATE TABLE example.invoice(id UUID PRIMARY KEY DEFAULT gen_random_uuid(), created timestamp, purchaser int, amount float);
CREATE TABLE
postgres=> CREATE INDEX invoice_created_idx on example.invoice(created);
CREATE INDEX
postgres=> CREATE TABLE example.department(id INT PRIMARY KEY UNIQUE, name text, email text);
CREATE TABLE
サンプルデータを投入します。
postgres=> \include samples/department-insert-multirow.sql
BEGIN
INSERT 0 9
COMMIT
postgres=> \copy example.invoice(created, purchaser, amount) from samples/invoice.csv csv
COPY 5000
バージニア北部リージョンでSELECT
してみる
こちらも Getting started の記事のとおりの SQL 文を実行します。
postgres=> SELECT name, sum(amount) AS sum_amount
postgres-> FROM example.department LEFT JOIN example.invoice ON department.id=invoice.purchaser
postgres-> GROUP BY name
postgres-> HAVING sum(amount) > 0
postgres-> ORDER BY sum_amount DESC;
name | sum_amount
--------------------------+--------------------
Example Department Three | 54061.677528545966
Example Department Seven | 53869.659653652096
Example Department Eight | 52199.73742066632
Example Department One | 52034.07886990081
Example Department Six | 50886.1555625639
Example Department Two | 50589.98422247927
Example Department Five | 49549.852635496
Example Department Four | 49266.15578027618
(8 rows)
オハイオリージョンのエンドポイントに接続してみる
今度はオハイオリージョンのクラスターの画面で「Connect」ボタンをクリックして接続に必要な情報を表示します。
先ほどと同じように CloudShell からpsql
コマンドで接続してみます。
$ PGSSLMODE=require \
> psql --dbname postgres \
> --username admin \
> --host gqabtvdfliuboiehc6voycz6vy.dsql.us-east-2.on.aws
Password for user admin:
パスワードはオハイオリージョンの authentication token を Copy して貼り付けます。
psql (15.8, server 16.5)
WARNING: psql major version 15, server major version 16.
Some psql features might not work.
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_128_GCM_SHA256, compression: off)
Type "help" for help.
接続完了しました。
オハイオリージョンでSELECT
してみる
先ほどと同じSELECT
文を実行します。
SELECT実行
postgres=> SELECT name, sum(amount) AS sum_amount
postgres-> FROM example.department LEFT JOIN example.invoice ON department.id=invoice.purchaser
postgres-> GROUP BY name
postgres-> HAVING sum(amount) > 0
postgres-> ORDER BY sum_amount DESC;
name | sum_amount
--------------------------+--------------------
Example Department Three | 54061.677528545966
Example Department Seven | 53869.659653652096
Example Department Eight | 52199.73742066632
Example Department One | 52034.07886990081
Example Department Six | 50886.1555625639
Example Department Two | 50589.98422247927
Example Department Five | 49549.852635496
Example Department Four | 49266.15578027618
(8 rows)
オハイオリージョンでも同じ結果が返ってきました。
立てたクラスター(群)を削除する
バージニア北部リージョンのクラスターを「Delete」ボタンで削除します。
両リージョンのクラスター(とおそらく Witness リージョンのデータ)がまとめて削除されるようです。
confirm
を入力して「Delete」ボタンをクリックして、しばらく待つと、
両リージョンのクラスターが削除されました。
今後は
気になる「複数リージョンのクラスタへの書き込み」などを試してみる予定です。
2024/12/11 追記:
Aurora DSQL の楽観的同時実行制御(OCC)について記事を書きました。
明日(6 日目)の 2 枚目カレンダーの担当は noborus さんです。