Какую архитектуру хранения данных использует Prometheus?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Архитектура хранения данных в Prometheus
Prometheus использует уникальный подход к хранению метрик временных рядов, который отличается от традиционных баз данных. Это специализированная система, оптимизированная для работы с метриками мониторинга.
Общие принципы хранения
1. Время-ориентированное хранилище (Time Series Database)
Prometheus хранит данные в виде временных рядов — последовательности значений метрик с временными метками. Каждая метрика идентифицируется по:
- Имени метрики (например,
http_requests_total) - Лейблам (метаданным, например,
{method="GET", status="200"}) - Значение (число)
- Timestamp (время в миллисекундах)
http_requests_total{method="GET", status="200"} 100 1645234560000
http_requests_total{method="POST", status="201"} 50 1645234560000
Двухуровневая архитектура хранения
2. Уровень 1: In-Memory WAL (Write-Ahead Log)
Все поступающие метрики сначала записываются в памяти в формате WAL для надёжности. Затем периодически (по умолчанию каждые 2 часа) Prometheus создаёт блоки данных на диске.
Уровень 2: TSDB на диске (Block-based storage)
Структура директорий Prometheus:
data/
├── wal/ # Write-Ahead Log (текущие данные)
│ ├── 00000000
│ ├── 00000001
│ └── ...
└── blocks/ # Сжатые блоки (временные диапазоны)
├── 01ARZ3NDEKTSV4RRFFQ69G69T9/
│ ├── meta.json # Метаинформация блока
│ ├── index # Индекс для быстрого поиска
│ ├── chunks # Сжатые данные временного ряда
│ └── tombstones # Удалённые метрики
└── 01ARZ3NDEKTSV4RRFFQ69G69T8/
Структура блока данных (Block Format)
3. Компоненты одного блока
# meta.json - метаинформация
{
"version": 1,
"ulid": "01ARZ3NDEKTSV4RRFFQ69G69T9",
"minTime": 1645234560000, # Начало периода
"maxTime": 1645321960000, # Конец периода
"stats": {
"numSamples": 1000000,
"numSeries": 5000,
"numChunks": 512
},
"compaction": 1
}
Каждый блок содержит:
- Index: Индекс по метрикам и лейблам для быстрого поиска
- Chunks: Сжатые значения (примерно 32KB каждый)
- Postings: Инверсный индекс для фильтрации
- Tombstones: Маркеры удалённых метрик
Сжатие данных (Compression)
4. Алгоритмы оптимизации хранилища
Prometheus использует два основных подхода:
- Delta-of-delta encoding: Для временных меток. Вместо абсолютных временных меток хранит разницы между ними
- XOR encoding: Для чисел с плавающей точкой. Сжимает последовательности похожих значений, сохраняя только различия
- Label Index: Кеширование часто используемых комбинаций лейблов
Эти методы снижают размер хранилища на 95% и более.
Retention Policy (Политика хранения)
5. Автоматическое управление дисковым пространством
Prometheus автоматически удаляет старые блоки данных на основе:
- Retention time (по умолчанию 15 дней):
--storage.tsdb.retention.time=15d - Retention size (максимальный размер):
--storage.tsdb.retention.size=50GB
Блоки удаляются, когда они становятся старше периода хранения или когда общий размер превышает лимит.
Сравнение с другими TSDB
6. Уникальные особенности Prometheus
| Аспект | Prometheus | InfluxDB | TimescaleDB |
|---|---|---|---|
| Хранилище | Локальное TSDB | Собственный формат | PostgreSQL |
| Масштабируемость | Одна машина | Кластер | Горизонтальная |
| Сжатие | Delta + XOR | Высокое | Среднее |
| Индексирование | Label Index | Tag Index | B-Tree |
| Запросы | PromQL | SQL-подобный | SQL |
Практический пример: работа с Prometheus
import requests
def query_prometheus(query: str, start_time: int, end_time: int):
"""Пример запроса к Prometheus"""
url = "http://localhost:9090/api/v1/query_range"
params = {
"query": query,
"start": start_time,
"end": end_time,
"step": "1m"
}
response = requests.get(url, params=params)
data = response.json()
for result in data["data"]["result"]:
metric_name = result["metric"]["__name__"]
labels = result["metric"]
values = result["values"]
print(f"Метрика: {metric_name}")
print(f"Лейблы: {labels}")
print(f"Значения: {values}")
Ключевые выводы
- WAL + Blocks: Двухуровневая архитектура обеспечивает надёжность и высокую производительность
- Локальное хранилище: Prometheus хранит данные локально, не требует внешних баз данных
- Сжатие: Delta-of-delta и XOR энкодинг снижают размер на 95% и более
- Label Index: Быстрый поиск по лейблам и эффективная фильтрация
- Retention: Автоматическое удаление старых данных
- Ограничения: Не предназначена для долгосрочного хранения всех метрик
Для архивирования и масштабирования на несколько машин используются решения типа Thanos или Cortex, которые расширяют возможности Prometheus и позволяют хранить метрики длительное время.