CubicLouve

Spring_MTの技術ブログ

Amazon Aurora: Design Considerations for High Throughput Cloud-Native Relational Databasesを読む(その4の補足資料)

MySQLは8.0.19を使っています。

LSN

LSNとは Log Sequence Number の略で、単調増加する値で、redoログに書き込まれたバイト数分だけLSNが増えます。

dev.mysql.com

MySQLでは SHOW ENGINE INNODB STATUS でLSNを確認できます。

---
LOG
---
Log sequence number          137326682480
Log buffer assigned up to    137326682480
Log buffer completed up to   137326682480
Log written up to            137326682480
Log flushed up to            137326682480
Added dirty pages up to      137326682480
Pages flushed up to          137326682480
Last checkpoint at           137326682480
13 log i/o's done, 0.00 log i/o's/second

これらの値は、下記で定義されています。

github.com

INSERTするときのLSNが増える様子を示します。

SQL LSN comments
---
LOG
---
Log sequence number 137326682480
Log buffer assigned up to 137326682480
Log buffer completed up to 137326682480
Log written up to 137326682480
Log flushed up to 137326682480
Added dirty pages up to 137326682480
Pages flushed up to 137326682480
Last checkpoint at 137326682480
13 log i/o's done, 0.00 log i/o's/second
BEGIN; ---
LOG
---
Log sequence number 137326682480
Log buffer assigned up to 137326682480
Log buffer completed up to 137326682480
Log written up to 137326682480
Log flushed up to 137326682480
Added dirty pages up to 137326682480
Pages flushed up to 137326682480
Last checkpoint at 137326682480
13 log i/o's done, 0.00 log i/o's/second
BEGINではLSNは増えない
INSERT INTO innodb_auto_increment_small VALUES(); ---
LOG
---
Log sequence number 137326682671
Log buffer assigned up to 137326682671
Log buffer completed up to 137326682671
Log written up to 137326682671
Log flushed up to 137326682671
Added dirty pages up to 137326682671
Pages flushed up to 137326682671
Last checkpoint at 137326682671
17 log i/o's done, 0.36 log i/o's/second
COMMIT; ---
LOG
---
Log sequence number 137326682878
Log buffer assigned up to 137326682878
Log buffer completed up to 137326682878
Log written up to 137326682878
Log flushed up to 137326682878
Added dirty pages up to 137326682878
Pages flushed up to 137326682878
Last checkpoint at 137326682878
19 log i/o's done, 0.13 log i/o's/second

トランザクション中でもLSNは増加します。

このあたりはredoログの実装周りを見ればよいかなと思います。

dev.mysql.com

MTR

ごく僅かな一連のデータベージへの変更を記録したもの。

redoログは512バイトのブロックの連続で、個々のMTRはブロックをまたいで記録されることもある。

dev.mysql.com

(詳解 MySQL5.7 p 126)

AuroraのLSN関連の概念

Name Full Name description
VCL Volume Complete LSN すべてのログレコードの可用性を保証できる一番大きいLSN
SCL Segment Complete LSN セグメントの中の最大のLSN、セグメントの穴を探すのに使われる
PGCL Protection Group Complete LSN PG内の最大のLSN
CPLs Consistency Point LSNs 一つのMTRのなかの最後のログレコードのLSN
VDL Volume Durable LSN VCLより小さいが最も大きいCPLMTRが完了したことを示している
PGMRPL Protection Group Min Read Point LSN データ読み込済みのPGごとの最小のLSN

ストレージの一貫性のポイントの例

f:id:Spring_MT:20210322162847p:plain

書き込み、Commitをする場合

f:id:Spring_MT:20210323040453p:plain f:id:Spring_MT:20210323040611p:plain

最後は、最新のVDLがトランザクションのコミットLSN以上になったのでクライアントにackを送る。

読み込み

f:id:Spring_MT:20210323162524p:plain

read replica

f:id:Spring_MT:20210323174517p:plain

Recovery

f:id:Spring_MT:20210324165018p:plain f:id:Spring_MT:20210324165046p:plain