管理Alias
在 Milvus 中,别名(Alias)是集合(Collection)的“逻辑门牌号”——应用代码始终通过固定别名(如 product_embeddings)访问数据,而运维人员可在后台无感切换该别名指向的实际集合,全程无需修改代码。简言之,它如同给集合贴的“可移动标签”,应用只认标签,数据切换时只需更改标签,用户全程无感知,实现应用与物理数据的解耦。
适用场景
此功能对于生产环境下的高可用性和敏捷运维至关重要,尤其适用于:
零停机数据更新:允许在不中断在线服务的情况下,平滑地切换到包含更新数据的新 Collection。
A/B 测试:通过为不同用户群体或请求分配指向不同 Collection(例如,包含不同索引或模型版本)的别名,可以轻松实现流量切分和效果对比。
蓝绿部署:别名是实现向量检索服务蓝绿部署策略的原子操作基础。
别名的约束
多别名对单集合:一个 Collection 可以关联多个别名。
单集合对单别名:一个别名在任意时刻只能指向一个唯一的 Collection。
前提条件
已在本地客户端成功安装了PyMilvus库,并将其更新至当前最新版本。
如果您尚未在本地客户端安装PyMilvus库,或者需要将其更新至当前最新版本,您可以执行以下命令。
pip install --upgrade pymilvus已创建Milvus实例,请参见详情快速创建Milvus实例。
别名管理API
创建别名
from pymilvus import MilvusClient
client = MilvusClient(
uri="http://localhost:19530",
token="root:xxx"
)
client.create_alias(
collection_name="milvus_collection",
alias="bob"
)
client.create_alias(
collection_name="milvus_collection",
alias="alice"
)列出别名
res = client.list_aliases(
collection_name="milvus_collection"
)
print(res)执行成功时的返回结果为:
{
"aliases": ["bob", "alice"],
"collection_name": "milvus_collection",
"db_name": "default"
}描述别名
res = client.describe_alias(
alias="bob"
)
print(res)执行成功时的返回结果为:
{
"alias": "bob",
"collection_name": "milvus_collection",
"db_name": "default"
}
更改别名
# 创建名称为milvus_collection的Collection2。
client.create_collection(
collection_name="milvus_collection2",
dimension=5
)
# 将alice更改为集合milvus_collection2的别名
client.alter_alias(
collection_name="milvus_collection2",
alias="alice"
)
res = client.describe_alias(
alias="alice"
)
print(res)执行成功时的返回结果为:
{
"alias": "alice",
"collection_name": "milvus_collection2",
"db_name": "default"
}
删除别名
client.drop_alias(
alias="bob"
)别名使用案例:线上无感切换索引
背景
已在生产环境中创建了错误的索引配置(如索引类型、参数等),业务系统正在在线使用,期望尽量降低线上使用的影响
核心目标: 在业务无感知(或影响极小)的情况下,为Milvus中的集合重建索引。
关键策略: 使用双写、双集合、别名切换的策略,确保在任何阶段都能快速回滚。
实施步骤
阶段一:准备与双写改造
根据新的索引需求,创建新的集合(例如
collection_new_v2)。其Schema应与旧版集合(collection_old)基本一致。修改业务代码,在执行插入、删除、更新操作时,同时向旧版集合 (
collection_old) 和新集合 (collection_new_v2) 写入数据。
阶段二:数据同步与索引构建
使用数据迁移功能,将旧版集合 (
collection_old) 中的存量数据全量同步到新集合 (collection_new_v2),可以通过时间戳列的方式同步某时间戳之前的数据。编写校验脚本,随机抽样或全量对比两个集合的数据量、关键字段的一致性。确保双写和存量同步的准确性。
在数据同步并校验无误后,对新集合 (
collection_new_v2) 执行索引创建操作。
阶段三:预加载与资源准备
扩容QueryNode,让集群能够同时加载新老集合,建议预留一定的内存Buffer(例如20%),以应对流量波动。
load 新集合(
collection_new_v2)。加载完成后,通过专门的测试接口或少量读流量,验证新集合的查询功能是否正常、性能是否符合预期。
阶段四:别名切换
寻找业务低峰期做切换动作。
将旧版集合 (
collection_old) 重命名为其他名字(例如collection_service_backup)。将新集合(
collection_new_v2)添加到业务使用的别名(例如collection_service)中。切换后观察业务。
如需回滚,将旧版集合 (
collection_old) 加回业务别名 (collection_service),将新集合 (collection_new_v2) 从业务别名 (collection_service) 中移除。
阶段五:清理与成本优化
切换后观察业务,如果正常,释放旧版集合 (
collection_old) 。释放旧版集合后,集群内存水位会下降。此时可以安全下线之前步骤中扩容的QueryNode,使集群恢复到原有成本水平。
在确保所有数据和应用都稳定运行,且不再需要旧版集合后,删除旧版集合 (
collection_old) 以释放磁盘空间。删除前,建议做最后一次数据备份或快照。清理业务应用中的双写代码,并关闭双写配置(如果决定不再需要)。