Утилита bucketfill


Назначение утилиты

Утилита предназначена для копирования prometheus-совместимых блоков с метриками из одного S3-хранилища в другое. Необходимость такой процедуры может возникнуть при частичной или полной потере данных в хранилище метрик одного из ЦОДов при отказоустойчивой конфигурации, либо после длительной недоступности ЦОДа, когда устаревшие метрики уже не могут быть доставлены.

Принцип работы и требования

Копирование метрик выполняется путем последовательного скачивания блоков из S3-хранилища источника и загрузки их в S3-хранилище ЦОДа избыточность которого требуется восстановить. Конфигурация программы или использование аргументов командной строки позволяют задать временной интервал для которого будут скопированы блоки с метриками.

Утилита может запускаться с любой машины, при условии что она имеет сетевую связность с обоими ЦОД-ами и достаточную полосу пропускания. В процессе копирования, программа параллельно буферизирует не более одного блока каждого тенанта на диск, поэтому, для бесперебойной работы программы, необходимо обеспечить достаточное количество свободного места на диске в каталоге /tmp, в особенности, когда суточный объем данных достаточно большой. Рекомендуем иметь не менее 50 GB свободного места.

Описание конфигурационного файла

Конфигурационный YAML-файл имеет следующий вид:

# Исходное и целевое хранилища (обязательно)
bucketStores:
  # Исходное хранилище (обязательно)
  src:
    bucket:          "blocks"                 # Имя корзины (обязательно)
    endpoint:        "s3-storage:9000"        # Точка подключения S3 (обязательно)
    accessKeyID:     "aws_access_key_id"      # ID ключа доступа S3 (обязательно)
    secretAccessKey: "aws_secret_access_key"  # Секретный ключ доступа S3 (обязательно)
    disableSSL:      false                    # Отключение проверки SSL (обязательно)
  # Целевое хранилище (обязательно)
  dest:
    bucket:          "blocks"                 # Имя корзины (обязательно)
    endpoint:        "s3-storage-backup:9000" # Точка подключения S3 (обязательно)
    accessKeyID:     "aws_access_key_id"      # ID ключа доступа S3 (обязательно)
    secretAccessKey: "aws_secret_access_key"  # Секретный ключ доступа S3 (обязательно)
    disableSSL:      false                    # Отключение проверки SSL (обязательно)
  # Локальное хранилище файлов (опционально, по умолчанию: /tmp/bucketfill)
  tmpDir: /tmp/bucketfill
# Временные границы обрабатываемых блоков (обязательно)
targetWindow:
  from: 1699370055 # Начальное время в формате UNIX-time (можно указать в формате: '-from=-1h' в командной строке)
  to:   1699373655 # Конечное время в формате UNIX-time (можно указать в формате: '-to=now' в командной строке)
# Уровень логирования (опционально, по умолчанию: info)
logLevel: debug

Значения параметров заполняются следующим образом:

  • В качестве endpoint в конфигурации указывается домен S3 каждого из ЦОД-ов (s3.<clusterBaseDomain>), например: s3.dc1.domain и s3.dc2.domain

  • Имя бакета источника и назначения можно получить выполнив следующую команду в кластере-источнике и кластере-назначения:

    kubectl -n op-metrics get cm op-metrics-s3 -o json | jq -r '.data["BUCKET_NAME"]'
    
  • accessKeyID и secretAccessKey для бакетов можно получить, выполнив команду в кластере-источнике и кластере-назначения:

    kubectl -n op-metrics get secret op-metrics-s3 -o json | jq -r '.data | map_values(@base64d)'
    
  • В targetWindow.from и targetWindow.to указываются даты (в формате UNIX-timestamp) начала и окончания временного диапазона, который нужно скопировать. Эти значения можно переопределить из командной строки.

Запуск команды

Скачать утилиту можно непосредственно api-домена любого кластера (доступно в модуле op-storage версии 1.0.14 и выше), например:

curl https://api.dc1.domain/download/bucketfill -o bucketfill && chmod +x bucketfill

После подготовки конфигурационного файла (см. выше) запустить команду:

./bucketfill -config=config.yml

временной диапазон можно переопределить с помощью аргументов:

./bucketfill -config=config.yml -from=-1d -to=now

При задании интервалов можно использовать следующие суффиксы:

  • Секунды: s, sec, secs, second, seconds
  • Минуты: m, min, mins, minute, minutes
  • Часы: h, hour, hours
  • Дни: d, day, days
  • Недели: w, week, weeks
  • Месяцы: mon, month, months
  • Года: y, year, years