快照使用案例Compatible with Milvus 3.0.x
在本指南中,您将找到快照的常见用例。
数据备份和恢复
快照是快速的时间点数据镜像,适用于快速回滚或测试(数天至数周)。同时,备份是独立、完整的副本,可单独存储,用于长期灾难恢复(数周至数年),并能更好地防止整体存储故障。
下表对快照和备份进行了比较。
备份 |
快照 |
|
|---|---|---|
创建备份 |
复制所有数据文件(耗时) |
只创建元数据(以毫秒为单位) |
恢复 |
导入数据并重建索引 |
仅复制现有数据和索引文件 |
性能 |
速度慢、资源密集型 |
快速、轻量级(以秒到分钟为单位) |
系统影响 |
I/O 和 CPU 占用率高 |
影响最小 |
创建快照通常需要几毫秒,恢复快照需要几秒到几分钟,具体取决于数据量。
有关快照限制、约束及其系统影响的详细信息,请参阅快照。
创建快照
创建快照前,建议您停止向目标 Collections 写入数据并调用flush() ,以避免可能的数据丢失。
命名快照时,请使用清晰、描述性的名称,如"daily_backup_20240101" 或"v2.1_production_release" ,避免使用通用术语,如"backup1" 和"test" 。明智地使用快照名称,以区分不同版本、环境和阶段的快照。
下面的代码示例假定您已经有一个名为my_collection 的 Collections 。
from pymilvus import MilvusClient
client = MilvusClient(
uri="http://localhost:19530",
token="root:Milvus"
)
# Recommended: Flush data before creating snapshot to ensure all data is included
client.flush(collection_name="my_collection")
# Create snapshot for entire collection
client.create_snapshot(
collection_name="my_collection",
snapshot_name="backup_20240101",
description="Daily backup for January 1st, 2024"
)
// java
import (
"context"
"github.com/milvus-io/milvus/client/v2/milvusclient"
)
client, err := milvusclient.New(context.Background(), &milvusclient.ClientConfig{
Address: "localhost:19530",
Token: "root:Milvus",
})
// Recommended: Flush data before creating snapshot to ensure all data is included
err = client.Flush(context.Background(), milvusclient.NewFlushOption("my_collection"))
if err != nil {
log.Fatal(err)
}
// Create snapshot
createOpt := milvusclient.NewCreateSnapshotOption("backup_20240101", "my_collection").
WithDescription("Daily backup for January 1st, 2024")
err = client.CreateSnapshot(context.Background(), createOpt)
// node.js
# restful
还原快照
您可以将快照还原到新的 Collections 中。此操作是异步的,并返回一个作业 ID 用于跟踪还原进度。
还原使用复制段机制,而不是数据导入,这样效率更高,因为它可以
直接从快照存储复制段文件(binlogs、deltalogs、index 文件
保留字段 ID 和索引 ID,确保与现有数据文件兼容
避免了数据重写和索引重建,从而大大加快了恢复时间,并且
确保性能比传统备份和还原方法提高 10 到 100 倍
还原快照的步骤如下:
# Restore snapshot to new collection
job_id = client.restore_snapshot(
snapshot_name="backup_20240101",
collection_name="restored_collection",
)
// java
restoreOpt := milvusclient.NewRestoreSnapshotOption(
"backup_20240101",
"restored_collection"
)
jobID, err := client.RestoreSnapshot(context.Background(), restoreOpt)
if err != nil {
log.Fatal(err)
}
// node.js
# restful
删除快照
如果不再需要快照,可以将其删除。建议您定期删除旧快照,以节省存储空间。
client.drop_snapshot(
snapshot_name="backup_20240101"
)
// java
dropOpt := milvusclient.NewDropSnapshotOption("backup_20240101")
err := client.DropSnapshot(context.Background(), dropOpt)
// node.js
# restful
使用 Spark 进行数据处理
快照可为分析工作负载提供稳定、一致的数据源,从而实现高效的离线数据处理。您可以使用 Spark 或其他大数据处理框架直接访问存储在对象存储中的快照数据,而不会影响实时 Milvus 集群。
以下代码假定您已创建了名为"analytics_snapshot_20260321" 的快照,将其存储在对象存储桶中,并获得了对象存储访问凭证。
第 1 步:获取快照元数据
在使用 Spark 访问快照数据之前,先获取快照元数据,以便在对象存储中定位数据文件。
# Get snapshot metadata
snapshot_info = client.describe_snapshot(
snapshot_name=s"analytics_snapshot_20260321",
include_collection_info=True
)
# Locate data files in S3
s3_path = f"s3a://{snapshot_info.s3_location}/binlogs/"
步骤 2:启动 Spark 会话
在对象存储中找到数据文件后,启动 Spark 会话并将数据读入数据帧。
spark = SparkSession.builder \
.appName("VectorAnalytics") \
.config("spark.hadoop.fs.s3a.access.key", "YOUR_ACCESS_KEY") \
.config("spark.hadoop.fs.s3a.secret.key", "YOUR_SECRET_KEY") \
.getOrCreate()