# S3 Streamable Backup: потоковые бэкапы напрямую в облако для Manticore Search

С тех пор, как мы представили [инструмент для резервного копирования](/blog/new-backup-and-recovery-approaches/) в Manticore Search 6, создавать резервные копии данных стало заметно проще. Но мы постоянно слышали один и тот же вопрос: *"А как насчёт облачного хранилища?"* Сегодня мы рады объявить, что **manticore-backup** теперь поддерживает **S3-совместимое хранилище** с потоковой загрузкой — без промежуточных файлов, без проблем с местом на локальном диске — только бэкапы напрямую в облако.

## Проблема традиционных резервных копий

Если Manticore Search работает в продакшене, объём данных может быстро расти. У локального резервного копирования есть свои ограничения:

- **Ограничения по дисковому пространству**: На той же машине нужно свободное место, сопоставимое с размером резервной копии
- **Ручные шаги переноса**: Сначала создайте резервную копию на локальном хранилище, а затем загрузите её в облачное
- **Потери времени**: Сценарий «сначала копирование, потом загрузка» фактически вдвое увеличивает время резервного копирования
- **Лишняя сложность**: Нужно писать скрипты для надёжной загрузки с поддержкой возобновления, шифрования и обработки ошибок

## Потоковое резервное копирование в S3: что меняется

Новая поддержка S3-хранилища отправляет данные резервной копии **напрямую** в S3-совместимое хранилище. Вот что происходит внутри:

1. **Без промежуточных файлов**: Данные передаются из Manticore напрямую в S3
2. **Автоматические multipart-загрузки**: Большие файлы автоматически разбиваются на части и загружаются параллельно
3. **Встроенное шифрование**: Шифрование SSE‑S3 включено по умолчанию для AWS S3 и может настраиваться для других провайдеров
4. **Поддержка сжатия**: Опциональное сжатие zstd уменьшает время передачи и стоимость хранения
5. **Восстановление по манифесту**: Для восстановления не требуется разрешение `s3:ListBucket`

### Поддерживаемые провайдеры хранилища

Мы протестировали с **AWS S3**, **MinIO** и **Cloudflare R2**, но должно работать и любое другое хранилище, совместимое с S3. Реализация использует стандартный AWS SDK для PHP, поэтому если сервис понимает S3 API, всё должно работать.

## Использование

Запустить резервное копирование в S3 просто: достаточно сменить путь назначения:

### CLI

```bash
# Задайте учётные данные
export AWS_ACCESS_KEY_ID=your_access_key
export AWS_SECRET_ACCESS_KEY=your_secret_key
export AWS_REGION=us-east-1

# Бэкап в S3
manticore-backup --config=/etc/manticore/manticore.conf --backup-dir=s3://my-bucket/manticore-backups

# С кастомным endpoint (MinIO, Wasabi и т. д.)
export AWS_ENDPOINT_URL=https://minio.example.com
manticore-backup --config=/etc/manticore/manticore.conf --backup-dir=s3://my-bucket/backups
```

### Переменные окружения

| Переменная | Описание |
|------------|----------|
| `AWS_ACCESS_KEY_ID` | Ваш ключ доступа к S3 |
| `AWS_SECRET_ACCESS_KEY` | Ваш секретный ключ S3 |
| `AWS_REGION` | Регион S3 (например, `us-east-1`) |
| `AWS_ENDPOINT_URL` | Кастомный endpoint для хранилища, совместимого с S3 |
| `AWS_S3_ENCRYPTION` | Установите `0`, чтобы отключить шифрование SSE‑S3, например для MinIO или кастомных endpoint'ов |

## Что важно для производительности

Производительность потокового резервного копирования в S3 в первую очередь зависит от пропускной способности сети и скорости загрузки у провайдера S3. В отличие от локальных резервных копий, где всё упирается во ввод-вывод диска, резервные копии в S3 зависят от сети. Главное преимущество в том, что исчезают накладные расходы сценария «сначала записать локально, потом загрузить» — данные идут напрямую из Manticore в S3, не проходя через локальную файловую систему.

Для оптимальной производительности:
- Обеспечьте достаточную пропускную способность канала до вашего endpoint S3
- При необходимости включите сжатие (`--compress`), чтобы уменьшить объём передаваемых данных
- Multipart-загрузки автоматически включаются для файлов больше 5 МБ, повышая надёжность при работе с большими наборами данных

## Восстановление из S3

Восстановление тоже устроено просто. Инструмент сначала загружает файлы во временный каталог, а затем выполняет восстановление:

```bash
# Список доступных резервных копий
manticore-backup --backup-dir=s3://my-bucket/manticore-backups --list

# Восстановление конкретной резервной копии
manticore-backup --config=/etc/manticore/manticore.conf --backup-dir=s3://my-bucket/manticore-backups --restore=backup-20250115120000
```

