# Monarch
## 概要
**Monarch** は [[Google]] が 2010 年から運用するプラネットスケール・マルチテナント・インメモリ時系列データベース(TSDB)である。前身の [[Borgmon]] の課題(分散管理負担・スキーマなし・distribution 値型非サポート・手動シャーディング)を解決する次世代監視システムとして設計された。YouTube・Gmail・Google Maps・Spanner・Borg など Google の全インフラ監視の基盤インフラとなっている。
Source: [[@2020__VLDB__Monarch - Google's Planet-Scale In-Memory Time Series Database]](PVLDB 13(12):3181–3194, 2020)
## 規模(2019年7月)
- **時系列数**: 約 950 億
- **インメモリ使用量**: 約 750 TB(高度に最適化された構造)
- **取り込み速度**: 約 2.2 TB/s
- **クエリ速度**: 毎秒約 600 万クエリ
- **ゾーン数**: 38(5 大陸)
- **総タスク数**: 約 40 万(Leaf が 144,000 で最多)
## 設計の核心原則
1. **可用性優先(CAP: AP)**: アラートの遅延検知を防ぐため、一貫性より可用性を選ぶ。遅延書き込みは棄却、クエリは部分データを返す可能性がある
2. **インメモリ保持**: Bigtable・Spanner 等の storage system への alerting path 依存を断つことで、他のすべての Google ストレージが Monarch に依存する「循環依存」を回避
3. **リージョン化アーキテクチャ**: データを生成元の近くに保持(低レイテンシ・低コスト・zone 単独動作を保証)。Global query / config plane で統合
## データモデル
リレーショナル時系列モデル。**Target schema**(監視エンティティを特定するキー列群)と**Metric schema**(計測側面とその値型)を組み合わせたテーブル形式。値型: boolean / int64 / double / string / **distribution** / tuple。
- **distribution 型**: ヒストグラム(バケット境界は設定可能) + 統計値(平均・カウント・標準偏差) + **Exemplar**(バケットごとに Dapper トレース等を埋め込める)。99 パーセンタイルレイテンシなど統計解析に不可欠
- **Gauge vs Cumulative**: Cumulative は欠落点があっても意味を保てるため、定期再起動が多い分散システムに適する
## 主要技術
| 技術 | 効果 |
|---|---|
| Lexicographic Sharding(target 文字列で辞書順分散) | ゾーン内で 10,000+ leaf への水平スケール。intra-target join を leaf 完結 |
| Collection Aggregation(delta + バケット + admission window) | 平均 36 raw 系列 → 1 系列。CPU 代替比 25% |
| Field Hints Index(FHI: トライグラムベース・インメモリ) | ゾーン: 99.2〜99.6%、root: 75.8% のファンアウト抑制。huge-zone でも 808 MB |
| Query Pushdown(zone/leaf レベル完結) | 95% の standing query がゾーン完結。partition 耐性確保、cross-zone 書き込み回避 |
| Hedged reads / Zone pruning | leaf 障害・zone 不応答を透過的に処理 |
## Borgmon との比較
[[Borgmon]](前身)に対する Monarch の改善点 4 点(論文 §1):
1. マルチテナントサービス化により各チームの運用負担を排除
2. スキーマ化により曖昧なクエリセマンティクスを排除し表現力向上
3. distribution 値型のファーストクラスサポートにより統計的解析が可能
4. 自動シャーディングにより手動設定を不要化
## Gorilla との比較
[[Gorilla]](Facebook の同類インメモリ TSDB、[[@2015__VLDB__Gorilla - A Fast, Scalable, In-Memory Time Series Database]])は文字列キーのみ・クエリ言語なし・リージョン間レプリケーション(可用性目的)。Monarch はリレーショナルデータモデル・豊富なクエリ言語・planet-scale クエリエンジン(FHI + プッシュダウン)・collection aggregation・グローバル構成管理を加える。
## RPC 特性研究での位置づけ
[[@2023__SOSP__A Cloud-Scale Characterization of Remote Procedure Calls]] では Monarch から 700 日分(2020 年 12 月〜2022 年 11 月)のデータを抽出し、10,000+ RPC メソッドのスループット成長率・CPU 消費・レイテンシ分布の長期変化を分析している。Monarch は 30 分ごとのサンプリング(一部は 1 分間隔)でクラスタ・ネットワークトラフィッククラス等の集計軸を保持。一部メトリクスは最大 700 日保持。
## 出典
- [[@2020__VLDB__Monarch - Google's Planet-Scale In-Memory Time Series Database]](設計・実装・運用経験の一次ソース)
- [[@2023__SOSP__A Cloud-Scale Characterization of Remote Procedure Calls]](Monarch を RPC 特性研究の計測基盤として言及)