


如果想要更好使用 Milvus、充分发挥其能力?修改 Milvus 配置来适配自己的业务场景绝对是个不错的选择。
本文以当前社区最新的 Milvus 2.2.2 版本为基础,系统介绍 Milvus 的配置分类情况以及各大部署模式下如何对不同配置进行修改。读完本文,用户可以轻松搞懂 Milvus 配置!

目前按照功能不同,Milvus 的配置分为两大类:Milvus 内核配置和 Milvus 部署配置。
Milvus 内核配置是指包含在 milvus.yaml 里的各种配置,即 Milvus 内核组件行为的参数。比如平时经常修改的数据删除后的垃圾回收时间——dataCoord.gc.dropTolerance,Milvus 里 segment 的存储上限——dataCoord.segment.maxSize,以及 Milvus 的日志等级——log.level。这些参数都是用来调控 Milvus 内核的行为,所以都集中在 milvus.yaml 这个文件里。
当 Milvus 容器启动以后,你通过命令行进入到容器内部,在 /milvus/configs/ 这个路径下都可以找到 milvus.yaml 这个文件。平时想要了解 milvus.yaml 里的参数,可以在 github 的 milvus 项目里直接查看:
https://github.com/milvus-io/milvus/blob/master/configs/milvus.yaml
milvus.yaml 大致如图:

顾名思义,Milvus 部署配置是与 Milvus 部署启动相关的配置参数,主要包含在 docker-compose.yml 以及 values.yaml 里面。大家平时经常用到的组件的资源配置、副本数控制、以及 Milvus 启动时依赖的第三方组件的配置都属于这一类。
docker-compose.yml 和 values.yaml 在 github 的 milvus 项目和 milvus-helm 项目里也可以直接下载查看:
https://github.com/milvus-io/milvus/blob/master/deployments/docker/standalone/docker-compose.yml
https://github.com/milvus-io/milvus-helm/blob/master/charts/milvus/values.yaml
两个文件大致如图:



Milvus 支持单机部署和分布式部署这两种方式。对于单机部署,可以采用 helm、k8s operator、docker-compose 的部署模式,对于集群部署,一般采用 helm 和 k8s operator 两种部署模式。这一节,我们重点来讨论 Milvus 在 docker-compose、helm、k8s operator 这三大部署模式下,如何分别修改内核配置以及部署配置。
先上结论,下面这张表格简明扼要地描述了在不同部署模式下如何对各类类别配置做修改。
部署模式\配置类别 | 内核配置 | 部署配置 |
|---|---|---|
docker-compose | 修改 milvus.yaml 文件中的内核配置;在 docker-compose.yml 中将本地修改过 milvus.yaml 挂载映射到 milvus 容器内部的配置文件路径 /milvus/configs/milvus.yaml 中。重启 Milvus 服务。 | 修改 docker-compose.yml 中的相关部署配置,并重启 milvus 服务。 |
helm | 在 values.yaml 中的 user.yaml 模块里添加相关内核配置。利用 helm upgrade <release-name> milvus/milvus -f values.yaml 命令使配置生效。 | 方式一:修改 values.yaml 中的对应部署配置,然后利用 helm upgrade <release-name> milvus/milvus -f values.yaml 命令使配置生效。方式二:使用 helm --set 直接在命令行中修改相应的部署配置。 |
operator | 利用社区的配置文件模版milvus_cluster_default.yaml,在其中的spec.config 模块下添加相关内核配置。利用 kubectl apply -f milvuscluster_default.yaml 命令使配置生效。 | 对于Milvus 自身组件的部署配置,在社区配置模版 milvus_cluster_default.yaml 中的spec.components 下添加对应组件的配置,并利用 kubectl apply -f milvuscluster_default.yaml 命令使配置生效。对于第三方依赖组件的部署配置,在社区配置模版 milvus_cluster_default.yaml 中的spec.dependencies 下添加对应组件的配置,并利用 kubectl apply -f milvuscluster_default.yaml 命令使配置生效。 |
修改 docker-compose.yml 中的相关部署配置,并重启 milvus 服务。helm
operator
看到这里,一些对 Milvus 熟悉的老朋友,大概已经清楚在不同部署模式下如何对不同类别的配置做修改了。
如果你对 Milvus 还不是很熟悉,别担心,接下来的文章会针对上面表格中的 6 种场景详细展开,补充更多的细节。
对于如何修改内核配置,社区之前已经有一篇文章介绍得很详细了,详情参见《技术分享|如何对 Milvus 2.0 进行参数配置》 [1]。
总结下来有如下几个关键步骤:
修改部署配置则较为便利,直接修改 docker-compose.yml 中的相关部署配置,然后使用 docker-compose up -d 命令重启 milvus 服务即可。
从 helm chart 的 4.0.0 版本以后(对应 Milvus 是 2.2.1 版本以后),Milvus 的内核配置只能统一在 values.yaml 的 user.yaml 下面进行修改,不能像以前使用 --set 的方式在命令行中进行配置。举个例子,4.0.0 版本以前,你可以通过 --set dataCoordinator.segment.maxSize=1024 的方式来修改 segment 的 size 这个 Milvus 内核配置。但是在 4.0.0 以后,只能通过下面的方式来修改这个内核配置(注意下面配置的缩进,与 milvus.yaml 保持同样的结构):
extraConfigFiles:
user.yaml: |+
dataCoord:
segment:
maxSize: 1024
修改完 values.yaml 以后,执行 helm upgrademilvus/milvus -f values.yaml 使配置生效。
使用 helm 部署 Milvus 时,有 2 种方式可以对 Milvus 的部署配置进行修改。
方式一:修改 values.yaml
values.yaml 里面涵盖了所有 Milvus 部署相关的配置,所以在 values.yaml 里面修改对应配置参数,然后执行 helm upgrademilvus/milvus -f values.yaml 命令即可使配置生效。
简单举个例子,比如我们想给 Milvus 集群配置 4 个 8C16G 的 queryNode,可以在 values.yaml 里面这样配置:
queryNode:
enabled: true
replicas: 4
resources:
limits:
cpu: 8
memory: 16Gi
requests:
cpu: 8
memory: 16Gi
细心的朋友估计已经发现了,不管是 Milvus 的内核配置还是部署配置,都是可以通过修改 values.yaml 来实现,所以这是使用 helm 部署 Milvus 时的一种万能配置方式。
方式二:使用 --set 命令
熟悉 helm 的用户应该对这种方式并不陌生,比如,如果想要将 Milvus 集群中的 queryNode 的个数配置为 4 个,可以使用这样一行命令:$ helm upgrade --install --set queryNode.replicas=4 my-release milvus/milvus
3. Operator
使用 operator 部署 Milvus 时,修改 Milvus 配置的方式比较统一,都是修改社区提供的配置文件模版 milvus_cluster_default.yaml,只是内核配置和部署配置修改的模块不同。该文件在 github 的 milvus-operator 项目里可以直接下载查看:https://github.com/milvus-io/milvus-operator/blob/main/config/samples/milvus_cluster_default.yaml
配置文件模版大致如下:

