当您的源 Milvus 为自建(非阿里云 Milvus 服务)且无法通过公网访问时,您可以在本地或阿里云 VPC 内部署数据迁移工具容器,安全地将数据同步至阿里云 Milvus 服务。本文基于 taihao-executor 容器镜像实现,支持批量迁移多个数据集合,并保证数据一致性与高可靠性。
限制与配置要求
迁移前准备(必须执行)
操作状态控制
集群类型
要求
说明
源集群
停止所有数据变更操作
包括写入、删除和更新操作,确保集群处于只读状态,防止数据变动导致迁移过程中出现不一致。
目标集群
暂停所有数据操作
包括查询、写入、删除和更新操作,保持不可用状态,避免与迁移数据冲突。
版本兼容性
要求
规范
源集群版本
必须高于 2.3.6(即 ≥ v2.3.7)
目标集群版本
必须不低于源集群版本
迁移任务限制
任务管理
并发限制:同一时间仅能执行1个迁移任务。
数据范围
数据库限制:每个迁移任务仅支持同一数据库下的Collection。
Collection数量:最多包含5个Collection。
数据总量:所有Collection的总实体数量不超过5亿。
数据状态
源数据要求:待迁移的Collection必须处于已加载状态(load状态)。
目标实例要求:必须是空实例(无任何现有实体数据)。
网络要求
源 Milvus 与目标阿里云 Milvus 可被容器所在网络访问,建议部署在相同 VPC下。
迁移步骤
步骤1:拉取 VTS 镜像
docker pull registry.cn-hangzhou.aliyuncs.com/taihao-executor/taihao-executor:release_2.22.0-ali步骤2:启动容器并进入环境
启动容器(后台运行)
docker run -d -it \ --name milvus-migration \ registry.cn-hangzhou.aliyuncs.com/taihao-executor/taihao-executor:release_2.22.0-ali \ /bin/bash查看容器 ID 并进入
bash# 查询容器 docker ps # 进入容器(替换为实际容器ID) docker exec -it <container_id> bash示例:
docker exec -it 55ac98f3b054 bash
步骤3:创建迁移配置文件 migration.conf
在容器内创建配置文件:
vi migration.conf配置模板说明
hoconenv {
parallelism = 1 # 并发度,建议初始设为1
job.mode = "BATCH" # 批量模式
}
source {
Milvus {
url = "http://<源实例地址>:19530" # 支持内网地址
token = "<用户名>:<密码>" # 如 root:Test123456@
database = "default" # 默认 default,可通过 list_databases 查询
collections = ["col_a", "col_b"] # 要迁移的集合列表
batch_size = 10000 # 每次读取条数,大表可调高
}
}
sink {
Milvus {
url = "http://<目标阿里云Milvus地址>:19530"
token = "<目标实例token>"
database = "default"
batch_size = 1000
enable_auto_id = false # 若原集合有自增ID,设为false;否则true
}
}注意事项
必须加载源 Collection:所有待迁移的 Collection 必须已执行
load(),否则会报错;如需迁移全部集合:删除
collections行即可自动同步所有已加载集合;推荐使用内网地址:若容器与目标实例在同一区域,请使用内网 endpoint 提升传输速度。
步骤4:启动迁移任务
方式1:Local 模式(单机运行)
nohup ./bin/seatunnel.sh --config ./migration.conf -m local > migration.log 2>&1 &自定义内存参数(可选)
编辑 config/jvm_client_options 文件:
-Xms4g
-Xmx8g根据机器资源设置堆内存大小,避免 OOM。
方式2:Cluster 模式(高性能推荐)
适用于大数据量迁移:
bash# 创建日志目录
mkdir -p ./logs
# 启动集群服务
./bin/seatunnel-cluster.sh -d
# 提交任务
nohup ./bin/seatunnel.sh --config ./migration.conf > migration.log 2>&1 &步骤5:索引构建与加载(目标端)(可选)
迁移完成后,登录 Attu 或使用 SDK 对目标集合执行以下操作:
创建索引
milvus_client = milvus.prepare_index_params() index_params.add_index( field_name="vector", # Name of the vector field to be indexed index_type="HNSW", # Type of the index to create index_name="vector_index", # Name of the index to create metric_type="L2", # Metric type used to measure similarity params={ "M": 64, # Maximum number of neighbors each node can connect to in the graph "efConstruction": 100 # Number of candidate neighbors considered for connection during index construction } # Index building params ) milvus_client.create_index("collectionName", index_params)加载集合到内存
milvus_client.load_collection()索引需在加载前创建,否则无法启用加速检索。关键参数:
参数
获取方式
url
登录阿里云Milvus控制台,在安全配置页签下查看公网或者内网地址,建议优先使用内网地址以提升性能。
token
格式为
用户名:密码,例如:root:YourPassword123@,登录阿里云Milvus控制台,在安全配置页签下查看root账号对应的密码。database
默认为 default,如使用多数据库功能,可通过
list_databases()API 查询。完整配置:
env { parallelism = 1 job.mode = "BATCH" } source { Milvus { url = "http://xx.xx.xx.xx:19530" token = "root:SourcePass123@" database = "default" collections = ["medium_articles"] batch_size = 10000 } } sink { Milvus { url = "http://proxy-bj.vpc.milvus.aliyuncs.com:19530" token = "root:TargetPass123@" database = "default" batch_size = 10000 enable_auto_id = false } }
常见问题 FAQ
Q1:迁移过程中报错 “Collection not loaded”
A:请确保源端所有要迁移的 Collection 已调用 .load() 方法加载至内存。
Q2:能否只迁移部分字段?
A:当前版本仅支持整 Collection 迁移,暂不支持字段过滤。
Q3:如何监控迁移进度?
A:查看 migration.log 日志输出;也可通过 Attu 观察目标集合行数变化。