### Требуемые разрешения S3

**Для резервного копирования:**
- `s3:PutObject`
- `s3:PutObjectAcl` (если вы используете ACL)

**Для перечисления резервных копий:**
- `s3:ListBucket`

**Для восстановления:**
- `s3:GetObject`

**Примечание:** Хотя для перечисления резервных копий требуется `s3:ListBucket`, для восстановления конкретной резервной копии оно не нужно. Если вы знаете имя каталога резервной копии, например `backup-20250115120000`, вы можете восстановить её напрямую через `--restore`, имея только разрешение `s3:GetObject`. Файл манифеста описывает всё содержимое резервной копии, поэтому перечислять каталоги не требуется.

## Сценарии использования

### Cloud-ориентированные окружения

Запускаете Manticore в Kubernetes или Docker? Резервное копирование в S3 органично вписывается в cloud-ориентированные workflows:

```yaml
# Пример Kubernetes CronJob
apiVersion: batch/v1
kind: CronJob
metadata:
  name: manticore-backup
spec:
  schedule: "0 2 * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: backup
            image: manticoresearch/manticore:latest
            command:
            - manticore-backup
            - --config=/etc/manticore/manticore.conf
            - --backup-dir=s3://my-backup-bucket/manticore
            env:
            - name: AWS_ACCESS_KEY_ID
              valueFrom:
                secretKeyRef:
                  name: s3-credentials
                  key: access-key
            - name: AWS_SECRET_ACCESS_KEY
              valueFrom:
                secretKeyRef:
                  name: s3-credentials
                  key: secret-key
          restartPolicy: OnFailure
```

### Disaster recovery

Храните резервные копии в другом регионе или даже у другого облачного провайдера:

```bash
# Основной бэкап в локальное S3-совместимое хранилище
export AWS_ENDPOINT_URL=https://minio.internal.company.com
manticore-backup --backup-dir=s3://backups-primary/manticore

# Вторичный бэкап в AWS S3 для DR
unset AWS_ENDPOINT_URL
export AWS_REGION=eu-west-1
manticore-backup --backup-dir=s3://company-dr-backups/manticore
```

### Снижение требований к локальному хранилищу

Для больших наборов данных локальное хранилище под резервные копии может стоить дорого. При потоковом резервном копировании в S3:

- Нет необходимости выделять большие тома для резервных копий
- Платите только за используемое хранилище S3
- Правила жизненного цикла могут автоматически перемещать старые резервные копии в более дешёвые классы хранения

## Технические детали

### Архитектура потоковой передачи

Реализация S3-хранилища работает по потоковой схеме:

1. **Потоковая передача по файлам**: Каждый файл таблицы читается и загружается потоком
2. **Автоматический multipart**: Для файлов больше 5 МБ автоматически используется multipart-загрузка для надёжности
3. **Сжатие на лету**: Если включено, сжатие zstd выполняется прямо во время передачи
4. **Проверка контрольных сумм**: Каждый файл проверяется по контрольной сумме для обеспечения целостности

### Интерфейс хранилища

Поддержка S3 построена вокруг нового `StorageInterface`, который абстрагирует операции с хранилищем. Это означает:

- Локальная файловая система и S3 используют один и тот же кодовый путь
- В будущем можно будет легко добавить и другие storage-бекенды — например, GCS или Azure Blob
- Последовательное поведение независимо от типа хранилища

## Миграция с локальных резервных копий

Уже используете локальные резервные копии? Перейти на S3 просто:

1. Настройте учётные данные S3
2. Измените `--backup-dir` с `/local/path` на `s3://bucket/path`
3. Готово! Те же команды работают и дальше

Ваши существующие локальные резервные копии остаются доступными, и вы можете постепенно переходить на S3 или поддерживать оба варианта для избыточности.

## Заключение

Потоковое резервное копирование в S3 выводит резервное копирование Manticore Search на уровень современных cloud-окружений. Независимо от того, работаете ли вы в cloud-окружении, нужен ли вам межрегиональный disaster recovery или вы просто хотите снизить нагрузку на локальное хранилище, прямое потоковое копирование в S3 делает резервные копии проще и эффективнее.

Функция уже доступна в manticore-backup. Ознакомьтесь с [документацией](https://manual.manticoresearch.com/Securing_and_compacting_a_table/Backup_and_restore#S3-storage-support), чтобы узнать подробности, и поделитесь впечатлениями!

---

**Готовы попробовать?** [Установите Manticore Search](/install/) и попробуйте резервное копирование в S3 уже сегодня. Есть вопросы или отзывы? Присоединяйтесь к нам в [Slack](https://slack.manticoresearch.com/) или на [GitHub](https://github.com/manticoresoftware/manticoresearch-backup).