milvus_cluster_default.yaml 里的 spec.config 模块就是 operator 专门为 Milvus 的内核配置预留的。
比如,把 Milvus 内核配置里的 dataCoord.gc.dropTolerance 从默认的一天改为一个小时,可以在 milvus_cluster_default.yaml 里面这样修改:
apiVersion: milvus.io/v1beta1
kind: Milvus
metadata:
name: milvus-test
labels:
app: milvus
spec:
mode: cluster
dependencies: {}
components: {}
config:
dataCoord:
gc:
dropTolerance: 3600
修改完之后,再去命令行中执行 kubectl apply -f milvus_cluster_default.yaml,即可使配置生效。
使用 operator 对 Milvus 做部署配置时,Milvus 自身组件的配置和 Milvus 依赖的第三方组件的配置是放在不同模块下的。自身组件的配置放在 spec.components 模块下,第三方组件的配置放在 spec.dependencies 模块下。比如,如果想在 Milvus 集群里配置 4 个 8C16G queryNode,可以在 milvus_cluster_default.yaml 中这样修改:
apiVersion: milvus.io/v1beta1
kind: Milvus
metadata:
name: milvus-test
labels:
app: milvus
spec:
mode: cluster
dependencies: {}
config: {}
components:
queryNode:
replicas: 4
resources:
limits:
cpu: 8
memory: 16Gi
spec:
...
dependencies:
etcd:
inCluster:
values:
autoCompactionMode: revision
autoCompactionRetention: "1000"
extraEnvVars:
- name: ETCD_QUOTA_BACKEND_BYTES
value: "4294967296"
- name: ETCD_HEARTBEAT_INTERVAL
value: "500"
- name: ETCD_ELECTION_TIMEOUT
value: "25000"
- name: ETCD_SNAPSHOT_COUNT
value: "10000"
- name: ETCD_ENABLE_PPROF
value: "true"
persistence:
accessMode: ReadWriteOnce
enabled: true
size: 30Gi #SSD Required
storageClass:
replicaCount: 3
resources:
limits:
cpu: 2
memory: 4Gi
requests:
cpu: 2
memory: 4Gi
...
同样地,修改完后,需要去命令行中执行 kubectl apply -f milvuscluster_default.yaml 使配置生效。
关于 operator 这块的配置,最后再给大家降低一下难度,我们放两个已经修改好的比较完整配置文件模版,供大家参考使用:
https://github.com/JackLCL/milvus-resource/blob/main/operator-config-example/pulsar-cluster-operator.yaml
https://github.com/JackLCL/milvus-resource/blob/main/operator-config-example/kafka-cluster-operator.yaml

至此,关于 Milvus 配置的介绍基本结束,文章篇幅比较长,大家可以根据自己的需求跳转到相应章节参考学习。
当然,我们还给看到最后的小伙伴们准备了两个小福利:
Milvus 社区目前最新的资源计算工具 sizing tool [2] 可以帮你估算在不同数据量下,Milvus 的自身组件以及第三方依赖组件分别需要多少资源。此外,还可以自动生成 helm chart 和 Milvus Operator 的配置文件。(以后再也不用担心给 Milvus 配置资源了~)
根据前文的介绍,对于 Milvus 内核配置的修改,都会导致 Milvus 服务重启。有什么方式可以实现不用重启的配置更新么?问就是有!
在 Milvus 2.2.0 版本以后,已经可以对 Milvus 组件日志等级的修改实现热更新了。在保证 Milvus 组件的 9091 端口可以访问的前提下,假设 Milvus 的 proxy 组件的 ip 为:192.168.48.12。
# 获取 proxy 当前的日志级别
$ curl -X GET 192.168.48.12:9091/log/level
# 修改日志级别为 error
$ curl -X PUT 192.168.48.12:9091/log/level -d level=error
目前对 Milvus 里面的其他内核配置实现热更新的功能正在开发中,很快就会和大家见面,敬请期待!
参考资料
[1] https://mp.weixin.qq.com/s/Ln_69tj0IQEq7-4lfzcesw
[2] https://milvus.io/tools/sizing/