管理Alias

更新时间:
复制为 MD 格式

在 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) 以释放磁盘空间。删除前,建议做最后一次数据备份或快照。

  • 清理业务应用中的双写代码,并关闭双写配置(如果决定不再需要)。