>100 Views
July 04, 25
スライド概要
JAWS ミート 2025
2025/7/5
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
ゲームで体感! Aurora DSQL の OCC (楽観的同時実行制御) JAWS ミート 2025 2025/7/5 まつひさ(hmatsu47)
自己紹介 松久裕保(@hmatsu47) ● https://qiita.com/hmatsu47 ● 現在: ○ 名古屋で Web インフラのお守り係をしています ○ SRE チームに所属しつつ技術検証の支援をしています ○ 普段カンファレンス・勉強会では DB の話しかしていません (ほぼ) 2
本日の内容 ● Aurora DSQL おさらい ○ 今年の 5/30 に GA ■ 東京・大阪でシングルリージョン構成をリリース ● OCC(楽観的同時実行制御)おさらい ○ 通常の RDBMS(PCC)との違い ● ゲームで確かめよう! ● 答え合わせ 3
Aurora DSQL おさらい 4
サーバーレス分散 SQL データベース ● PostgreSQL ワイヤープロトコル互換 ○ psql コマンドが使える ● シングルリージョン構成とマルチリージョン構成がある ○ マルチリージョン構成は US 3 リージョン/欧州 3 リージョン/ 東京+大阪+ソウルの組み合わせでサポート ■ エンドポイントは 2 リージョン、残り 1 つは Witness リージョンで構成 5
国内のみでつくるならシングルリージョン構成 引用元 : https://aws.amazon.com/jp/blogs/news/introducing-amazon-aurora-dsql/ 6
それぞれの階層で負荷等に合わせて水平スケール AWS Summit Japan 2025 AWS-43 資料より 引用元 : https://aws.amazon.com/jp/blogs/news/introducing-amazon-aurora-dsql/ 7
OCC おさらい 8
シャーディングを使わずにスケールする…? ● 楽観的同時実行制御(OCC)を採用 ○ 一般の RDBMS は悲観的同時実行制御(PCC)を採用 ■ ロック機構を使う ○ OCC ではロックを使わない ■ コミット時に他のトランザクションとの更新競合を検知したらアボート ■ アボート後必要に応じてリトライ処理(アプリケーション側で実装) ○ ロックしないので他のトランザクションを待たせることがない ■ ただし更新競合が頻発するとアプリケーションの性能が下がる欠点がある 9
例 [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 10
例 [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) →失敗・アボート 必要ならリトライする 11
さて問題です トランザクション A トランザクション B テーブル X の id = 1 の行 (コミット済み) 開始(BEGIN) 10(初期値) 開始(BEGIN) テーブル X の id = 1 の値を +1 →id = 1 の行 : 11 (別の処理を実行) どちらかの タイミングで 11 に テーブル X の id = 1 の値を +1 →id = 1 の行 : 11 コミット(COMMIT)→?? コミット(COMMIT)→?? ?? ?? 成功するのはどっち? 12
ゲームで 確かめよう! 13