# WiredTiger WiredTigerは、現在[[MongoDB]]のデフォルトになっているストレージエンジンである。行ストアのBツリー実装ではメモリ内のページとディスク上のページに異なるフォーマットを使用し、メモリ内のページはディスク上で永続化する前に調停プロセスを経由させる必要がある。クリーンなページはインデックスのみで構成され、最初はディスク上のページイメージから構築される。更新はまず更新バッファに保存され、更新バッファは読み取り時にアクセスされてディスク上のもとのページ内容とマージされ最新のデータが返される。ページがフラッシュされると更新バッファの内容はページの内容と調停が行われディスクに永続化され、もとのページは上書きされる。調停結果のページが最大サイズより大きい場合には複数ページにスプリットされる。更新バッファはスキップリストを使用して実装され、検索ツリーと類似した複雑性を持つが優れた同時実行の特性を持つ。クリーンなページ・ダーティなページのどちらもメモリ内のバージョンを持ちディスク上のベースイメージを参照し、ダーティページはさらに更新バッファを持つ。ページの更新と構造変更(スプリット・マージ)がバックグラウンドスレッドで実行されるため、読み取り・書き込みプロセスはそれらの完了を待つ必要がない。この設計は、本 wiki が「遅延Bツリー(Lazy B-Tree)」と呼ぶ類型の代表例である。(Source: [[@2021__OReillyJapan__詳説 データベース - Chapter 6 Bツリーの亜種]] §6.3.1) WiredTigerはBTreeとLSM(Log-Structured Merge)ツリーの2種類のデータ構造を選択できる。[[@2025__SoCC__Valet - Efficient Data Placement on Modern SSDs]]は、BTreeモードがin-place更新を要求するためvalet-mapperと非互換である一方、LSMモードにはValetを変更なしで適用できることを示した。WiredTigerはlogストリームとsst(SSTable)ストリームの2種類の書き込みを行うが、logの書き込みには`mmap()`が使われるためin-placeかつ順序保証のない更新が必要になり、valet-mapperの非対応部分としてランダム書き込み領域で処理される。(Source: [[@2025__SoCC__Valet - Efficient Data Placement on Modern SSDs]]) ## 関連 - ソース: [[@2021__OReillyJapan__詳説 データベース - Chapter 6 Bツリーの亜種]] / [[@2025__SoCC__Valet - Efficient Data Placement on Modern SSDs]] - エンティティ: [[MongoDB]] / [[Valet]] - 概念: [[B-Tree]] / [[LSMツリー]] ## 出典 - [[@2021__OReillyJapan__詳説 データベース - Chapter 6 Bツリーの亜種]](§6.3.1 WiredTiger — 更新バッファ・調停プロセス・遅延Bツリーとしての位置づけ) - [[@2025__SoCC__Valet - Efficient Data Placement on Modern SSDs]](BTree/LSMモードの選択、logストリーム・sstストリームの物理配置)