時系列DBについて学ぼう
投稿日 February 7, 2026 • 2分で読めます • 253文字 • 言語を選択: Korean、English
Table of contents
大規模アーキテクチャを設計したり、分散システムを構築しようとする際にTime Series Database(TSDB) の導入を検討することができる。今日はTSDBがどのようなツールであるか、どのような特徴を持っているか、そしてどのような問題を解決するのに役立つかを見ていこう。
1. 時系列データとは?
TSDBは時系列データを保存し処理するデータベースである。では、時系列データとは何か?時系列データは単にタイムスタンプが付いているデータではない。より正確には_「時間に沿って追跡、モニタリング、ダウンサンプリング、集計される測定値またはイベント」_と定義でき、ここでいう測定値またはイベントには以下のようなものが含まれる。
- サーバーメトリクス
- アプリケーションパフォーマンスモニタリング
- ネットワークデータ
- IoTセンサーデータ
- クリックイベント
- マーケット取引データ
このようなデータを扱う時系列データは、一般的なDBとは異なり、以下のような差別化ポイントを持つ。
- Write heavy: 書き込み95%、読み取り5%
- Immutable: 一度記録されると変更されることがほとんどないため、append-only方式でデータを追加
- Ordered by time: 時間順に並べられており、時間によってインデックス化されていると見なすことができる
- High cardinality: 一般的にカーディナリティが高い
- Time-based range queries: 時間範囲で大量のレコードを照会
- Continuous data stream: 継続的にデータポイントを収集する形態
これらの特性に対応するためにTSDBがどのような戦略を取るかを見ていこう。
2. 書き込み最適化
一般的なDBの場合、データを書き込むには書き込む位置を見つけて修正または挿入する作業を行う必要がある。以下のような形で作業が進行するだろう。
[Seek to block 4752] → [Read] → [Modify] → [Write] → [Seek to block 9201] → ...
一方、TSDBは既存のデータを修正する必要がなく、時間順にデータを積載すればよいので、Append-only方式でデータを追加するだけでよい。以下のように作業がはるかに単純化される。
[Write to end] → [Write to end] → [Write to end] → ...
LSM(Log-Structured Merge)ツリー
LSMツリーはInfluxDB、Cassandra、LevelDBなど高性能の書き込みスループットを誇るデータベースシステムの秘伝のソースだ。LSMツリーの核心アイデアは次の通りである。
- コストがかかるランダム書き込み → コストが低い順次書き込み
- バックグラウンドで定期的にデータを再構成することで読み取り効率を向上
そしてLSMツリーの動作方式は以下の通りである。
- 最新データはMemtableメモリバッファに保存
データはキー順に整列を維持する。この時、書き込み作業はRAMにアクセスするため速度が非常に速い。
- SSTable(Sorted String Table)ディスクにフラッシュ
Memtableがいっぱいになると、変更不可能で整列されたSSTableファイルとして保存される。Memtableはすでに整列されているため、このフラッシュ作業は順次的に簡単かつ迅速に完了できる。またフラッシュ作業後はMemtableを空にして初期化する。
- バックグラウンド圧縮
バックグラウンドでは小さなSSTableをより大きなSSTableにマージする作業を行う。また重複エントリとトゥームストーン(削除対象マーク)を除去することもある。
このようなLSMツリーの動作方式により、書き込み作業は読み取り作業を妨げない。 Memtableは常に最新データを処理し、バックグラウンドで既存のデータを整理することで、継続的に高い書き込みスループットを維持できる。
しかしクエリのために複数のSSTableを確認しなければならない場合には読み取り性能低下が生じる可能性がある。また書き込み増幅が発生した場合、圧縮過程でデータが複数回再書き込みされる可能性がある。
したがってLSMツリーは書き込み作業量が多く、読み取り性能はある程度犠牲にできる場合に活用するのが良い。
3. 時間ベースのインデックシングとパーティショニング
時系列データはすでにタイムスタンプベースで整列されて挿入されるため、書き込み作業にインデックシングが必要ない。そして時間範囲に応じてパーティショニングすれば、書き込み作業時にどのパーティションにデータを保存するか悩む必要がなくなる。データ保存作業も古いパーティションを削除する方式で簡単に進行できる。
ブロックレベルメタデータ
TSDBではデータブロックもタイムスタンプベースで整列されている。したがって時間範囲に該当しないブロックはチェックなしでスキップでき、これによりクエリ性能が向上する。各ブロックには時間に対する最小/最大タイムスタンプ、必要に応じて最小/最大値を記録しておく。このようなメタデータは時間ベースのパーティショニングと共に、データ量が増えてもクエリ性能を維持できるようにするフィルタレイヤーとして作用する。
4. ダウンサンプリングと圧縮
時系列データは特性上、重要でない内容を削ぎ落として圧縮して表現するのに適している。いや、実際には毎秒数百万のデータポイントが継続的に流入するというTSDBの特性上、ダウンサンプリング作業は必須とも言える。TSDBでは高い精度を持つ最新データは集計およびダウンサンプリングされて長期データに変換される。一般的なダウンサンプリングおよびリテンション戦略は次の通りである。
- 元データ:直近1日保管
- 1分平均値:直近7日保管
- 5分平均値:直近30日保管
- 1時間平均値:直近1年保管
- 日次サマリー:永久保管
このようなルールはユーザーが直接定義でき、これを活用してストレージ効率性および読み取り性能を飛躍的に向上させることができる。
5. 圧縮アルゴリズム
前述の通り、TSDBの核心は多数の書き込み演算をメモリバッファで処理することと、バックグラウンドで圧縮する作業と言える。ではどのように圧縮するのか?その部分についての概念を見ていこう。
デルタエンコーディング
Raw values: [45.2] [45.3] [45.1] [45.4]
Delta encoded: [45.2] [+0.1] [-0.2] [+0.3]
デルタエンコーディングは元の値からどれだけ変わったか変化量だけを記録するように変える作業である。変化値は元の値より小さい数字なので、値を保存するのに必要なbit数もはるかに少なくなる。
デルタオブデルタエンコーディング
Raw timestamps: 1000, 1010, 1020, 1030, 1040
Deltas: 10 , 10 , 10 , 10 , 10 , ...
Delta-of-deltas: 10 , 0 , 0 , 0 , 0 , ...
デルタオブデルタエンコーディングはさらに進んで変化量に対する変化量を記録する方式である。これはタイムスタンプ間隔が完全に規則的な場合に使用できる方法であり、bit数をさらに減らすことができる。
XOR圧縮
Value 1: 0 10000010 01101000101000111101011
Value 2: 0 10000010 01101000110000100000000
XOR: 0 00000000 00000000011000011101011
^^^^^^^^^^ lots of leading zeros
XOR圧縮は連続したfloatベースの値がしばしば類似した値を持つという点を活用する圧縮アルゴリズムである。上記のように同一のbit部分をすべて0に置換して全体のbit数を大幅に減らすことができる方式である。Metaが開発したゴリラ圧縮技法もこれに該当する。
Run-lengthエンコーディング
Run-lengthエンコーディングはモニタリング指標のように測定値が繰り返し現れる場合に、該当値をカウントと共に一つだけ保存する方式である。ログイン回数、リクエスト数などを記録する際に有用である。
6. TSDB選択ガイド
最後にどのような状況でどのTSDBを活用するのが良いかまとめてみよう。
InfluxDB
- クエリ言語:InfluxQL、Flux
- 長所:イベント収集最適化
- 短所:分散システム拡張が複雑
- デプロイ方法:セルフホスティング / マネージドクラウド
- ユースケース:ワークロードがメトリクス中心のリアルタイムデータ収集の場合、データ保存期間が短い場合
Prometheus
- クエリ言語:PromQL
- 長所:Kubernetes環境最適化、Pullモデルのためエージェントインストール不要
- 短所:長期保存のための設計不足
- デプロイ方法:Kubernetesではデフォルトでインストールされている
- ユースケース:Kubernetes中心のアーキテクチャ、アラートシステムが必要な場合
TimescaleDB
- クエリ言語:SQL(特にPostgreSQLに最適化)
- 長所:リレーショナルワークロードに最適化、PostgreSQLエコシステム
- 短所:PostgreSQL関連の依存関係インストール必要
- デプロイ方法:セルフホスティング / Tiger Dataクラウド
- ユースケース:ビジネスインテリジェンス(BI)、IoT、金融システムなどリレーショナル分析が必要な場合
Kdb
- クエリ言語:q言語
- 長所:価格帯がある分、サポートチームのサポートを受けられる
- 短所:ラーニングカーブがあり、ドキュメントも不十分、商用ライセンスが高価
- デプロイ方法:クラウド環境最適化されていない、VMにインストールする必要がある
- ユースケース:極限のパフォーマンスが必要な場合
Graphite
- クエリ言語:プレーンテキスト、Pickle、AMQP活用
- 長所:どのハードウェアで実行しても優れたパフォーマンスを発揮
- 短所:ドキュメントが不十分、コミュニティも活発でない
- デプロイ方法:コンテナイメージ活用
- ユースケース:シンプルで軽量なオープンソースTSDBが必要な場合
References
- アレックス・シュー - 仮想面接事例で学ぶ大規模システム設計の基礎 2
- influxdata - Time series database explained
- System Design Academy - Why a Time Series Database?
- hello interview - Time Series Databases
- Last 9 - Comparing Popular Time Series Databases
- OctaByte - InfluxDB vs TimescaleDB