从阿里云Milvus Beta版或自建集群向阿里云Milvus版的迁移方案
阿里云向量检索服务Milvus版是由阿里云与Zilliz联合打造的一款全托管向量检索引擎,集成Zilliz商业版内核,并确保与开源Milvus的完全兼容性,支持无缝迁移。本文主要介绍如何将存量数据从阿里云Beta版Milvus集群或用户自建的Milvus集群,迁移到阿里云Milvus Zilliz内核版集群的方案。
前提条件
已创建阿里云Beta版Milvus集群或自建的Milvus集群。
使用限制
源集群和目标集群的Milvus版本必须大于2.3.0。
确保客户端的网络环境可以访问源集群和目标集群。
确认源集群内的Collection处于已加载(Loaded)状态。
说明如果目标集群中没有该Collection,迁移工具会自动创建该Collection。但需要注意的是,迁移完成后,目标集群的索引不会自动创建,需要您手动创建相应的索引。
注意事项
该迁移方案专注于存量数据的迁移。如果在迁移过程中,Collection不断接收到新的数据录入(即增量数据),那么迁移将无法自动包含这些增量的数据。
迁移流程
步骤一:下载迁移工具
根据客户端运行环境,下载最新版本的Milvus-migration工具包。该工具包是免安装版,直接解压即可使用。
步骤二:配置迁移工具
进入解压缩后的安装包目录。
在
milvus-migration
同级目录创建migration.yaml
文件。migration.yaml
文件内容示例如下所示。其中,您可以根据集群的负载和数据大小以及分布情况调整bufferSize的大小和grpc请求参数大小。dumper: worker: workMode: milvus2x # 定义工具模式,设置为milvus2x即可,代表迁移至milvus2.x。 reader: bufferSize: 500 # 每次从源集群批量读取数据的行数。 meta: mode: config # 设置为config即可,声明从配置文件中读取元数据配置。 version: 2.3.0 # 源集群版本,设置为2.3.0及以上。 collection: src_collection_name # 源集群的Collection名称。 source: milvus2x: endpoint: http://{milvus2x_domain}:{milvus2x_port} username: xxxx password: xxxxx grpc: maxCallRecvMsgSize: 268435456 # 设置源集群rpc的返回结果大小。 maxCallSendMsgSize: 268435456 # 设置源集群rpc的发送请求大小。 target: milvus2x: endpoint: http://{milvus2x_domain}:{milvus2x_port} username: xxxx password: xxxxx grpc: maxCallRecvMsgSize: 268435456 # 设置目标集群rpc的返回结果大小。 maxCallSendMsgSize: 268435456 # 设置目标集群rpc的发送请求大小。
涉及以下参数需要您根据实际情况进行替换。
参数
说明
version
源集群的Milvus版本。
collection
源集群的Collection名称。本文示例为src_collection_name。
endpoint
源集群或者目标集群的Endpoint。
如果是阿里云Beta版Milvus集群,则格式为
c-xxx.milvus.aliyuncs.com:19530
或者c-xxx-internal.milvus.aliyuncs.com:19530
,其中c-xxx
为Milvus集群的ID。username
源集群或者目标集群用于登录数据库的账号。如果是阿里云Beta版Milvus集群,则使用root账号。
password
源集群或者目标集群用于登录数据库账号的密码。
步骤三:启动迁移工具
在迁移工具安装目录下,执行以下命令。
./milvus-migration start --config=migration.yaml
在迁移过程中,您可以利用集成了Zilliz商业版内核的阿里云Milvus高效地构建索引,而无需等待迁移完成后再创建索引,具体的索引创建详情请参见步骤四:创建索引。
整体迁移完成之后,您可以看到类似如下返回信息。
[INFO] [migration/milvus2x_starter.go:79] ["=================>JobProcess!"] [Percent=100]
[INFO] [migration/milvus2x_starter.go:75] ["[Loader] Begin to write data by batchInsert sdk to milvus"] [collection=src_collection_name]
[INFO] [dbclient/cus_field_milvus2x.go:151] ["[Loader] success to batchInsert to Milvus"] [col=batchInsert to Milvus]
[INFO] [migration/milvus2x_starter.go:79] ["=================>JobProcess!"] [Percent=100]
[INFO] [migration/milvus2x_starter.go:27] ["[Starter] migration Milvus2x to Milvus2x finish!!!"] [Cost=878.488801469]
[INFO] [starter/starter.go:109] ["[Starter] Migration Success!"] [Cost=878.488879839]
步骤四:创建索引
数据迁移完成后,您可以为Collection创建相应的索引。创建索引示例如下所示。
AUTOINDEX
AUTOINDEX索引的更多详情,请参见使用AUTOINDEX。
from pymilvus import MilvusClient
# 创建Milvus Client。
client = MilvusClient(
uri="http://c-xxxx.milvus.aliyuncs.com:19530", # Milvus实例的公网地址。
token="<yourUsername>:<yourPassword>", # 登录Milvus实例的用户名和密码。
db_name="default" # 待连接的数据库名称,本文示例为默认的default。
)
index_params = MilvusClient.prepare_index_params()
index_params.add_index(
field_name="vector",
metric_type="L2",
index_type="AUTOINDEX",
)
client.create_index(
collection_name="src_collection_name",
index_params=index_params
)
client.load_collection(
collection_name="src_collection_name"
)
HNSW
from pymilvus import MilvusClient
# 创建Milvus Client。
client = MilvusClient(
uri="http://c-xxxx.milvus.aliyuncs.com:19530", # Milvus实例的公网地址。
token="<yourUsername>:<yourPassword>", # 登录Milvus实例的用户名和密码。
db_name="default" # 待连接的数据库名称,本文示例为默认的default。
)
index_params = MilvusClient.prepare_index_params()
index_params.add_index(
field_name="vector",
index_type="HNSW",
metric_type="L2",
params= {"M": 100,"efConstruction": 64}
)
client.create_index(
collection_name="src_collection_name",
index_params=index_params
)
client.load_collection(
collection_name="src_collection_name"
)
IVF_FLAT
from pymilvus import MilvusClient
# 创建Milvus Client。
client = MilvusClient(
uri="http://c-xxxx.milvus.aliyuncs.com:19530", # Milvus实例的公网地址。
token="<yourUsername>:<yourPassword>", # 登录Milvus实例的用户名和密码。
db_name="default" # 待连接的数据库名称,本文示例为默认的default。
)
index_params = MilvusClient.prepare_index_params()
index_params.add_index(
field_name="vector",
index_type="IVF_FLAT",
metric_type="L2",
params={"nlist": 1024}
)
client.create_index(
collection_name="src_collection_name",
index_params=index_params
)
client.load_collection(
collection_name="src_collection_name"
)