# 备份与灾难恢复

Monetarie PIX 的备份策略、灾难恢复程序和数据保留策略。

## 前提条件

- 数据库管理员访问权限
- 了解 RPO/RTO 要求
- 备份文件存储（本地、S3、GCS 或 Azure Blob）

## 备份策略

### PostgreSQL

| 方法 | 频率 | RPO | 存储 |
|------|------|-----|------|
| `pg_dump`（逻辑备份） | 每日 | 24小时 | 对象存储 |
| WAL 归档（持续） | 持续 | 分钟级 | 对象存储 |
| Cloud SQL 自动备份 | 可配置 | 可配置 | 云提供商 |
| 时间点恢复 | 按需 | 分钟级 | WAL 归档 |

### 逻辑备份

```bash
# 全量数据库备份
pg_dump -Fc -h $DB_HOST -U $DB_USER -d monetarie > monetarie_$(date +%Y%m%d).dump

# 特定模式备份
pg_dump -Fc -h $DB_HOST -U $DB_USER -d monetarie -n monetarie_spi > spi_$(date +%Y%m%d).dump

# 恢复
pg_restore -h $DB_HOST -U $DB_USER -d monetarie monetarie_20260209.dump
```

### WAL 归档

```sql
-- postgresql.conf
ALTER SYSTEM SET archive_mode = on;
ALTER SYSTEM SET archive_command = 'gcloud storage cp %p gs://fluxiq-wal-archive/%f';
ALTER SYSTEM SET wal_level = replica;
```

### 自动备份脚本

```bash
#!/bin/bash
# /opt/monetarie/scripts/backup.sh
BACKUP_DIR="/backups/pix"
DATE=$(date +%Y%m%d_%H%M%S)
RETENTION_DAYS=30

# 备份
pg_dump -Fc -h $DB_HOST -U $DB_USER -d monetarie > $BACKUP_DIR/monetarie_$DATE.dump

# 上传到云存储
gcloud storage cp $BACKUP_DIR/monetarie_$DATE.dump gs://fluxiq-backups/pix/

# 清理旧备份
find $BACKUP_DIR -name "*.dump" -mtime +$RETENTION_DAYS -delete
```

## Redis 备份

Redis 用于临时数据（速率限制、Token 黑名单、幂等性）。备份可选但建议执行：

```bash
# 触发 RDB 快照
redis-cli BGSAVE

# 复制 RDB 文件
cp /var/lib/redis/dump.rdb /backups/redis/dump_$(date +%Y%m%d).rdb
```

## NATS JetStream

JetStream 数据存储在磁盘上。备份存储目录：

```bash
# 优雅停止 NATS，备份存储
tar czf /backups/nats/nats_$(date +%Y%m%d).tar.gz /data/nats/
```

## 灾难恢复

### RTO/RPO 目标

| 场景 | RPO | RTO |
|------|-----|-----|
| 数据库损坏 | < 1 小时 | 2 小时 |
| 集群完全故障 | < 1 小时 | 4 小时 |
| 区域中断 | < 24 小时 | 8 小时 |

### 恢复程序

#### 数据库恢复

```bash
# 1. 停止后端 Pod
kubectl scale deployment pix-backend -n pix --replicas=0

# 2. 从备份恢复
pg_restore -h $NEW_DB_HOST -U $DB_USER -d monetarie monetarie_backup.dump

# 3. 应用备份时间之后的 WAL（时间点恢复）
# 配置 recovery.conf 进行时间点恢复

# 4. 重启后端
kubectl scale deployment pix-backend -n pix --replicas=2

# 5. 运行待执行迁移
kubectl exec -n pix deployment/pix-backend -- bin/monetarie_pix eval "Shared.Release.migrate()"
```

#### NATS 恢复

```bash
# 1. 恢复 JetStream 存储
tar xzf nats_backup.tar.gz -C /data/nats/

# 2. 启动 NATS 节点
systemctl start nats

# 3. 验证流
nats stream ls
```

## 数据保留

| 数据 | 保留期限 | 管理方式 |
|------|----------|----------|
| ICOM 消息 | 10 年 | XmlArchiver |
| DICT 读取日志 | 2 年 | XmlArchiver |
| 审计 activity_log | 按月分区 | PartitionManager |
| 登录历史 | 按月分区 | PartitionManager |
| NATS JetStream | 每个流 7-90 天 | 流配置 |
| Redis 数据 | 临时（基于 TTL） | Redis 淘汰策略 |

`PartitionManager` GenServer 每日自动清除过期审计分区。

## 预期结果

配置备份和灾难恢复后：

- 每日逻辑备份存储在云存储中
- WAL 归档支持时间点恢复
- 恢复程序文档化并每季度测试
- 数据保留策略自动执行
