← Назад к вопросам

Какую архитектуру хранения данных использует Prometheus?

2.3 Middle🔥 141 комментариев
#DevOps и инфраструктура

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Архитектура хранения данных в 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

АспектPrometheusInfluxDBTimescaleDB
ХранилищеЛокальное TSDBСобственный форматPostgreSQL
МасштабируемостьОдна машинаКластерГоризонтальная
СжатиеDelta + XORВысокоеСреднее
ИндексированиеLabel IndexTag IndexB-Tree
ЗапросыPromQLSQL-подобный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 и позволяют хранить метрики длительное время.