Mais conteúdo relacionado
Semelhante a WiredTigerを詳しく説明 (20)
Mais de Tetsutaro Watanabe (19)
WiredTigerを詳しく説明
- 2. Copyright ⓒ2017 CREATIONLINE, INC. All Rights Reserved
自己紹介
2
{"ID" :"fetaro"
"名前":"渡部 徹太郎"
"研究":"東京工業大学でデータベースと情報検索の研究
(@日本データベース学会)"
"仕事":{前職:["証券会社のオンライントレードシステムのWeb基盤",
"オープンソースなら何でも。主にMongoDB,NoSQL"],
現職:["大手Web企業の横断分析基盤,Exadata,Hortonworks,EMR"]
副業:["MongoDBコンサルタント" ]}
"エディタ":"emacs派",
"趣味": ["自宅サーバ","麻雀"]
}
- 4. Copyright ⓒ2017 CREATIONLINE, INC. All Rights Reserved
OS ファイルシステム
WiredTigerとは
• MongoDBの心臓部!
– MongoDBのストレージエンジン
– データの読み書きを担当
– C言語で書かれたOSSを
MongoDB,Incが買収して組み込んだ
• MongoDBの単体性能
≒WiredTigerの性能
4
アプリケーション
MongoDBドライバ
mongodプロセス
WiredTiger
ジャーナル
WiredTiger
データ
WiredTiger
インデックス
ストレージエンジン
WiredTiger
ストレージAPI
クエリエンジン
WiredTigerの担当部分
ディスク
メモリ
Mongoクエリ
BSONと
インデックスの
読み書き
キャッシュ
ファイルIO
- 5. Copyright ⓒ2017 CREATIONLINE, INC. All Rights Reserved
WiredTigerの登場前はMMAPv1
• MongoDB 2.6まではストレージエンジンはMMAPv1だった
– MMAPv1は手抜きのストレージ
• MonvoDB 3.0からはWiredTigerを導入
– ほぼ全ての側面でWiredTigerが優れている(読み込み性能以外)
5
WiredTiger MMAPv1
MongoDB 2.6 ー ✔デフォルト
MongoDB 3.0 (オプション) ✔デフォルト
MongoDB 3.2 ✔デフォルト (オプション)
MongoDB 3.4 ✔デフォルト (オプション)
- 6. Copyright ⓒ2017 CREATIONLINE, INC. All Rights Reserved
WiredTiger と MMAPv1 の違い
6
WiredTiger MMAPv1
概要 特徴 データ永続化に特化 OS提供機能でシンプルに実
装
アーキテクチャ MVCC
(更新は全て追記)
データファイルそのものを
更新
性能 書き込み性能 ◯
ドキュメント単位ロックで高
速
✕
コレクション単位ロックで
低速(※)
読み込み性能 ◯追記型なのでやや複雑 ◎シンプルなので速い
メモリ制限 ◯可能 ✕不可能
(OSが割り当てるだけ使う)
ファイル
システム
データ圧縮 ◯可能 ✕不可能
インデックス圧縮 ◯可能 ✕不可能
データファイルのフラグ
メンテーション
◯最小限 △ドキュメントの肥大化に
より発生
データとインデックスの
分離
◯可能 ✕不可能
耐障害性 ジャーナル無しでクラッ
シュしたとき
◯追記型なので壊れない ✕ドキュメントが壊れる
(リペアが必要)
(※)2.6以前はデータベース単位ロック
- 8. Copyright ⓒ2017 CREATIONLINE, INC. All Rights Reserved
MMAPv1の動き
• 起動時
– mongodは、OSに対して、
データベースファイルをメモリにmapするように依頼する
– システムコールmmap()を実行
– 起動直後はメモリは空
8
doc1 doc3index doc2
ディスク
メモリ
mongodプロセス
OSが管理
ブロック
データベースファイル
mmap(
)
- 9. Copyright ⓒ2017 CREATIONLINE, INC. All Rights Reserved
MMAPv1の動き
• doc1を読む
– mongodは、OSに対して、ブロックの取得を依頼
– OSは、メモリ上にないので、ディスクから読む(=遅い)
• ページフォルト発生
• doc1と関連するindexのブロックだけが読み込まれる
9
doc1 doc3index doc2
ディスク
メモリ
doc1
mongodプロセス
index
- 10. Copyright ⓒ2017 CREATIONLINE, INC. All Rights Reserved
MMAPv1の動き
• doc1をもう一度読む
– mogodは、OSに対して、ブロックの取得を依頼
– OSは、メモリにあるので、メモリから返す応答する(=速い)
10
doc1 doc3index doc2
ディスク
メモリ
doc1
mongodプロセス
index
- 11. Copyright ⓒ2017 CREATIONLINE, INC. All Rights Reserved
MMAPv1の動き
• doc2を読む
– indexはメモリにあるが、doc2はメモリにないので、ディスク
から読む(遅い)
11
doc1 doc3index doc2
ディスク
メモリ
doc1
mongodプロセス
doc2index
- 12. Copyright ⓒ2017 CREATIONLINE, INC. All Rights Reserved
MMAPv1の動き
• doc3を読む
– doc3はメモリにないので、ディスクから読む
– 空きがないので、最もアクセス頻度の低いブロックを追い出す(ス
ワップアウト)
12
doc1 doc3index doc2
ディスク
メモリ
mongodプロセス
index doc3
- 13. Copyright ⓒ2017 CREATIONLINE, INC. All Rights Reserved
MMAPv1の動き
• doc1を更新(ジャーナル無し)
– mongodは、OSに対して、コレクション単位のロックを依頼して更新
– 他のスレッドからの書き込みは待たされる(=遅くなる)
– メモリ上にindexとdoc1があればメモリ上で更新は完結。なければIO発生
– 非同期でディスクに書き戻し(60秒に一回)
• クラッシュすると最悪60秒間ロストする&データベースファイルが破損する
13
doc1 doc3index doc2
ディスク
メモリmongodプロセス
doc2index'
スレッド スレッド
書き込みを待たされる2.ロック・
doc1とindexを更
新 ×
1.アプリからクエリ4.アプリに返却
ロック開放
5.60秒に1回ディスクに書き戻し
fsync()
doc1'
- 14. Copyright ⓒ2017 CREATIONLINE, INC. All Rights Reserved
MMAPv1の動き
• doc1を更新(ジャーナル有り)
– ジャーナルファイルに更新内容を記載
• クラッシュしても100ms以内の変更は保持
• クラッシュしてもデータ破損自動修復
14
doc1 doc3index doc2
ディスク
メモリmongodプロセス
doc2
スレッド
2.ロックを取得
更新内容を追記
ジャーナル
ジャーナル
5.100msに1回flash
(j:trueなら即時)
4.アプリに返却
ロックを開放
1.アプリからクエリ
3. doc1とindexを
更新
6.60秒に1回ディス
クに書き戻し
doc1'index'
- 15. Copyright ⓒ2017 CREATIONLINE, INC. All Rights Reserved
mongodプロセス
WiredTigerキャッシュ
WiredTigerの動き
• 起動直後
– WiredTigerキャッシュは空
15
doc1
doc
3index ディスク
メモリ
doc2
Readスレッド Writeスレッド
dirtyページ
cleanページ
on diskページ
root
- 16. Copyright ⓒ2017 CREATIONLINE, INC. All Rights Reserved
mongodプロセス
WiredTigerキャッシュ
WiredTigerの動き
• doc1を読む
– ツリーが形成される
– ツリーのリーフはディスクのページ毎に読み込まれている
– indexとdocが含まれるページがキャッシュにのる
16
doc1
doc
3index ディスク
メモリ
doc2
Readスレッド Writeスレッド
doc1index
root
dirtyページ
cleanページ
on diskページ
- 17. Copyright ⓒ2017 CREATIONLINE, INC. All Rights Reserved
mongodプロセス
WiredTigerキャッシュ
WiredTigerの動き
• doc2やdoc3を読む
– キャッシュにのる
17
doc1
doc
3index ディスク
メモリ
doc2
Readスレッド Writeスレッド
doc1index
root
doc
3
doc2 dirtyページ
cleanページ
on diskページ
- 18. Copyright ⓒ2017 CREATIONLINE, INC. All Rights Reserved
mongodプロセス
WiredTigerキャッシュ
WiredTigerの動き
• tx1でdoc1をdoc1'に更新
– ここでトランザクションtx1でdoc1をdoc1'に更新しようとする
– それとは別に、メモリ上のジャーナルに更新内容を書き込む
18
doc1
doc
3index ディスク
メモリ
doc2
Readスレッド Writeスレッド
doc1index
root
doc
3
doc2 doc1’
root(tx1)
dirtyページ
cleanページ
on diskページ
tx1
tx1
tdoc1→doc1'
ジャーナル
ジャーナル
doc1→doc1'
※説明を簡単にするため、
indexの更新は図から省略
50ms毎にディスクに
Snappyで圧縮されて永続化さ
- 19. Copyright ⓒ2017 CREATIONLINE, INC. All Rights Reserved
mongodプロセス
WiredTigerキャッシュ
WiredTigerの動き
• tx2でdoc1を読む
– tx1が終わる前に、doc1の読み込みトランザクションtx2が動き出すと、
tx2には古いドキュメントが見える
19
doc1
doc
3index ディスク
メモリ
doc2
Readスレッド Writeスレッド
doc1index
root
doc
3
doc2 doc1’
root(tx1)
dirtyページ
cleanページ
on diskページ
tx1
tx2
tx2
tx1
tdoc1→doc1'
doc1→doc1'
ジャーナル
- 20. Copyright ⓒ2017 CREATIONLINE, INC. All Rights Reserved
mongodプロセス
WiredTigerキャッシュ
WiredTigerの動き
• tx3がdoc1を読む
– tx1がcommitした後に、tx3がdoc1を読みに行くと、
新しいdoc1' が見える
20
doc1
doc
3index ディスク
メモリ
doc2
Readスレッド Writeスレッド
doc1index
root
doc
3
doc2 doc1’
root(tx1)
dirtyページ
cleanページ
on diskページ
tx3
tx2
tx1
tx3
t
doc1→doc1'
ジャーナル
- 21. Copyright ⓒ2017 CREATIONLINE, INC. All Rights Reserved
mongodプロセス
WiredTigerキャッシュ
WiredTigerの動き
• チェックポイント開始
– 前回のチェックポイントから60秒経過するか、ジャーナルが2GBを超えると、
チェックポイントになる
– Evictionスレッドがcleanなページとdirtyなページをマージしてディスクへ書き込む
21
doc1'
doc
3index ディスク
メモリ
doc2
Readスレッド Writeスレッド
doc1index
root
doc
3
doc2
Evictionスレッド
doc1’
root(tx1)
dirtyページ
cleanページ
on diskページ
doc1→doc1'
ジャーナル
- 22. Copyright ⓒ2017 CREATIONLINE, INC. All Rights Reserved
mongodプロセス
WiredTigerキャッシュ
WiredTigerの動き
• チェックポイント終了
– チェックポイントが終わると、古いツリーは消されて、
キャッシュとディスクが同期する
– ジャーナルは空になる
22
doc1'
doc
3index ディスク
メモリ
doc2
Readスレッド Writeスレッド
index
doc
3
doc2 doc1’
root(tx1)
dirtyページ
cleanページ
on diskページ
ジャーナル
(空)
- 24. Copyright ⓒ2017 CREATIONLINE, INC. All Rights Reserved
参考にした資料
• ちょっと古い公式説明資料。だいたい同じスライド
– http://www.slideshare.net/mongodb/mongo-db-
wiredtigerwebinar?ref=https%3A%2F%2Fwww.mongodb.co
m%2Fpresentations%2Fwebinar-a-technical-introduction-to-
wiredtiger
– http://www.slideshare.net/NorbertoLeite/mongodb-
wiredtiger-internals
– https://scs.hosted.panopto.com/Panopto/Pages/Viewer.aspx
?id=9a55027f-2b6c-48f4-86f6-73cc167619d0
• 新しい公式セミナ。WiredTigerで使っている様々な工夫を詳細に
説明している。
– https://www.mongodb.com/presentations/mongodb-europe-
2017-building-wiredtiger
• ブログ。WiredTigerのstatの見方や、パフォーマンスチューニング
について解説している
– http://www.developer.com/db/tips-for-mongodb-wiredtiger-
performance-tuning.html
24