LabHub

ブログ

etcdストレージエンジン: BoltDBとMVCC

한국어English日本語

etcdストレージエンジン: BoltDBとMVCC

etcdのデータ保存とバージョン管理を担当するストレージエンジンの内部構造を見ていきます。BoltDB(bbolt)のB+ツリーベースストレージメカニズムとMVCCの多バージョン管理を詳細に分析します。


1. BoltDB(bbolt)内部構造

1.1 B+ツリー概要

BoltDBはB+ツリーをコアデータ構造として使用します:

1.2 ページタイプ

BoltDBは4種類のページタイプを使用します:

1.3 トランザクションモデル

BoltDBはACIDトランザクションをサポートします:

// BoltDBトランザクション使用例
db.Update(func(tx *bolt.Tx) error {
    b := tx.Bucket([]byte("myBucket"))
    return b.Put([]byte("key"), []byte("value"))
})

1.4 Copy-on-Writeメカニズム

BoltDBの書き込みは既存ページを修正せず新しいページにコピーします:

  1. 書き込みトランザクション開始
  2. 修正が必要なページを新しい位置にコピー
  3. コピーされたページで修正を実行
  4. メタページを更新して新しいルートを指す
  5. トランザクションコミット時に新しいメタページをディスクにfsync

2. MVCC詳細分析

2.1 Revision概念

etcdのMVCCで最も重要な概念はRevisionです:

Revision = (main, sub)
main: トランザクション番号(グローバル増加)
sub: トランザクション内操作番号(0から開始)

:
Put("a", "1")  -> revision (2, 0)
Txn:
  Put("b", "2")  -> revision (3, 0)
  Put("c", "3")  -> revision (3, 1)

2.2 Key Index

Key Indexはキー名からそのキーのすべてのrevision情報へのマッピングです:

// keyIndex構造(簡略化)
type keyIndex struct {
    key         []byte
    modified    revision
    generations []generation
}

type generation struct {
    ver     int64
    created revision
    revs    []revision
}

キーのライフサイクル:

  1. キー作成(Put)-> 新generation開始
  2. キー修正(Put)-> 現在のgenerationにrevision追加
  3. キー削除(Delete)-> 現在のgenerationにtombstone追加、generation終了
  4. キー再作成(Put)-> 新generation開始

2.3 BoltDB内のデータ保存

etcdはBoltDBのkeyバケットに以下のように格納します:

BoltDB key bucket:
  key=(2,0) -> KeyValue{key="a", value="1", create_revision=2, mod_revision=2, version=1}
  key=(3,0) -> KeyValue{key="a", value="2", create_revision=2, mod_revision=3, version=2}

3. コンパクション

3.1 コンパクションの必要性

MVCCはすべてのバージョンを維持するためデータが増え続けます。コンパクションは指定されたrevision以前の古いバージョンを削除してスペースを回収します。

3.2 自動コンパクションモード

Periodicモード: 指定された時間間隔でコンパクション実行 Revisionモード: 指定されたrevision数分のヒストリーを維持

3.3 コンパクション過程

  1. コンパクションrevision決定
  2. Key Indexから不要なrevision削除
  3. 削除されたキーのgeneration整理
  4. BoltDBから該当revision以前のエントリ削除
  5. scheduled compact revision更新

4. デフラグメンテーション

4.1 コンパクション後のスペース問題

BoltDBのCopy-on-Write特性のため、コンパクションでデータを削除してもディスクスペースは即座に返却されません。

4.2 デフラグメンテーション過程

  1. 新しい一時BoltDBファイル作成
  2. 既存データベースのすべての有効なデータを新ファイルにコピー
  3. 既存ファイルを新ファイルで置換
  4. ファイルサイズが縮小

4.3 注意事項


5. バックエンドバッチ最適化

5.1 書き込みバッチ

etcdはパフォーマンスのため複数の書き込み操作を1つのBoltDBトランザクションにバッチします:

5.2 パフォーマンスチューニングパラメータ


6. ストレージモニタリング

6.1 主要メトリクス

6.2 スペース不足対応

etcdバックエンドがquotaに到達すると:

  1. NOSPACEアラームが発生
  2. 書き込みリクエストが拒否
  3. コンパクションとデフラグメンテーションを実行
  4. etcdctl alarm disarmでアラーム解除
  5. quota増加を検討

7. まとめ

etcdのストレージエンジンはBoltDBの安定的なB+ツリーストレージとMVCCの多バージョン管理を組み合わせて一貫性とパフォーマンスの両方を達成します。コンパクションとデフラグメンテーションによる適切なスペース管理が運用で重要です。

コメント

まだコメントはありません。

ログインするとコメントできます