官方文档地址
注意:让所有服务加入同一个网路中
一、索引类型与数据规模匹配原则
| 索引类型 | 适用数据规模 | 核心优势 | 典型场景 |
|---|---|---|---|
| IVF_FLAT | 中小规模(百万级) | 内存占用低,构建速度快 | 内存有限、需平衡速度与精度的场景 |
| IVF_PQ | 大规模(亿级) | 内存占用仅为IVF_FLAT的1/4 | 内存受限的大规模数据集 |
| HNSW | 中大规模(百万~十亿级) | 查询速度极快,支持高维数据 | 实时推荐、语义搜索等高并发场景 |
| HNSW_SQ | 大规模(十亿级) | 内存占用比HNSW低50% | 内存敏感的高维数据场景 |
二、milvus的搭建
1.docker-compose 文件
version: '3.5'
services:
etcd:
container_name: milvus-etcd
image: quay.io/coreos/etcd:v3.5.25
environment:
- ETCD_AUTO_COMPACTION_MODE=revision # 自动压缩模式:按revision(版本号)压缩历史数据
- ETCD_AUTO_COMPACTION_RETENTION=1000 # 保留最近1000个revision,超过则压缩
- ETCD_QUOTA_BACKEND_BYTES=4294967296 # 后端存储配额:4GB(4294967296字节)
- ETCD_SNAPSHOT_COUNT=50000 # 触发快照的键值对数量阈值:50000个操作后生成快照
volumes:
- ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/etcd:/etcd
command: etcd -advertise-client-urls=http://etcd:2379 -listen-client-urls http://0.0.0.0:2379 --data-dir /etcd
# 启动命令:设置客户端广告URL(容器内访问地址)、监听所有网卡、数据目录为/etcd
healthcheck: #
test: ["CMD", "etcdctl", "endpoint", "health"] # 检查命令:用etcdctl检测端点健康状态
interval: 30s # 检查间隔:30秒一次
timeout: 20s # 超时时间:20秒内无响应视为失败
retries: 3 # 重试次数:失败后重试3次
minio:
container_name: milvus-minio
image: minio/minio:RELEASE.2024-12-18T13-15-44Z
environment:
MINIO_ACCESS_KEY: minioadmin # MinIO访问密钥(默认管理员账号,生产环境需修改)
MINIO_SECRET_KEY: minioadmin # MinIO秘密密钥(默认管理员密码,生产环境需修改)
ports: )
- "9001:9001" # 9001端口:MinIO控制台Web界面
- "9000:9000" # 9000端口:S3 API接口(Milvus通过此端口读写数据)
volumes:
- ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/minio:/minio_data
command: minio server /minio_data --console-address ":9001"
# 启动命令:指定数据目录/minio_data,控制台地址为容器内9001端口
healthcheck: # 健康检查配置
test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
interval: 30s # 检查间隔30秒
timeout: 20s # 超时20秒
retries: 3 # 重试3次
standalone:
container_name: milvus-standalone
image: milvusdb/milvus:v2.6.7
command: ["milvus", "run", "standalone"] # 启动命令:以单机模式运行Milvus
security_opt: # 安全选项
- seccomp:unconfined # 禁用seccomp安全限制(兼容旧内核,避免权限问题)
environment:
ETCD_ENDPOINTS: etcd:2379 # 连接etcd服务(容器名etcd,端口2379)
MINIO_ADDRESS: minio:9000 # 连接MinIO服务(容器名minio,端口9000)
MQ_TYPE: woodpecker # 消息队列类型(Milvus内置的woodpecker,用于组件间通信)
volumes:
- ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/milvus:/var/lib/milvus
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:9091/healthz"]
# 检查命令:curl检测Milvus管理API健康状态(9091端口)
interval: 30s # 检查间隔30秒
start_period: 90s # 启动宽限期:容器启动后90秒内不检查(Milvus启动较慢)
timeout: 20s
retries: 3
ports:
- "19530:19530" # 19530端口:Milvus核心服务端口(客户端连接入口)
- "9091:9091" # 9091端口:Milvus管理API端口(健康检查、监控等)
depends_on: # 依赖关系:确保etcd和minio先启动
- "etcd"
- "minio"
networks: # 网络配置
default: # 默认网络
name: milvus # 自定义网络名称为milvus(服务间通过此网络通信,容器名即主机名)
---------------------------------------------------------------------------------
---------------------------------------------------------------------------------
version: '3.8'
services:
etcd:
container_name: milvus-etcd
image: quay.io/coreos/etcd:v3.5.25
restart: always
environment:
- ETCD_AUTO_COMPACTION_MODE=revision
- ETCD_AUTO_COMPACTION_RETENTION=1000
- ETCD_QUOTA_BACKEND_BYTES=4294967296
- ETCD_SNAPSHOT_COUNT=50000
volumes:
- ./volumes/etcd:/etcd
command: etcd -advertise-client-urls=http://etcd:2379 -listen-client-urls http://0.0.0.0:2379 --data-dir /etcd
healthcheck:
test: ["CMD", "etcdctl", "endpoint", "health"]
interval: 30s
timeout: 20s
retries: 3
standalone:
container_name: milvus-standalone
image: docker.io/milvusdb/milvus:2.6-20251225-d6863c59
command: ["milvus", "run", "standalone"]
restart: always
security_opt:
- seccomp:unconfined
environment:
ETCD_ENDPOINTS: etcd:2379
MQ_TYPE: woodpecker
volumes:
- ./volumes/milvus:/var/lib/milvus
- ./milvus.yaml:/milvus/configs/milvus.yaml
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:9091/healthz"]
interval: 30s
start_period: 90s
timeout: 20s
retries: 3
ports:
- "19530:19530"
- "9091:9091"
depends_on:
- "etcd"
networks:
default: # 文件里面的名字
external: true #使用已经创建的
name: milvus # 网络名
2.配置文件相关配置
minio:
address: 192.168.88.14
port: 19000 # Port of MinIO or S3 service.
accessKeyID: minioadmin
secretAccessKey: minioadmin123
useSSL: false # Switch value to control if to access the MinIO or S3 service through SSL.
ssl:
tlsCACert: /path/to/public.crt # path to your CACert file
bucketName: a-bucket # 桶名
rootPath: files # 桶里面存储的文件名
useIAM: false
cloudProvider: aws
gcpCredentialJSON:
iamEndpoint:
logLevel: fatal # Log level for aws sdk log. Supported level: off, fatal, error, warn, info, debug, trace
region: # Specify minio storage system location region
useVirtualHost: false # Whether use virtual host mode for bucket. WARNING: For Aliyun OSS and Tencent COS, this parameter is useless and is set to true by default
requestTimeoutMs: 30000 # minio timeout for request time in milliseconds
listObjectsMaxKeys: 50 #0单次默认1000请求
connectTimeout: 30s
ioTimeout: 120s
woodpecker:
meta:
type: etcd # The Type of the metadata provider. currently only support etcd.
prefix: woodpecker # The Prefix of the metadata provider. default is woodpecker.
client:
segmentAppend:
queueSize: 10000 # The size of the queue for pending messages to be sent of each log.
maxRetries: 3 # Maximum number of retries for segment append operations.
segmentRollingPolicy:
maxSize: 256M # Maximum size of a segment.
maxInterval: 10m # Maximum interval between two segments, default is 10 minutes.
maxBlocks: 1000 # Maximum number of blocks in a segment
auditor:
maxInterval: 10s # Maximum interval between two auditing operations, default is 10 seconds.
logstore:
segmentSyncPolicy:
maxInterval: 200ms # Maximum interval between two sync operations, default is 200 milliseconds.
maxIntervalForLocalStorage: 10ms # Maximum interval between two sync operations local storage backend, default is 10 milliseconds.
maxBytes: 256M # Maximum size of write buffer in bytes.
maxEntries: 10000 # Maximum entries number of write buffer.
maxFlushRetries: 5 # Maximum size of write buffer in bytes.
retryInterval: 1000ms # Maximum interval between two retries. default is 1000 milliseconds.
maxFlushSize: 2M # Maximum size of a fragment in bytes to flush.
maxFlushThreads: 32 # Maximum number of threads to flush data
segmentCompactionPolicy:
maxSize: 2M # The maximum size of the merged files.
maxParallelUploads: 2 # 最大上传线程数
maxParallelReads: 4 # 最大读取线程数
segmentReadPolicy:
maxBatchSize: 8M # 减小读取批次大小
maxFetchThreads: 2 # 线程并发数大小
retentionPolicy:
ttl: 72h # Time to live for truncated segments in seconds, default is 72h
storage:
type: minio # The Type of the storage provider. Valid values: [minio, local]
rootPath: default
3.容器角色解析
1. etcd 容器
-
功能定位:分布式协调与元数据存储
-
核心作用:
-
存储 Milvus 的元数据(如集合信息、索引配置、分片状态)
-
提供集群协调能力(节点发现、故障恢复)
-
通过 Raft 协议保障数据一致性
-
2. minio 容器
-
功能定位:对象存储引擎
-
核心作用:
-
持久化存储原始向量数据 和索引文件
-
提供 S3 兼容的 API 接口
-
支持高吞吐的读写操作
-
3. milvus-standalone 容器
-
功能定位:向量计算核心
-
核心作用:
-
执行向量编码(Embedding 生成)
-
构建和维护向量索引(如 IVF、HNSW)
-
处理相似性搜索请求
-
-
依赖关系:
-
通过
ETCD_ENDPOINTS读取元数据 -
通过
MINIO_ADDRESS加载数据文件
-
4.数据文件说明
- files/wp :"写入阶段的日志/segment"(WAL 层)
- files/insert_log :"已经持久化的正式数据 segment"
- files/index_files :是索引文件zhihu.com/p/24268777990
三者共同组成你在 Milvus 里的完整持久化数据。
三、attu可视化工具搭建
1.docker-compose文件
version: '3.8'
services:
attu:
image: zilliz/attu:latest
container_name: attu
restart: always # 容器异常退出时自动重启
ports:
- "8000:3000" # 主机8000端口映射到容器3000端口
environment:
# 核心配置:替换为你的Milvus地址(本地Milvus填172.17.0.1:19530,远程填实际IP)
MILVUS_URL: "192.168.88.14:19530"
# 可选配置:若Milvus开启认证,添加以下两行
# MILVUS_USERNAME: "root"
networks:
default:
external: true
name: milvus