ファジーチェックポイントと一貫したチェックポイント
再起動が遅いのはなぜか、その勘所がつかめます。処理を止めず徐々に書き出すファジーチェックポイントと、全停止する一貫チェックポイントの違いを、WAL の再生範囲とリカバリ時間の観点から原理から解きます。
- 1.チェックポイントの本質は「ここまではデータページに反映済み」という基準点を WAL に刻み、リカバリで再生すべきログの範囲を有界化すること。これが無いと復旧は DB 開始時点からの全ログ再生になる。
- 2.一貫チェックポイントは更新を一瞬止めて全ダーティページを書き出し基準点を一点に揃える。ファジーチェックポイントは処理を止めず、ダーティページ表のスナップショットだけを記録して書き戻しはバックグラウンドに委ねる。実用 DBMS は後者を採る。
- 3.リカバリ時間はチェックポイント間隔とダーティページ量で決まる。間隔を詰めれば復旧は速いが平常時の書き戻し I/O が増える、というトレードオフを spread checkpoint やダーティ率の上限で調停する。
チェックポイントは何のためにあるか
WAL(先行書き込みログ) を採る DBMS は、コミット時にデータページを書き戻さず、ログだけを永続化します。速い代わりに、ディスク上のデータページは「いつの時点まで反映されているか」がページごとにバラバラになります。クラッシュリカバリはこの食い違いを WAL の再生(redo)で埋めますが、何の基準点も無ければ DB 開始時点から全ログを redo する羽目になり、ログは無限に伸び、復旧は無限に遅くなります。
これを区切るのが チェックポイント です。チェックポイントは「この LSN 以前の変更はすべてデータページへ反映済み」という保証点を WAL に刻みます。リカバリはその点以降のログだけ見ればよくなり、再生時間が有界になります。同時に、それより古い WAL は(アーカイブ等の用途が無ければ)回収・再利用できます。
チェックポイントの本質は、ダーティページを書き戻すこと「ではなく」、再生開始点を WAL 上に確定してリカバリ範囲を有界化することにある。書き戻しは手段、有界化が目的です。
この目的の達成方法に二つの流儀があり、それが一貫チェックポイントとファジーチェックポイントです。
一貫(consistent / sharp)チェックポイント
最も素直なのは、チェックポイント時にデータベースを一貫した一点へ揃えるやり方です。手順は概念的にこうなります。
1. 新規トランザクションの更新を一時停止(または静止点まで待つ)
2. 実行中の更新がページに反映され切るのを待つ
3. バッファ上の全ダーティページをディスクへ書き戻し、fsync
4. 「checkpoint(LSN=C)」レコードを WAL に書き、fsync
5. 更新を再開
この方式の利点は、リカバリが極めて単純になることです。チェックポイント完了時点でディスク上の全ページが LSN = C まで反映済みと保証されるため、リカバリは C 以降のログだけを redo すれば足り、ダーティページ表のような付帯情報も要りません。「一貫」「sharp(鋭い)」と呼ばれるのは、基準点が時間軸上の一点に集約されるからです。
手順1〜3の間、更新は事実上止まります。大きなバッファプールには数 GB 〜数十 GB のダーティページが載り得て、その全書き戻しと fsync が終わるまでスループットがゼロに落ち込みます。バッファが大きいほどチェックポイントの停止時間が伸びる、という性能と容量の逆相関が生じるため、メモリを潤沢に積む現代の DBMS では実用になりません。
ファジー(fuzzy)チェックポイント
実用 DBMS が採るのが ファジーチェックポイント です。「ファジー(曖昧)」の名は、チェックポイントの瞬間にデータベースが一貫した一点に揃っていない――どのページがどこまでディスクに着地しているか曖昧なまま進める――ことに由来します。発想を逆転させ、ページの書き戻しを待たずに基準点だけを刻みます。
核心は、平常時にメモリ上で維持される二つの表をスナップショットすることです。
- ダーティページ表(DPT, Dirty Page Table): 変更済みでまだディスク未着地のページ集合。各エントリは
(ページID, recLSN)を持つ。recLSNは「そのページを最初に汚した変更の LSN」で、redo の開始点を決める。 - トランザクション表(TT): 実行中トランザクションの集合。各エントリは
(トランザクションID, 状態, lastLSN)を持つ。
ファジーチェックポイントは、更新を止めずにこの DPT と TT のスナップショットを WAL に書くだけです。ダーティページの実際の書き戻しは、バッファ管理のバックグラウンド書き出し(バッファプールとページ置換)に委ねます。
直感に反しますが、ARIES 流のファジーチェックポイント自体はダーティページを強制 flush しません。記録するのは DPT と TT の中身だけ。だからチェックポイント時点で DPT に載るページは「まだ未着地かもしれない」もので、リカバリの Redo がそれらを各ページの recLSN から再適用して着地を保証します。チェックポイントを軽量に保ちながら復旧範囲を有界化する、これがファジーチェックポイントの狙いです。
スナップショット記録中も更新は走り続けるため、チェックポイントの「開始」と「終了」レコードの間に新たな更新が挟まり得ます。リカバリはこの揺らぎを許容する設計になっており、begin_checkpoint と end_checkpoint の双方を見て一貫した起点を再構築します。これが「曖昧でも正しく復旧できる」仕掛けの正体です。
二方式の比較
| 観点 | 一貫(sharp)チェックポイント | ファジー(fuzzy)チェックポイント |
|---|---|---|
| 更新の停止 | 全ダーティページ書き戻し完了まで実質停止 | 止めない(処理を続けながら記録) |
| 何を書き出すか | バッファ上の全ダーティページ+基準点レコード | DPT と TT のスナップショット(ページは書かない) |
| 平常時への影響 | 周期的に大きなスループット低下(停止) | I/O をバックグラウンドに分散し平準化 |
| リカバリ手順 | 基準点以降を redo するだけで単純 | Analysis で DPT/TT を再構築してから redo/undo |
| 大バッファでの実用性 | 停止時間がバッファ容量に比例し非実用 | バッファが大きくても影響が一定で実用的 |
一貫チェックポイントはリカバリこそ単純ですが、平常時の停止が許容できません。ファジーチェックポイントは平常時を止めない代わりに、リカバリで DPT・TT を再構築する Analysis フェーズ を必要とします。実装の複雑さを復旧側に寄せて平常時を守る、というのが現代 DBMS の選択です。詳しい3フェーズ復旧は ARIES リカバリアルゴリズム を参照してください。
リカバリ時間との関係
リカバリで redo すべきログ量は、おおむね「最後のチェックポイント以降に蓄積したダーティページの変更量」で決まります。ここにチェックポイント間隔が効きます。
チェックポイント間隔を短く → 各時点のダーティ量が少ない → redo が短い → 復旧速い
→ ただし書き戻し I/O が高頻度 → 平常時スループットが波打つ
チェックポイント間隔を長く → 平常時 I/O は軽い
→ ダーティ量が溜まり redo が長い → 復旧遅い
つまりチェックポイントは 平常時のコスト と 復旧時間(RTO) のトレードオフを調停するつまみです。ファジー方式でも、書き戻しを短時間に集中させればミニ「一貫チェックポイント」と同じ I/O スパイクを生むため、実装の多くは書き戻しを次のチェックポイントまでの時間に分散(spread checkpoint) し、I/O のピークをならします。PostgreSQL の checkpoint_completion_target はまさにこの分散割合を指定するパラメータです。
間隔(時間)だけでなく「ダーティページが一定量たまったら起動」という量ベースのトリガを併用すると、書き込みが激しい時間帯でも redo 量の上限を抑えられます。MySQL(InnoDB)のシャープ/ファジーチェックポイントや、ダーティページ比率に基づく適応的フラッシュはこの考え方です。復旧時間の目標から逆算して間隔とダーティ率の上限を決めるのが運用の勘所です。
チェックポイントの書き戻しは大量のランダムページ fsync を伴います。間隔を詰めると、平常時にこの fsync 嵐が頻発し、コミットの fsync(WAL のグループコミット)と帯域を奪い合います。復旧を速くするつもりが平常時のテールレイテンシを悪化させる、という逆効果に注意。ストレージの書き込み帯域とチェックポイント設定は必ずセットで見積もってください。
試験・実務での要点
「ファジーと一貫の違いは」――一貫は更新を止めて全ダーティページを flush し基準点を一点に揃える、ファジーは止めず DPT/TT のスナップショットだけ記録し書き戻しはバックグラウンドに委ねる。「なぜ実用 DBMS はファジーを選ぶか」――バッファが大きいほど一貫チェックポイントの停止が伸び非実用だから。「チェックポイント間隔を詰めると何が起きるか」――復旧(RTO)は速くなるが平常時の書き戻し I/O が増えスループットが波打つ、と対で答えられると強いです。
まとめ
チェックポイントの目的は、WAL のリカバリ範囲を有界化する基準点を刻むことに尽きます。一貫チェックポイントは更新を止めて全ダーティページを書き戻し、基準点を一点に揃えるためリカバリは単純ですが、バッファ容量に比例して停止が伸びるため実用になりません。ファジーチェックポイントは処理を止めず、DPT と TT のスナップショットだけを記録して書き戻しをバックグラウンドへ分散し、復旧側で Analysis フェーズを担う代わりに平常時を守ります。チェックポイント間隔は復旧時間と平常時コストのトレードオフを握るつまみで、spread checkpoint やダーティ率の上限で I/O スパイクをならすのが要点です。
物理層で永続性を支える土台は WAL の仕組み、ダーティページとバックグラウンド書き出しの実体は バッファプールとページ置換、チェックポイントを起点にした3フェーズ復旧は ARIES リカバリアルゴリズム を合わせて読むと、復旧機構の全体像が立体的に見えてきます。
データベース Article
ファジーチェックポイントと一貫したチェックポイントを実務で読む
TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。
解決すること
チェックポイント
比較で見る軸
難易度: advanced / カテゴリ: データベース / タグ数: 5
導入後に効く点
一貫チェックポイントは更新を一瞬止めて全ダーティページを書き出し基準点を一点に揃える。ファジーチェックポイントは処理を止めず、ダーティページ表のスナップショットだけを記録して書き戻しはバックグラウンドに委ねる。実用 DBMS は後者を採る。
先に潰すリスク
用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。
- 難易度
- advanced
- カテゴリ
- データベース
- タグ数
- 5
判断チェックリスト
- 自社の用途が「チェックポイント / WAL」に近いか確認する。
- 強みである「チェックポイントの本質は「ここまではデータページに反映済み」という基準点を WAL に刻み、リカバリで再生すべきログの範囲を有界化すること。これが無いと復旧は DB 開始時点からの全ログ再生になる。」が本当に評価軸になるか確認する。
- 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
- 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
- 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
- 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。