Backups: update ADR after migration
Linting / YAML Lint (push) Waiting to run
Linting / Ansible Lint (push) Waiting to run

This commit is contained in:
2026-06-23 09:38:09 +03:00
parent 0f80e66b66
commit 2930842e3f
@@ -33,9 +33,11 @@ restic не годится — это churn, эквивалентный репа
вручную или заводить такое управление. вручную или заводить такое управление.
Идентификатор класса подтверждён доками — `INTELLIGENT_TIERING` (Yandex Идентификатор класса подтверждён доками — `INTELLIGENT_TIERING` (Yandex
поддерживает STANDARD, COLD, ICE, INTELLIGENT_TIERING). Остаётся поддерживает STANDARD, COLD, ICE, INTELLIGENT_TIERING). Явный min-retention
неподтверждённым только min-retention / штраф за раннее удаление архивного (12 месяцев со штрафом за раннее удаление) документирован **только для
уровня внутри IT. класса ICE**; для архивного уровня внутри IT такого минимума в доках нет —
значит transition и последующий `prune` для IT низкорисковы. Финальная
проверка — по биллингу после первой реальной миграции.
## Рассмотренные варианты ## Рассмотренные варианты
@@ -55,12 +57,15 @@ restic не годится — это churn, эквивалентный репа
пакет ставится из apt (`python3-croniter`) тем же механизмом, что и пакет ставится из apt (`python3-croniter`) тем же механизмом, что и
остальное, а гибкость реальная — поменять «раз в квартал» на «раз в остальное, а гибкость реальная — поменять «раз в квартал» на «раз в
месяц» = правка одной строки конфига. месяц» = правка одной строки конфига.
- **Storage class сейчас: Вариант A** (`-o s3.storage-class=INTELLIGENT_TIERING` - **Перевод существующих данных в IT: copy-in-place vs lifecycle vs
в restic) **vs Вариант B** (lifecycle-правило / copy-in-place на бакете) отложить.** Lifecycle в Yandex переводит только «на более холодный»
**vs отложить.** A влияет только на новые объекты — уже лежащие бэкапы в (STANDARD→COLD→ICE), переход именно в IT им не заявлен — отпал.
STANDARD так и останутся; B переводит существующие данные, но требует Перезаливка объектов для restic не годится (churn ≈ репак). Остаётся
завести управление бакетом, которого в проекте нет. **Выбрано отложить** **copy-in-place** (`aws s3 cp --recursive --storage-class
до подтверждения min-retention архивного уровня IT. INTELLIGENT_TIERING`, серверная копия «на себя»). **Выбран copy-in-place**
— после того как доки сняли блокер по min-retention. Для будущих записей
отдельно — флип класса бакета по умолчанию на IT (вариант A с
`-o s3.storage-class` в коде не понадобился).
## Решение ## Решение
@@ -80,12 +85,21 @@ restic не годится — это churn, эквивалентный репа
`prune` тюнингован под IT (`--max-unused 20%`, `--max-repack-size 5G`): `prune` тюнингован под IT (`--max-unused 20%`, `--max-repack-size 5G`):
чем меньше холодных паков переписываем, тем дольше держится охлаждение. чем меньше холодных паков переписываем, тем дольше держится охлаждение.
Storage class IT и lifecycle на бакете **намеренно отложены**: пока не Перевод бакетов в IT идёт двумя действиями на каждый бакет: смена класса
подтверждён min-retention архивного уровня IT, transition существующих **по умолчанию** на IT в консоли (будущие записи restic) + разовая
данных рискован (возможен штраф за раннее удаление при последующем prune). **copy-in-place** существующих объектов (`aws s3 cp s3://<bucket>/
Сама миграция уже лежащих бэкапов делается lifecycle-правилом или s3://<bucket>/ --recursive --storage-class INTELLIGENT_TIERING
copy-in-place с `--storage-class INTELLIGENT_TIERING`, а не сменой --metadata-directive COPY`). Класс отдаётся прямо в листинге
дефолтного класса бакета (та сработает только для новых объектов). (`list-objects-v2 --query 'Contents[].[StorageClass,Key]'`) — им и
проверяем. Грабли: для проверки нельзя `--max-items 1` (клиентская
пагинация aws-cli дописывает в вывод токен `None`) — нужен серверный
`--max-keys`.
Статус миграции: **`rivendell` переведён 2026-06-23** (дефолт бакета = IT
со скриншота, все объекты `config`/`data/` показывают
`INTELLIGENT_TIERING`). `eos` (основная экономия) и `buckland` — следующими,
после нескольких дней наблюдения за биллингом `rivendell`.
Retention оставлен прежним (`--keep-daily 90 --keep-monthly 36`) — это Retention оставлен прежним (`--keep-daily 90 --keep-monthly 36`) — это
решение про охлаждение и частоту операций, а не про глубину истории. решение про охлаждение и частоту операций, а не про глубину истории.
@@ -102,6 +116,10 @@ Retention оставлен прежним (`--keep-daily 90 --keep-monthly 36`)
- `-` Подвох croniter: при суточном триггере поля минут/часов в - `-` Подвох croniter: при суточном триггере поля минут/часов в
выражениях декоративны (держим `* *`) — фаза идёт в момент ночного выражениях декоративны (держим `* *`) — фаза идёт в момент ночного
прогона, а не во время из выражения. прогона, а не во время из выражения.
- Осталось сделать: подтвердить min-retention / штраф за раннее удаление - `+` Миграция существующих объектов — разовая copy-in-place, без репака
архивного уровня IT, затем перевести существующие бэкапы со STANDARD на restic: содержимое и ключи паков не меняются, restic остаётся рабочим.
`INTELLIGENT_TIERING` через lifecycle-правило или copy-in-place. - `-` После перевода объекты стартуют на уровне FREQUENT и охлаждаются
~120 дней — полка экономии устанавливается не сразу.
- Осталось сделать: несколько дней последить за биллингом и бэкапами
`rivendell` (убедиться, что за transition нет штрафа), затем повторить
пару «флип дефолта + copy-in-place» для `eos` и `buckland`.