Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
binary log と 2PC と Group Commit
Search
Takanori Sejima
September 08, 2016
Technology
33
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
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
1.1k
互換性のある(らしい)DBへの移行など考えるにあたってたいへんざっくり
sejima
1
4k
NAND Flash から InnoDB にかけての話(仮)
sejima
0
43
InnoDBのすゝめ(仮)
sejima
0
50
さいきんのMySQLに関する取り組み(仮)
sejima
0
40
sysloadや監視などの話(仮)
sejima
0
42
さいきんの InnoDB Adaptive Flushing (仮)
sejima
0
49
TIME_WAITに関する話
sejima
0
53
MySQLやSSDとかの話 その後
sejima
0
43
Other Decks in Technology
See All in Technology
PHPカンファレンス関西の招待状 / Invitation to PHP Conference Kansai
ykanoh
0
110
Benchmarking Disaggregated Serving on vLLM + Dynamo with a Real Coding-Agent Workload
nttcom
1
190
AI × アーキテクト 第1・2章|生成AIの課題とアーキテクトの素養
daidaidai
0
170
実践!Cloud Run ハンズオン!! / Cloud Run handson
y0hgi
2
280
オントロジーって 結局なにもの? AI エージェントに「意味」を渡す知識設計の話
greenmidori
0
180
コンテナ運用におけるネットワーク・コンテナコストの削減方法/How to Reduce Network and Container Costs in Container Operations
masakiokuda
1
150
ブラウザとサーバーから考えるAI時代のフロントエンド監視
shogo4131
3
940
PagerDuty Tech Hub-鳴らすけれど、人は動かない
ezaki
0
170
Tofu-Controller lightning talk @ Containerday 2026
gionn
0
100
スキマバイトという雇用形態は存在しないので、雇用期間1日のアルバイト契約を事業者とワーカーが結ぶ手続きを支えるのがタイミーなんです
akitoshiga
0
200
WasmをRustにする
sansantech
PRO
0
250
「Docker Desktop不要の時代」は 来たのか?
ueponx
0
770
Featured
See All Featured
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
33
5.2k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3.6k
RailsConf 2023
tenderlove
30
1.6k
Mozcon NYC 2025: Stop Losing SEO Traffic
samtorres
1
570
Lightning talk: Run Django tests with GitHub Actions
sabderemane
0
300
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
<Decoding/> the Language of Devs - We Love SEO 2024
nikkihalliwell
1
360
The Invisible Side of Design
smashingmag
301
52k
The Impact of AI in SEO - AI Overviews June 2024 Edition
aleyda
6
1.2k
A Modern Web Designer's Workflow
chriscoyier
699
190k
Building a Modern Day E-commerce SEO Strategy
aleyda
45
9.3k
The Power of CSS Pseudo Elements
geoffreycrofte
82
6.6k
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 のときの挙動 を書
いてるんですが、現状の実装と噛み合ってない ところもある。 - このへんバグレポートしようかと思ったけど、い やーなんていうのがいいんだろうむずかしい
おわり