Backups: update ADR after migration
This commit is contained in:
@@ -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`.
|
||||||
|
|||||||
Reference in New Issue
Block a user