Aurora DSQL と楽観的同時実行制御(OCC)

799 Views

December 26, 24

スライド概要

AWS re:Invent 2024 re:Cap 名古屋 2024/12/26

profile-image

Qiita や Zenn でいろいろ書いてます。 https://qiita.com/hmatsu47 https://zenn.dev/hmatsu47 MySQL 8.0 の薄い本 : https://github.com/hmatsu47/mysql80_no_usui_hon Aurora MySQL v1 → v3 移行計画 : https://zenn.dev/hmatsu47/books/aurora-mysql3-plan-book https://speakerdeck.com/hmatsu47

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

関連スライド

各ページのテキスト
1.

Aurora DSQL と楽観的同時実行制御(OCC) AWS re:Invent 2024 re:Cap 名古屋 2024/12/26 まつひさ(hmatsu47)

2.

自己紹介 松久裕保(@hmatsu47) ● https://qiita.com/hmatsu47 ● 名古屋で Web インフラのお守り係をしています ● 普段は JAWS-UG 名古屋(・浜松)で DB ネタを中心 に話しています(主に RDS / Aurora・たまに DynamoDB) ● 全国各地の JAWS(& AWSJ)イベントを巡っています ○ DAYS(東京)→佐賀→金沢(福井開催)→山形→ Summit →ミート(豊橋)→ 岩手(滝沢)→青森(弘前) 2

3.

12/4 に Aurora DSQL(プレビュー)発表 ● シングルリージョン/マルチリージョン大規模分散 DB ○ リレーショナルモデルと SQL が使用可能 ■ いわゆる NewSQL の一種 ○ ワークロードに合わせて自動でスケール(UP / DOWN) ○ PostgreSQL ワイヤープロトコル互換 ■ 対応 SQL 文は PostgreSQL のサブセット ○ アクティブ/アクティブ構成 ■ マルチ Writer でシャーディングを使わないアーキテクチャ 3

4.

[1] シングルリージョン構成(可用性 99.99%) Transaction log layer がある 引用元 : https://aws.amazon.com/jp/blogs/news/introducing-amazon-aurora-dsql/ 4

5.

[2] マルチリージョン構成(可用性 99.999%) Witness Region がある (リージョンクラスター間調停・ 障害リージョンのデータ修復) 引用元 : https://aws.amazon.com/jp/blogs/news/introducing-amazon-aurora-dsql/ 5

6.

Aurora PostgreSQL Limitless Database では? 前段のルーター層でコマンド/ クエリをシャードに振り分ける 各シャードでデータを分割管理 する (テーブルの種類によってデータの 配置は異なる) Limitless Database はシャーディング によってデータと負荷を分散するので テーブル設計が難しい 引用元 : https://aws.amazon.com/jp/blogs/news/amazon-aurora-postgresql-limitless-database-is-now-generally-available/ 6

7.

シャーディングを使わずにスケールするには? ● 楽観的同時実行制御(OCC)を採用 注:ほかにもスケールの ために採用した技術はあ るはず ○ 一般の RDBMS は悲観的同時実行制御(PCC)を採用 ■ ロック機構を使う ○ OCC ではロックを使わない ■ コミット時に他のトランザクションとの更新競合を検知したらアボート ■ アボート後必要に応じてリトライ処理(アプリケーション側で実装) ○ ロックしないので他のトランザクションを待たせることがない ■ ただし更新競合が頻発するとアプリケーションの性能が下がる欠点がある 7

8.

例 [1] 通常の RDBMS(PCC / READ COMMITTED) トランザクション A トランザクション B 開始(BEGIN) テーブル X の id = 1 の行 (コミット済み) 10(初期値) 開始(BEGIN) テーブル X の id = 1 の値を +1 →id = 1 の行ロック獲得成功 (11) (別の処理を実行) テーブル X の id = 1 の値を +1 →id = 1 の行ロック獲得待ち コミット(COMMIT)→成功 (↑行ロック獲得待ち) 11 id = 1 の行ロック獲得成功 (12) (別の処理を実行) コミット(COMMIT)→成功 12 8

9.

例 [2] Aurora DSQL(OCC / SNAPSHOT ISOLATION) トランザクション A トランザクション B テーブル X の id = 1 の行 (コミット済み) 開始(BEGIN) 10(初期値) 開始(BEGIN) テーブル X の id = 1 の値を +1 →id = 1 の行 : 11 (別の処理を実行) テーブル X の id = 1 の値を +1 →id = 1 の行 : 11 コミット(COMMIT)→成功 (別の処理を実行) 11 コミット(COMMIT) →失敗・アボート 必要ならリトライする 9

10.

OCC は PCC と比べて本当に効率が良いのか? ● そもそも更新競合が少ないケースで使うもの ○ 更新競合が多い処理→別データストアを選択して実装したほうが 良い ● 分散 DB ではネットワークの遅延が大きく影響 ○ 都度ロックする場合、地理的に離れたノード・クラスターにも ロックの伝達が必要 →トランザクションコミット時にまとめて確認したほうが効率が良い 10

11.

OCC の注意点 ● 長いトランザクションには向かない ○ あくまでも更新競合が少ないトランザクション向け ■ トランザクションが長くなるほど更新競合が発生しやすくなる ● リトライはアプリケーションで実装する必要がある ● コミット成功の順序が保証されない ○ トランザクション A → B → C で B が競合してリトライすると、 コミット成功の順序が A → C → B(リトライ)になることも 11

12.

まとめ ● Aurora DSQL は SQL が使える大規模分散 DB ○ シングルリージョンでもマルチリージョンでも使える ○ OCC の採用などによりシャーディングなしにスケールが可能に ● 通常の RDBMS とはトランザクションの流れが異なる ○ 更新が競合したらアボート ○ 必要ならアプリケーション側でリトライ処理を実装する 12

13.

宣伝 : PHP カンファレンス名古屋 2025 開催! ● PHP 以外の話も(少し)あります!(私は MySQL の話を…) ○ https://phpcon.nagoya/2025/ 13