# Writing a TSDB from scratch in Go Google Slidesによる、[[Go言語 1.16-1.24までの主要なアップデート|Go]]言語を用いた時系列データベース([[TSDB - MOC|TSDB]])のスクラッチ実装に関する技術スライド。 主に時系列ワークロードの特性(大量の書き込み、直近データの頻繁な読み出し)に合わせたパフォーマンス最適化手法に焦点を当てている。 ## 主な技術的トピック ### 最適化戦略 書き込み重視のワークロードに対応するため、以下の最適化が行われている。 * **String Interning**: ラベルなどのメタデータにおけるメモリ使用量とGC(ガベージコレクション)の負荷を軽減するために文字列のインターン化を採用。 * **Function Results Caching**: 一般的な操作(文字列変換など)の結果をキャッシュし、CPUオーバーヘッドを削減。 * **Concurrency Limiting**: CPUバウンドなタスクの並行数を制限することで、システムを安定させ、ピーク時のメモリ使用量を管理し、コンテキストスイッチを減らして処理効率を向上。 * **sync.Poolの活用**: オブジェクトの再利用に `sync.Pool` を利用し、GC圧力を低減。「Leveled」または「Bucketized」プールを用いて、異なるサイズのオブジェクトを効率的に管理している。 ### アーキテクチャ * **データ構造**: [[Revisiting B+-tree vs. LSM-tree|LSM-tree]] (Log Structured Merge tree) を採用。 * **ストレージ**: カラムごとの分離ストレージと追記型(Append-only)書き込みを採用。 * **データ局所性**: メトリックごとにデータポイントをグループ化することで、データ局所性を向上させている。 ### 課題 * **書き込み vs クエリのトレードオフ**: 効率的な書き込みと効率的なクエリの間のバランスを取ることが設計上の大きな課題。 * **GoのGC**: テラバイト級のデータを扱う際、Goのメモリ使用量とGCによるパフォーマンスの制約に直面することがある。