备份恢复 #

一、备份概述 #

text
备份类型:

┌─────────────────────────────────────────┐
│           备份方式                       │
├─────────────────────────────────────────┤
│                                         │
│  ┌─────────────────────────────────┐   │
│  │  全量备份                        │   │
│  │  - 完整数据副本                  │   │
│  │  - 恢复速度快                    │   │
│  │  - 占用空间大                    │   │
│  └─────────────────────────────────┘   │
│                                         │
│  ┌─────────────────────────────────┐   │
│  │  增量备份                        │   │
│  │  - 只备份变更数据                │   │
│  │  - 占用空间小                    │   │
│  │  - 恢复时间较长                  │   │
│  └─────────────────────────────────┘   │
│                                         │
│  ┌─────────────────────────────────┐   │
│  │  快照备份                        │   │
│  │  - 存储层快照                    │   │
│  │  - 速度快                        │   │
│  │  - 依赖存储支持                  │   │
│  └─────────────────────────────────┘   │
│                                         │
└─────────────────────────────────────────┘

二、Milvus Backup工具 #

2.1 安装备份工具 #

bash
wget https://github.com/zilliztech/milvus-backup/releases/download/v0.4.0/milvus-backup_Linux_x86_64.tar.gz

tar -zxvf milvus-backup_Linux_x86_64.tar.gz

chmod +x milvus-backup

mv milvus-backup /usr/local/bin/

2.2 配置文件 #

yaml
milvus:
  address: localhost
  port: 19530
  user: root
  password: Milvus

minio:
  address: localhost
  port: 9000
  accessKeyID: minioadmin
  secretAccessKey: minioadmin
  useSSL: false
  bucketName: a-bucket
  rootPath: files

backup:
  backupPath: /backup/milvus
  maxSegmentGroupSize: 2GiB

2.3 创建备份 #

bash
milvus-backup create -n backup_20240101

milvus-backup create -n backup_20240101 --collections "documents,images"

milvus-backup create -n backup_20240101 --database "my_database"

2.4 查看备份列表 #

bash
milvus-backup list

milvus-backup list --database "my_database"

2.5 恢复备份 #

bash
milvus-backup restore -n backup_20240101

milvus-backup restore -n backup_20240101 --collections "documents"

milvus-backup restore -n backup_20240101 -s _restored

2.6 删除备份 #

bash
milvus-backup delete -n backup_20240101

三、Python SDK备份 #

3.1 导出数据 #

python
from pymilvus import Collection, connections
import json

def export_collection(collection_name, output_file):
    connections.connect("default", host="localhost", port="19530")
    collection = Collection(collection_name)
    collection.load()
    
    all_data = []
    offset = 0
    batch_size = 10000
    
    while True:
        results = collection.query(
            expr="",
            output_fields=["*"],
            offset=offset,
            limit=batch_size
        )
        
        if not results:
            break
        
        all_data.extend(results)
        offset += batch_size
    
    with open(output_file, 'w') as f:
        json.dump(all_data, f)
    
    print(f"导出 {len(all_data)} 条数据到 {output_file}")

export_collection("documents", "documents_backup.json")

3.2 导入数据 #

python
from pymilvus import Collection, connections
import json

def import_collection(collection_name, input_file, batch_size=1000):
    connections.connect("default", host="localhost", port="19530")
    collection = Collection(collection_name)
    
    with open(input_file, 'r') as f:
        data = json.load(f)
    
    fields = [field.name for field in collection.schema.fields]
    
    for i in range(0, len(data), batch_size):
        batch = data[i:i+batch_size]
        
        batch_data = []
        for field in fields:
            batch_data.append([item.get(field) for item in batch])
        
        collection.insert(batch_data)
    
    collection.flush()
    print(f"导入 {len(data)} 条数据")

import_collection("documents_restored", "documents_backup.json")

四、存储层备份 #

4.1 MinIO备份 #

bash
mc alias set milvus-minio http://localhost:9000 minioadmin minioadmin

mc mirror milvus-minio/a-bucket /backup/minio/milvus-backup

mc cp --recursive milvus-minio/a-bucket /backup/minio/milvus-backup

4.2 恢复MinIO数据 #

bash
mc mirror /backup/minio/milvus-backup milvus-minio/a-bucket

4.3 S3备份 #

bash
aws s3 sync s3://milvus-bucket /backup/s3/milvus-backup

aws s3 sync /backup/s3/milvus-backup s3://milvus-bucket

五、etcd备份 #

5.1 etcd快照 #

