iobackup: подробный человеческий гайд

Этот документ — «человеческое» описание iobackup: что система делает, как она работает в реальной жизни, где ее сильные стороны и как безопасно использовать ее в production.

Если README.md — это технический вход и быстрые команды, то этот гайд — про смысл, сценарии и практику эксплуатации.

1) Что такое iobackup простыми словами

iobackup — это локальный агент резервного копирования с API и CLI.

Вы описываете задачу backup в YAML (job), отправляете ее в агент и запускаете вручную. Агент:

  1. читает данные из источника (source);
  2. потоково передает их в хранилище (destination);
  3. считает checksum;
  4. сохраняет manifest;
  5. применяет retention-политику;
  6. отправляет уведомления и пишет историю выполнения.

Главная идея: streaming-first. Данные идут потоком, без лишних временных файлов, где это возможно.

2) Из каких частей состоит система

Важно: iobackup хранит в bbolt состояние и историю, а сами backup-артефакты — в destination (local, S3, SSH и т.д.).

3) Foundation-модели: зачем в iobackup столько ID, manifest и snapshots

В iobackup есть не только “запустить backup и получить файл”. Внутри продукт хранит несколько базовых сущностей — foundation-моделей. Они нужны не ради сложности, а чтобы backup-ы можно было потом проверять, восстанавливать, переносить, шифровать, запускать по расписанию и управлять ими с центрального сервера.

Проще говоря: foundation-модели — это скелет продукта.

Agent identity: какой агент сделал backup

Каждый агент имеет стабильную identity:

Это нужно, чтобы понимать:

agent_id живёт долго, а instance_id меняется после restart агента.

job_id и job_uid: имя для человека и ID для системы

В YAML оператор пишет человекочитаемый job_id:

metadata:
  job_id: mysql-prod

Система внутри создаёт неизменяемый job_uid:

job_uid: job_01J...

Разница важна:

Если job переименовали из mysql-prod в mysql-production, старые backup-ы всё равно относятся к тому же job_uid.

JobRevision: какая версия YAML реально использовалась

Каждое изменение job создаёт новую revision. Run хранит, по какой именно revision он был запущен: YAML может измениться уже после выполнения backup-а, а история должна оставаться точной.

submitted / resolved / executed snapshot

У job есть три состояния:

Run хранит executed_job_snapshot. Поэтому даже если job потом изменили, старый run остаётся воспроизводимым и понятным.

Run и TaskRun

Run — это один запуск job-а. TaskRun — выполнение одной task внутри run.

Если job содержит несколько tasks, возможен статус partial_success: например основной backup успешен, а optional task (с required: false) упала.

request_id и correlation_id

Для диагностики у запуска есть:

Это помогает искать связанные логи, webhooks и ошибки.

Idempotency-Key: защита от двойного запуска

Если клиент не понял, дошёл ли запрос на запуск backup-а, он может повторить запрос с тем же Idempotency-Key. Для того же job_uid система вернёт тот же run_id, а не запустит второй backup. Тот же ключ для другого job_uid вернёт IDEMPOTENCY_KEY_CONFLICT.

Concurrency locks: защита от параллельных запусков

Некоторые backup нельзя запускать одновременно (например два тяжёлых dump одной базы). Для этого есть:

spec:
  concurrency:
    policy: forbid
    lock_key: mysql-prod

Если run уже идёт, второй запуск получит CONCURRENCY_LOCKED.

interrupted: если агент умер во время backup

Если агент перезапустился во время run, старые running / pending run помечаются как interrupted. Это значит: run не завершился корректно, artifacts нужно проверять вручную (или через verify), а stale locks будут очищены startup recovery.

BackupManifest: паспорт backup-а

Manifest — это JSON-паспорт backup-а. Он отвечает на вопросы: какой агент и какой job/revision сделали backup, какой run/task создали artifact, где лежит artifact, какой checksum, какая lineage/repository, и как этот backup проверить.

