一、环境说明
本文基于以下环境编写:
| 项目 | 内容 |
|---|---|
| 云平台 | 腾讯云 |
| 操作系统 | Ubuntu Server 24.04 LTS |
| Docker | 已安装(Docker Engine 19.03+ / Docker Compose 1.25.1+) |
| 部署模式 | Milvus Standalone(Docker Compose) |
| 客户端 | 本机通过公网 IP 访问 |
二、安装部署
2.1 下载 Docker Compose 配置文件
Milvus 官方提供了 Standalone 模式的 Docker Compose 配置文件,包含 Milvus 核心服务、etcd(元数据存储)和 MinIO(对象存储)三个组件。
在腾讯云服务器上执行:
# 创建 Milvus 工作目录
mkdir -p /opt/milvus && cd /opt/milvus
# 下载 Milvus Standalone Docker Compose 配置文件(以 v2.5 稳定版为例)
wget https://github.com/milvus-io/milvus/releases/download/v2.5.14/milvus-standalone-docker-compose.yml -O docker-compose.yml
配置文件默认包含以下关键端口映射:
- 19530(RPC 数据端口,客户端连接核心通道)
- 9091(RESTful API / 健康检查端口)
2.2 启动 Milvus 服务
# 后台启动 Milvus Standalone
sudo docker compose up -d
# 查看容器运行状态
sudo docker compose ps
预期输出中包含三个容器:milvus-standalone、milvus-etcd、milvus-minio,状态均为 running。
其中会报错:
**原因是:**MinIO 官方在 2025 年 10 月主动从 Docker Hub 撤下了 minio/minio 镜像,这个仓库现在已经被归档,任何地方拉取都会返回 pull access denied
**修复方式:**修改docker-compose.yml MinIO 的镜像地址从 Docker Hub 换成官方仍在维护的 quay.io 即可
sed -i 's|minio/minio:|quay.io/minio/minio:|' /opt/milvus/docker-compose.yml
2.3 配置腾讯云安全组(关键步骤)
由于需要从本机访问腾讯云服务器上的 Milvus,必须在腾讯云安全组中放行以下端口:
| 端口 | 协议 | 用途 |
|---|---|---|
| 19530 | TCP | gRPC 数据端口(客户端连接) |
| 9091 | TCP | RESTful API / 健康检查 |
在腾讯云控制台 → 安全组 → 入站规则中,添加上述两条规则
2.4 验证服务可用性
# 在腾讯云服务器上验证 Milvus 健康状态
curl http://localhost:9091/healthz
# 返回 {"status":"ok"} 表示服务正常
三、结构与架构
3.1 Milvus 整体架构
Milvus 遵循数据平面与控制平面分解的原则,采用存储/计算分离的架构,整体分为四个层次,各层在可扩展性和灾难恢复方面相互独立。
各层职责简述:
- 接入层:由无状态 Proxy 组成,负责验证客户端请求、聚合中间结果并返回最终结果。由于 Milvus 采用大规模并行处理(MPP)架构,Proxy 会对中间结果进行聚合和后处理。
- 协调服务:集群的“大脑”,负责 DDL/DCL 管理、流服务管理、查询管理和历史数据管理,维护集群拓扑结构与一致性。
- 工作节点:包括流节点(碎片级一致性保证与故障恢复)、查询节点(加载历史数据并提供查询)和数据节点(离线压缩与索引构建)。
-
存储层:etcd 存储元数据快照(Schema、检查点),MinIO 存储索引文件和查询结果,WAL 存储保证数据持久性与一致性。
3.2 Standalone 模式组件关系
在 Standalone 部署模式下,Milvus 的所有组件 MixCoord、Proxy、QueryNode、DataNode、StreamingNode运行在同一个进程内,无需 Pod 间通信。
Docker Compose 部署包含三个容器:
四、基本使用(基于 pymilvus)
以下操作均在本机(客户端)通过 pymilvus 连接腾讯云服务器上的 Milvus 执行。
首先安装 Python SDK:
pip install pymilvus>=2.4.0
4.1 连接 Milvus
from pymilvus import MilvusClient
# 替换为你的腾讯云服务器公网 IP
MILVUS_URI = "http://<你的公网IP>:19530"
client = MilvusClient(uri=MILVUS_URI)
# 验证连接
print(client.list_collections())
Milvus 使用 19530 端口作为 gRPC 数据服务的唯一入口,所有数据操作(增删改查、索引创建、向量搜索)均通过此端口进行。
4.2 DDL:创建集合与索引
快速创建集合
# 快速创建一个名为 demo_collection 的集合
# 维度 768,使用默认主键 id 和向量字段 vector
if client.has_collection(collection_name="demo_collection"):
client.drop_collection(collection_name="demo_collection")
client.create_collection(
collection_name="demo_collection",
dimension=768,
)
此方式会自动启用 auto_id(主键自增)和 enable_dynamic_field(支持动态字段),适合快速原型验证。
自定义 Schema 与索引
from pymilvus import MilvusClient, DataType
# 创建 Schema
schema = client.create_schema(auto_id=False, enable_dynamic_field=True)
schema.add_field(field_name="id", datatype=DataType.INT64, is_primary=True)
schema.add_field(field_name="vector", datatype=DataType.FLOAT_VECTOR, dim=768)
schema.add_field(field_name="text", datatype=DataType.VARCHAR, max_length=512)
# 准备索引参数
index_params = client.prepare_index_params()
index_params.add_index(
field_name="vector",
index_type="HNSW",
metric_type="COSINE",
params={"M": 16, "efConstruction": 200},
)
# 创建集合并同时建立索引
client.create_collection(
collection_name="my_collection",
schema=schema,
index_params=index_params,
)
Milvus 支持多种索引类型,常用选项包括 FLAT(精确搜索)、IVF_FLAT、HNSW(基于图的近似搜索)等。
4.3 DML:数据插入、更新与删除
插入数据
import random
# 模拟生成向量数据
data = [
{
"id": i,
"vector": [random.uniform(-1, 1) for _ in range(768)],
"text": f"文档内容 {i}",
}
for i in range(100)
]
res = client.insert(collection_name="my_collection", data=data)
print(f"插入成功,数量:{res['insert_count']}")
Upsert(更新或插入)
# Upsert 操作:存在则更新,不存在则插入
upsert_data = [
{
"id": 0,
"vector": [random.uniform(-1, 1) for _ in range(768)],
"text": "更新后的文档内容 0",
}
]
res = client.upsert(collection_name="my_collection", data=upsert_data)
注意:更新数据时建议使用
upsert()而非delete()+insert(),因为upsert是原子操作。
删除数据
# 按主键删除
client.delete(collection_name="my_collection", ids=[0, 1, 2])
# 按过滤条件删除
client.delete(
collection_name="my_collection",
filter="id > 50",
)
4.4 DQL:查询与向量检索
标量过滤查询(Query)
# 查询 id 在 10 到 20 之间的记录
res = client.query(
collection_name="my_collection",
filter="id >= 10 and id <= 20",
output_fields=["id", "text"],
limit=10,
)
for row in res:
print(row)
向量相似度搜索(Search)
# 生成一个查询向量
query_vector = [random.uniform(-1, 1) for _ in range(768)]
search_res = client.search(
collection_name="my_collection",
data=[query_vector],
limit=5,
output_fields=["id", "text"],
search_params={
"metric_type": "COSINE",
"params": {"ef": 64},
},
)
for hits in search_res:
for hit in hits:
print(f"id={hit['id']}, distance={hit['distance']:.4f}, text={hit['entity']['text']}")
search 使用 ANN(近似最近邻)算法找到与查询向量最相似的向量;query 则基于标量条件进行过滤检索。
混合检索(Hybrid Search)
五、DQL 操作流程总结
六、常用运维命令
# 查看 Milvus 容器日志
sudo docker compose logs -f milvus-standalone
# 重启 Milvus 服务
sudo docker compose restart
# 停止服务(保留数据)
sudo docker compose down
# 停止服务并删除所有数据
sudo docker compose down -v
七、注意事项
- 端口安全:生产环境中建议将安全组来源限制为具体 IP,避免 19530 端口暴露在公网。
- 数据持久化:Docker Compose 默认使用 volumes 存储数据,执行
docker compose down -v会删除所有数据,操作前请确认。 - 资源要求:Milvus Standalone 建议至少分配 4 个 vCPU 和 8 GB 内存。
- 一致性级别:Milvus 支持 Strong、Bounded(默认)、Session、Eventually 四种一致性级别,可通过
search或query的consistency_level参数调节。 - 版本选择:本文示例使用 Milvus v2.5 稳定版,如使用其他版本请注意 docker-compose 文件中的镜像标签和端口配置差异。