# S3 流式备份：Manticore Search 的直接云备份

自从我们在 Manticore Search 6 中引入了 [备份工具](/blog/new-backup-and-recovery-approaches/)，备份数据变得显著更容易。但我们一直听到同样的问题：*"关于云存储呢？"* 今天，我们激动地宣布 **manticore-backup** 现在支持 **S3 兼容存储**，并具有流式上传功能 —— 无需中间文件，无需本地磁盘空间的烦恼，只需直接云备份。

## 传统备份的问题

当你在生产环境中运行 Manticore Search 时，数据集可能会迅速增长。备份到本地存储有其局限性：

- **磁盘空间限制**：你需要与备份大小相等的空闲空间在同台机器上
- **手动传输步骤**：本地备份，然后上传到云存储
- **时间开销**：复制后再上传的流程使备份窗口翻倍
- **复杂性**：需要脚本实现可靠上传、断点续传、加密和错误处理

## 流式 S3 备份：工作原理

新的 S3 存储支持将你的备份数据 **直接** 流式传输到 S3 兼容存储。以下是幕后发生的事情：

1. **无中间文件**：数据直接从 Manticore 流式传输到 S3
2. **自动分段上传**：大文件会自动分块并并行上传
3. **内置加密**：默认启用 SSE-S3 加密（可配置为其他提供商）
4. **压缩支持**：可选的 zstd 压缩减少传输时间和存储成本
5. **基于清单的恢复**：恢复时不需要 `s3:ListBucket` 权限

### 支持的存储提供商

我们已测试过 **AWS S3**、**MinIO** 和 **Cloudflare R2**，但任何 S3 兼容存储都应适用。实现使用标准的 AWS PHP SDK，因此如果它支持 S3 API，就应能正常工作。

## 使用方法

使用 S3 备份只需更改你的目标路径：

### CLI

```bash
# Set your credentials
export AWS_ACCESS_KEY_ID=your_access_key
export AWS_SECRET_ACCESS_KEY=your_secret_key
export AWS_REGION=us-east-1

# Backup to S3
manticore-backup --config=/etc/manticore/manticore.conf --backup-dir=s3://my-bucket/manticore-backups

# With custom endpoint (MinIO, Wasabi, etc.)
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` | S3 兼容存储的自定义端点 |
| `AWS_S3_ENCRYPTION` | 设置为 `0` 以禁用 SSE-S3 加密（适用于 MinIO/自定义端点） |

## 性能考虑

S3 流式备份性能主要取决于你的网络带宽和 S3 提供商的上传速度。与本地磁盘备份受限于磁盘 I/O 不同，S3 备份是网络受限的。关键优势是消除了“本地写入，然后上传”的开销 —— 数据直接从 Manticore 流式传输到 S3，而不会接触本地文件系统。

为了获得最佳性能：
- 确保有足够的上传带宽到你的 S3 端点
- 考虑使用压缩（`--compress`）以减少数据传输
- 超过 5MB 的文件会自动进行分段上传，提高大型数据集的可靠性

## 从 S3 恢复

恢复同样无缝进行。工具首先将文件下载到临时目录，然后执行恢复：

```bash
# List available backups
manticore-backup --backup-dir=s3://my-bucket/manticore-backups --list

# Restore a specific backup
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`），你可以仅使用 `s3:GetObject` 权限直接通过 `--restore` 进行恢复。清单文件跟踪所有备份内容，因此不需要目录列表。

## 使用场景

### 云原生部署

在 Kubernetes 或 Docker 中运行 Manticore？S3 备份自然融入云原生工作流：

```yaml
# Kubernetes CronJob example
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
```

### 灾难恢复

将备份存储在不同区域甚至不同云提供商中：

```bash
# Primary backup to local S3-compatible storage
export AWS_ENDPOINT_URL=https://minio.internal.company.com
manticore-backup --backup-dir=s3://backups-primary/manticore

# Secondary backup to AWS S3 for 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. **自动分段**：超过 5MB 的文件自动使用分段上传以提高可靠性
3. **实时压缩**：如果启用，zstd 压缩在流式传输期间进行
4. **校验和验证**：每个文件进行校验和验证以确保完整性

### 存储接口

S3 支持基于新的 `StorageInterface`，抽象了存储操作。这意味着：

- 本地文件系统和 S3 共享相同的代码路径
- 未来存储后端（GCS、Azure Blob）可以轻松添加
- 无论存储类型如何，行为保持一致

## 从本地备份迁移

已经在使用本地备份？迁移很简单：

1. 设置你的 S3 凭据
2. 将 `--backup-dir` 从 `/local/path` 更改为 `s3://bucket/path`
3. 就是这样！相同的命令以完全相同的方式工作

你的现有本地备份仍然可访问，并且可以逐步过渡到 S3 或同时维护两者以实现冗余。

## 结论

S3 流式备份将 Manticore Search 的备份功能带入云时代。无论你是在云原生环境中运行，需要跨区域灾难恢复，还是仅仅想减少本地存储开销，直接到 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)。
