Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
binary log と 2PC と Group Commit
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
Takanori Sejima
September 08, 2016
Technology
14
0
Share
binary log と 2PC と Group Commit
http://marv-tech.connpass.com/event/36743/
でお話させていただいた内容です。
Takanori Sejima
September 08, 2016
More Decks by Takanori Sejima
See All by Takanori Sejima
(きっとたぶん)人材育成や教育のような何かの話
sejima
0
720
互換性のある(らしい)DBへの移行など考えるにあたってたいへんざっくり
sejima
1
3.6k
NAND Flash から InnoDB にかけての話(仮)
sejima
0
19
InnoDBのすゝめ(仮)
sejima
0
15
さいきんのMySQLに関する取り組み(仮)
sejima
0
16
sysloadや監視などの話(仮)
sejima
0
13
さいきんの InnoDB Adaptive Flushing (仮)
sejima
0
14
TIME_WAITに関する話
sejima
0
24
MySQLやSSDとかの話 その後
sejima
0
16
Other Decks in Technology
See All in Technology
10サービス以上のメール到達率改善を地道に継続的に進めている話 / Continue to improve email delivery rates across multiple services
yamaguchitk333
6
1.6k
Every Conversation Counts
kawaguti
PRO
0
210
大学職員のための生成AI最前線 :最前線を、AIガバナンスとして読み直すためのTips
gmoriki
2
4k
CyberAgent YJC Connect
shimaf4979
1
180
ワールドカフェ再び、そしてゴール・ルール・ロール・ツール / World Café Revisited, and the Goals-Rules-Roles-Tools
ks91
PRO
0
150
Agent Skillsで実現する記憶領域の運用とその後
yamadashy
2
1.8k
SREの仕事は「壊さないこと」ではなくなった 〜自律化していくシステムに、責任と判断を与えるという価値〜 / 20260515 Naoki Shimada
shift_evolve
PRO
1
140
知ってた?JavaScriptの"正しさ"を検証するテストが5万以上もあること(Test262)
riyaamemiya
1
190
AIの揺らぎに“コシ”を与える階層化品質設計
ickx
0
270
SLI/SLO、「完全に理解した」から「チョットデキル」へ
maruloop
5
440
要件定義の精度を高めるための型と生成AIの活用 / Using Types and Generative AI to Improve the Accuracy of Requirements Definition
haru860
0
320
AIと乗り切った1,500ページ超のヘルプサイト基盤刷新とさらにその先の話
mugi_uno
2
340
Featured
See All Featured
Primal Persuasion: How to Engage the Brain for Learning That Lasts
tmiket
0
340
How to audit for AI Accessibility on your Front & Back End
davetheseo
0
360
Paper Plane (Part 1)
katiecoart
PRO
0
7.3k
Agile Actions for Facilitating Distributed Teams - ADO2019
mkilby
0
180
How to train your dragon (web standard)
notwaldorf
97
6.6k
Winning Ecommerce Organic Search in an AI Era - #searchnstuff2025
aleyda
1
2k
The Art of Programming - Codeland 2020
erikaheidi
57
14k
A brief & incomplete history of UX Design for the World Wide Web: 1989–2019
jct
1
370
How to Grow Your eCommerce with AI & Automation
katarinadahlin
PRO
1
180
Why You Should Never Use an ORM
jnunemaker
PRO
61
9.8k
Highjacked: Video Game Concept Design
rkendrick25
PRO
1
350
Gemini Prompt Engineering: Practical Techniques for Tangible AI Outcomes
mfonobong
2
390
Transcript
binary log と 2PC と Group Commit 瀬島 貴則 瀬島
貴則
免責事項 - 本資料は個人の見解であり、私が所属する組 織の見解とは必ずしも一致しません。 - 内容の一部に偏ったものがあるかもしれません が、各自オトナの判断でよろしくお願いします。
自己紹介 - わりとMySQLでごはんたべてます - 一時期は Resource Monitoring もよくやってま した -
Twitter: @ts4th
ちょっと宣伝 - 最近はわりとスライドを公開してますので - よろしかったら参考までに - http://www.slideshare.net/takanorisejima
今日のお題 - 先日、 MySQL5.7 GA の Multi-threaded slave というお題目でお話させていただく機会があった のですが
- Multi-Threaded Slave 以外の部分、 Two-Phase Commit と Group Commit の部分 は、 5.7 も MTS も使わない人でも、知っといて 損はない内容なので、今日はそのお話を改めて させていただきます。
では、 はじめます
はじめに - そもそも、 slave の SQL_Thread がシングルス レッドのとき、どのようにして replication で
master と同じ状態が復元されるのか? - いたってシンプル - master が注意深く binlog 吐いてる
例えば InnoDB の場合 1. master で更新処理実行中の各スレッドが、そ れぞれ transaction cache に更新内容をため
ていく 2. InnoDB で PREPARE する(5.7.10 以降、 innodb_support_xa は常に true) 3. 1. の transaction cache から一連の更新処理 を BEGIN&COMMIT で挟んで binlogに書く 4. InnoDBで COMMIT する
Two-Phase Commit & Group Commit - MySQL の Replication 開発者であらせられる
Dr. Mats Kindahl の blog この記事がわかりや すいですが - Binary Log Group Commit in MySQL 5.6 - (この後の話に関連して)大事なところを二つだ けかいつまんで解説すると
Two-Phase Commit(2PC) - 参考になるのは ha_commit_trans() や MYSQL_BIN_LOG::ordered_commit() あたり - Binary
Log Group Commit in MySQL 5.6 の Figure.1 のとおり - storage engine(InnoDBなど)に prepare して - binlog に 書いて - binlog に COMMIT(fsync) してから - storage engineに COMMIT する
Transaction Coordinator Log - ソースコード中に tc_log ってのが出てきますが - Transaction の順序を管理するための
Log の 抽象クラスが TC_LOG であって、その実装の ひとつが MYSQL_BIN_LOG - MYSQL_BIN_LOG::prepare() や MYSQL_BIN_LOG::commit() が、 Two-Phase COMMIT を実現するために必要 な関数を呼んでる
innodb_support_xa=true と 2PC - innodb_support_xa=true だと、 prepare のと き undo
log に xid が書き込まれる(5.7.10以降 は常にそうなる) - undo log に xid 書き込まれた PREPARED な transaction は、 クラッシュ後の再起動時、 binlog から xid 読み込んだ後、その xid 使って innobase_commit_by_xid() で最終的に COMMIT される
なんかややこしいですが - クラッシュリカバリ時、xid のない PREPARED は rollback の 対象になるんですが、 xid
つき の PREPARED は binlog からその xid が取得 できれば COMMIT にできるようです。詳しくは - innobase_xa_prepare() - MYSQL_BIN_LOG::recover() - innobase_xa_recover() - innobase_commit_by_xid()
というわけで、 MySQL の 2PC は - InnoDB のクラッシュリカバリ機能単体では実現 できず、 InnoDB
のクラッシュリカバリ機能と binlog のクラッシュリカバリ機能とが組み合わ さって、実現されてるようです - binlog のヘッダには open するときに立てて close する ときにリセットするフラグがあるので、正常に close した か(クラッシュしてないか)は、フラグをみて判断してます
Group Commit - Binary Log Group Commit in MySQL 5.6
の Figure.5 を参照 - flush/sync/commit という stage がある - binlog へ書き出す のが flush stage - binlog に fsync() する のが sync stage - storage engine に commit するのが commit stage - flush stage に書きだした順序で、 commit stage で commit することが保証されている
ソースコード的にいうと - Group Commit はまさに MYSQL_BIN_LOG::ordered_commit() - flush/sync/commit の stage
を queue で管理 することによって、 fsync() の回数を減らして、 binlog に event 書き出す順番と storage engine に commit する順番を担保している - そして、 binlog に書くとき、各 Transaction を BEGIN - COMMIT でシリアライズしてる
だから binary log は読みやすいし - そして slave の SQL_Thread は性能がでない
- master は Transaction を並列実行しながらも、 それらをひとかたまりの BEGIN - COMMIT に まとめシリアライズして binlog に吐いている - master では並列実行してる Transaction が、 slave だと BEGIN - COMMIT のひとかたまり が、ひとつずつしか実行できない - まぁ SQL_Thread はシングルスレッドだしね
ではちょっとデモ 1. debug build した mysqld を用意します 2. お手元の gdb
で attach します 3. MYSQL_BIN_LOG::sync_binlog_file() あたり に break point 張って continue します 4. 適当に INSERT などします 5. binlog を fsync() させたら gdb から kill します 6. innobase_commit_by_xid() 実行されます
公式ドキュメントちょっと悩ましい - XA PREPARE なトランザクションはロールバッ クする とか sync_binlog=1 のときの挙動 を書
いてるんですが、現状の実装と噛み合ってない ところもある。 - このへんバグレポートしようかと思ったけど、い やーなんていうのがいいんだろうむずかしい
おわり