bash
ETCDCTL_API=3 etcdctl snapshot save /backup/etcd/snapshot.db \
  --endpoints=http://localhost:2379

ETCDCTL_API=3 etcdctl snapshot status /backup/etcd/snapshot.db

5.2 恢复etcd #

bash
ETCDCTL_API=3 etcdctl snapshot restore /backup/etcd/snapshot.db \
  --data-dir=/var/lib/etcd-restore

六、定时备份 #

6.1 Cron定时任务 #

bash
crontab -e

0 2 * * * /usr/local/bin/milvus-backup create -n backup_$(date +\%Y\%m\%d) >> /var/log/milvus-backup.log 2>&1

0 3 * * 0 /usr/bin/find /backup/milvus -type d -mtime +30 -exec rm -rf {} \;

6.2 Kubernetes CronJob #

yaml
apiVersion: batch/v1
kind: CronJob
metadata:
  name: milvus-backup
  namespace: milvus
spec:
  schedule: "0 2 * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: backup
            image: milvus-backup:latest
            command:
            - /bin/sh
            - -c
            - |
              milvus-backup create -n backup_$(date +%Y%m%d)
              find /backup -type d -mtime +7 -exec rm -rf {} \;
            volumeMounts:
            - name: backup-storage
              mountPath: /backup
          volumes:
          - name: backup-storage
            persistentVolumeClaim:
              claimName: backup-pvc
          restartPolicy: OnFailure

七、灾难恢复 #

7.1 恢复流程 #

text
灾难恢复流程:

┌──────────┐     ┌──────────┐     ┌──────────┐
│ 停止服务  │────▶│ 恢复etcd  │────▶│ 恢复存储  │
└──────────┘     └──────────┘     └──────────┘
                        │
                        ▼
                 ┌──────────┐
                 │ 启动服务  │
                 └──────────┘
                        │
                        ▼
                 ┌──────────┐
                 │ 验证数据  │
                 └──────────┘

7.2 完整恢复脚本 #

bash
#!/bin/bash

echo "停止Milvus服务..."
kubectl scale deployment -n milvus --replicas=0 --all

echo "恢复etcd..."
ETCDCTL_API=3 etcdctl snapshot restore /backup/etcd/snapshot.db \
  --data-dir=/var/lib/etcd

echo "恢复MinIO..."
mc mirror /backup/minio/milvus-backup milvus-minio/a-bucket

echo "启动Milvus服务..."
kubectl scale deployment -n milvus --replicas=1 --all

echo "等待服务就绪..."
sleep 60

echo "验证数据..."
python3 verify_data.py

echo "恢复完成"

八、备份策略 #

8.1 备份策略设计 #

text
备份策略建议:

┌─────────────────────────────────────────┐
│           备份频率                       │
├─────────────────────────────────────────┤
│  全量备份: 每周一次                      │
│  增量备份: 每天一次                      │
│  快照备份: 每小时一次                    │
└─────────────────────────────────────────┘

┌─────────────────────────────────────────┐
│           保留周期                       │
├─────────────────────────────────────────┤
│  日备份: 保留7天                         │
│  周备份: 保留4周                         │
│  月备份: 保留12个月                      │
└─────────────────────────────────────────┘

8.2 备份验证 #

python
def verify_backup(backup_name):
    from pymilvus import connections, utility, Collection
    
    connections.connect("default", host="localhost", port="19530")
    
    collections = utility.list_collections()
    
    for collection_name in collections:
        collection = Collection(collection_name)
        count = collection.num_entities
        print(f"{collection_name}: {count} 条数据")
    
    return True

verify_backup("backup_20240101")

九、最佳实践 #

9.1 备份检查清单 #

text
备份检查清单:

□ 备份工具已安装配置
□ 定时备份任务已设置
□ 备份存储空间充足
□ 备份保留策略已配置
□ 恢复流程已测试
□ 备份验证脚本已准备
□ 灾难恢复计划已制定

9.2 监控告警 #

yaml
groups:
- name: milvus-backup
  rules:
  - alert: BackupFailed
    expr: milvus_backup_status == 0
    for: 5m
    labels:
      severity: critical
    annotations:
      summary: "Milvus备份失败"
      description: "备份任务执行失败,请检查日志"

十、总结 #

备份恢复速查表:

操作 命令
创建备份 milvus-backup create
查看备份 milvus-backup list
恢复备份 milvus-backup restore
删除备份 milvus-backup delete
etcd快照 etcdctl snapshot save
MinIO备份 mc mirror

下一步,让我们学习性能优化!

最后更新:2026-04-04