Manifest пишется рядом с data artifact как sidecar. Если agent.db потерян, sidecar manifest помогает понять, что лежит в хранилище.

backup_id, artifact_id и manifest_id

Repository и lineage: подготовка к incremental backup

Сейчас обычный backup — это single_artifact. Future incremental backup должен работать через repository, snapshots, chunks и indexes. Поэтому manifest уже содержит repository и lineage как подготовку к будущим сценариям.

checksums и checks

checksums[] — фактические хэши, а checks — статусы проверок (artifact verify, decrypt/format verify, restore smoke). Часть проверок пока reserved/placeholder, потому что encryption/restore smoke ещё не реализованы.

Redaction и export policy

Секреты не должны попадать в API, webhook, manifest, metadata export или snapshots. Поэтому sensitive fields маскируются, а полные пути/object keys по умолчанию не раскрываются наружу.

Metadata maintenance

Агент хранит историю в agent.db. Для обслуживания есть:

iobackupctl metadata check
iobackupctl metadata backup
iobackupctl metadata export

Перед upgrade и будущими migrations metadata DB нужно бэкапить отдельно. Также важно сохранять identity/agent.identity, чтобы не потерять continuity agent_id.

Capabilities и facts

Агент может рассказать, что он умеет: какие feature gates включены, какие provider-ы доступны, какие tools найдены на хосте, и какой health/readiness. Для этого есть GET /api/v1/capabilities и GET /api/v1/agent/facts.

Что это даёт

Foundation-модели нужны, чтобы текущий локальный backup-agent мог вырасти в полноценную backup-платформу. Важно: не все эти функции уже реализованы, но foundation-модель нужна заранее, чтобы потом не переписывать job YAML, manifest, metadata DB и API.

Подробнее:

4) Что уже умеет текущая версия

Рабочие provider-ы:

Сводная «зрелость» возможностей: status-matrix.md. Модель сущностей в БД: data-model.md.

5) Как проходит один backup-run

Упрощенный жизненный цикл:

  1. Job submit — YAML проходит валидацию и сохраняется; агент определяет job_uid и создаёт/обновляет JobRevision.
  2. Job run — создается run со статусом running, сохраняются request_id/correlation_id и executed_job_snapshot.
  3. для каждой task:
    • source создает поток данных;
    • destination принимает поток;
    • checksum считается на лету;
    • создается manifest (и sidecar рядом с data artifact);
    • запускается retention;
  4. run получает финальный статус (success, partial_success, failed);
  5. отправляются webhook-события;
  6. (опционально) запускается auto verify-after-run.

Дополнительно:

Статусы и история можно смотреть через API/CLI в любой момент.

6) Почему streaming-first — это важно

Потоковый режим дает практические плюсы:

Когда нужны внешние утилиты (pg_dump, mysqldump, aws CLI), их можно запускать либо локально, либо в Docker fallback.

7) Local tools vs Docker fallback

У iobackup есть два режима для tool-based частей:

Это особенно полезно когда:

При этом можно использовать свои образы, а не только дефолтные.

8) Verify: как убедиться, что backup реально читается

run.status=success говорит, что запись прошла успешно, но не гарантирует долгосрочную читаемость.

Для этого есть verify:

Есть два режима:

Также можно включить авто-политику:

spec:
  policies:
    verify:
      after_run: true
      limit_per_task: 1

Тогда после успешного run запускается verify-run автоматически.

9) Retention и hard-delete

Retention в проекте — это не только «убрать запись из metadata», но и удаление физических объектов destination (hard-delete) с audit-событиями.

Практически это значит:

10) Безопасность: что включать в production

Минимальный production baseline:

Подробнее и с готовыми профилями: docs/features/encryption/security.md.

11) Наблюдаемость и мониторинг

У агента есть:

Что особенно полезно в эксплуатации:

Для авто-verify есть отдельная метрика:

Подробнее: docs/features/observability/prometheus.md.

12) Типичные сценарии использования

13) Что важно помнить

14) Куда идти дальше по документации