configs/milvus.yaml
Rama master · réplica de lectura del repositorio original.
# Licensed to the LF AI & Data foundation under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# Related configuration of etcd, used to store Milvus metadata & service discovery.
etcd:
# Endpoints used to access etcd service. You can change this parameter as the endpoints of your own etcd cluster.
# Environment variable: ETCD_ENDPOINTS
# etcd preferentially acquires valid address from environment variable ETCD_ENDPOINTS when Milvus is started.
endpoints: localhost:2379
# Root prefix of the key to where Milvus stores data in etcd.
# It is recommended to change this parameter before starting Milvus for the first time.
# To share an etcd instance among multiple Milvus instances, consider changing this to a different value for each Milvus instance before you start them.
# Set an easy-to-identify root path for Milvus if etcd service already exists.
# Changing this for an already running Milvus instance may result in failures to read legacy data.
rootPath: by-dev
# Sub-prefix of the key to where Milvus stores metadata-related information in etcd.
# Caution: Changing this parameter after using Milvus for a period of time will affect your access to old data.
# It is recommended to change this parameter before starting Milvus for the first time.
metaSubPath: meta
# Sub-prefix of the key to where Milvus stores timestamps in etcd.
# Caution: Changing this parameter after using Milvus for a period of time will affect your access to old data.
# It is recommended not to change this parameter if there is no specific reason.
kvSubPath: kv
log:
level: info # Only supports debug, info, warn, error, panic, or fatal. Default 'info'.
# path is one of:
# - "default" as os.Stderr,
# - "stderr" as os.Stderr,
# - "stdout" as os.Stdout,
# - file path to append server logs to.
# please adjust in embedded Milvus: /tmp/milvus/logs/etcd.log
path: stdout
ssl:
enabled: false # Whether to support ETCD secure connection mode
tlsCert: /path/to/etcd-client.pem # path to your cert file
tlsKey: /path/to/etcd-client-key.pem # path to your key file
tlsCACert: /path/to/ca.pem # path to your CACert file
# TLS min version
# Optional values: 1.0, 1.1, 1.2, 1.3。
# We recommend using version 1.2 and above.
tlsMinVersion: 1.3
requestTimeout: 10000 # Etcd operation timeout in milliseconds
dialTimeout: 5000 # Timeout in milliseconds for establishing the initial connection to etcd endpoints. Increase it for environments where transient network delays are expected during node scale-out.
dialKeepAliveTime: 3000 # Interval in milliseconds for gRPC dial keepalive pings sent to etcd endpoints.
dialKeepAliveTimeout: 2000 # Timeout in milliseconds waiting for keepalive responses before marking the connection as unhealthy.
use:
embed: false # Whether to enable embedded Etcd (an in-process EtcdServer).
data:
dir: default.etcd # Embedded Etcd only. please adjust in embedded Milvus: /tmp/milvus/etcdData/
auth:
enabled: true # Whether to enable authentication
userName: etcdadmin # username for etcd authentication
password: etcdadmin # password for etcd authentication
metastore:
type: etcd # Default value: etcd, Valid values: [etcd, tikv]
maxEtcdTxnNum: 64 # maximum number of operations in a single etcd transaction
# Related configuration of tikv, used to store Milvus metadata.
# Notice that when TiKV is enabled for metastore, you still need to have etcd for service discovery.
# TiKV is a good option when the metadata size requires better horizontal scalability.
tikv:
endpoints: 127.0.0.1:2389 # Note that the default pd port of tikv is 2379, which conflicts with etcd.
rootPath: by-dev # The root path where data is stored in tikv
metaSubPath: meta # metaRootPath = rootPath + '/' + metaSubPath
kvSubPath: kv # kvRootPath = rootPath + '/' + kvSubPath
requestTimeout: 10000 # ms, tikv request timeout
snapshotScanSize: 256 # batch size of tikv snapshot scan
ssl:
enabled: false # Whether to support TiKV secure connection mode
tlsCert: # path to your cert file
tlsKey: # path to your key file
tlsCACert: # path to your CACert file
localStorage:
# Local path to where vector data are stored during a search or a query to avoid repetitve access to MinIO or S3 service.
# Must be an absolute filesystem path. Milvus refuses to start if this value is relative or empty.
# Migration of data written using a relative path in older versions is not supported.
# Caution: Changing this parameter after using Milvus for a period of time will affect your access to old data.
# It is recommended to change this parameter before starting Milvus for the first time.
path: /var/lib/milvus/data/
# Related configuration of MinIO/S3/GCS or any other service supports S3 API, which is responsible for data persistence for Milvus.
# We refer to the storage service as MinIO/S3 in the following description for simplicity.
minio:
# IP address of MinIO or S3 service.
# Environment variable: MINIO_ADDRESS
# minio.address and minio.port together generate the valid access to MinIO or S3 service.
# MinIO preferentially acquires the valid IP address from the environment variable MINIO_ADDRESS when Milvus is started.
# Default value applies when MinIO or S3 is running on the same network with Milvus.
address: localhost:9000
port: 9000 # Port of MinIO or S3 service.
# Access key ID that MinIO or S3 issues to user for authorized access.
# Environment variable: MINIO_ACCESS_KEY_ID or minio.accessKeyID
# minio.accessKeyID and minio.secretAccessKey together are used for identity authentication to access the MinIO or S3 service.
# This configuration must be set identical to the environment variable MINIO_ACCESS_KEY_ID, which is necessary for starting MinIO or S3.
# The default value applies to MinIO or S3 service that started with the default docker-compose.yml file.
accessKeyID: minioadmin
# Secret key used to encrypt the signature string and verify the signature string on server. It must be kept strictly confidential and accessible only to the MinIO or S3 server and users.
# Environment variable: MINIO_SECRET_ACCESS_KEY or minio.secretAccessKey
# minio.accessKeyID and minio.secretAccessKey together are used for identity authentication to access the MinIO or S3 service.
# This configuration must be set identical to the environment variable MINIO_SECRET_ACCESS_KEY, which is necessary for starting MinIO or S3.
# The default value applies to MinIO or S3 service that started with the default docker-compose.yml file.
secretAccessKey: minioadmin
useSSL: false # Switch value to control if to access the MinIO or S3 service through SSL.
ssl:
tlsCACert: # path to your CACert file
# TLS minimum version for MinIO/S3 SSL connections.
# Optional values: "default", "1.0", "1.1", "1.2", "1.3".
# When set to "default", the SDK/runtime default is used (typically TLS 1.2).
# We recommend using version 1.2 and above.
tlsMinVersion: default
useCRC32C: false # Whether to use CRC32C checksum for data integrity validation on MinIO/S3 PutObject requests.
# Name of the bucket where Milvus stores data in MinIO or S3.
# Milvus 2.0.0 does not support storing data in multiple buckets.
# Bucket with this name will be created if it does not exist. If the bucket already exists and is accessible, it will be used directly. Otherwise, there will be an error.
# To share an MinIO instance among multiple Milvus instances, consider changing this to a different value for each Milvus instance before you start them. For details, see Operation FAQs.
# The data will be stored in the local Docker if Docker is used to start the MinIO service locally. Ensure that there is sufficient storage space.
# A bucket name is globally unique in one MinIO or S3 instance.
bucketName: a-bucket
# Root prefix of the key to where Milvus stores data in MinIO or S3.
# It is recommended to change this parameter before starting Milvus for the first time.
# To share an MinIO instance among multiple Milvus instances, consider changing this to a different value for each Milvus instance before you start them. For details, see Operation FAQs.
# Set an easy-to-identify root key prefix for Milvus if etcd service already exists.
# Changing this for an already running Milvus instance may result in failures to read legacy data.
rootPath: files
# Whether to useIAM role to access S3/GCS instead of access/secret keys
# For more information, refer to
# aws: https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use.html
# gcp: https://cloud.google.com/storage/docs/access-control/iam
# aliyun (ack): https://www.alibabacloud.com/help/en/container-service-for-kubernetes/latest/use-rrsa-to-enforce-access-control
# aliyun (ecs): https://www.alibabacloud.com/help/en/elastic-compute-service/latest/attach-an-instance-ram-role
useIAM: false
# Cloud Provider of S3. Supports: "aws", "gcp", "aliyun".
# Cloud Provider of Google Cloud Storage. Supports: "gcpnative".
# You can use "aws" for other cloud provider supports S3 API with signature v4, e.g.: minio
# You can use "gcp" for other cloud provider supports S3 API with signature v2
# You can use "aliyun" for other cloud provider uses virtual host style bucket
# You can use "gcpnative" for the Google Cloud Platform provider. Uses service account credentials
# for authentication.
# When useIAM enabled, only "aws", "gcp", "aliyun" is supported for now
cloudProvider: aws
# The JSON content contains the gcs service account credentials.
# Used only for the "gcpnative" cloud provider.
gcpCredentialJSON:
# Custom endpoint for fetch IAM role credentials. when useIAM is true & cloudProvider is "aws".
# Leave it empty if you want to use AWS default endpoint
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: 10000 # minio timeout for request time in milliseconds
crt_queue_sizes: 125 # S3 CRT queue sizes, converted to the SDK throughput target as value * 0.4 Gbps. Requires restart.
# The maximum number of objects requested per batch in minio ListObjects rpc,
# 0 means using oss client by default, decrease these configuration if ListObjects timeout
listObjectsMaxKeys: 0
multipartCopyThreshold: 1073741824 # Object size threshold in bytes for switching from a single CopyObject request to multipart copy. Larger objects use multipart copy. Default is 1 GiB (1073741824 bytes). Must be a positive integer; invalid values fall back to the default. Single CopyObject requests remain capped at 5 GiB regardless of this threshold. Changes apply to subsequent copies, not copies already in progress. Does not apply to GCP or Azure.
# Milvus supports four message queues (MQ): rocksmq (based on RocksDB), Pulsar, Kafka, and Woodpecker.
# You can change the MQ by setting the mq.type field.
# If the mq.type field is not set, the following priority is used when multiple MQs are configured in this file:
# 1. standalone (local) mode: rocksmq (default) > Pulsar > Kafka > Woodpecker
# 2. cluster mode: Pulsar (default) > Kafka (rocksmq is unsupported in cluster mode) > Woodpecker
# Note: These MQ priorities are compatible with existing instances. For new instances, it is recommended to explicitly use Woodpecker to achieve better performance, operational simplicity, and cost efficiency.
mq:
# Default value: "default"
# Valid values: [default, pulsar, kafka, rocksmq, woodpecker]
type: default
enablePursuitMode: true # Default value: "true"
pursuitLag: 10 # time tick lag threshold to enter pursuit mode, in seconds
pursuitBufferSize: 8388608 # pursuit mode buffer size in bytes
pursuitBufferTime: 60 # pursuit mode buffer time in seconds
mqBufSize: 16 # MQ client consumer buffer length
dispatcher:
mergeCheckInterval: 0.1 # the interval time(in seconds) for dispatcher to check whether to merge
targetBufSize: 16 # the lenth of channel buffer for targe
maxTolerantLag: 3 # Default value: "3", the timeout(in seconds) that target sends msgPack
# Related configuration of woodpecker, used to manage Milvus logs of recent mutation operations, output streaming log, and provide embedded log sequential read and write.
woodpecker:
meta:
type: etcd # The Type of the metadata provider. currently only support etcd.
prefix: woodpecker # The Prefix of the metadata provider, prepended with etcd.rootPath. default is woodpecker. Only takes effect on an etcd with no pre-existing woodpecker metadata under the legacy root 'woodpecker/' prefix; if legacy metadata is detected, the legacy prefix is reused for backward compatibility.
# The target maximum size of each Woodpecker WAL record produced by Milvus. Unit: Byte.
# Woodpecker does not enforce a corresponding single-entry hard limit. Milvus uses this value as the WAL-layer chunk threshold and splits larger payloads into multiple records.
# Values below 256 KiB are clamped to 256 KiB. Invalid or out-of-range values fall back to the default 10 MiB limit.
maxMessageSize: 10485760
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.
maxBatchEntries: 1000 # Client-side group commit: max consecutive appends coalesced into one AddEntries request. Opportunistic (only batches already-queued ops, adds no latency at low load). Set to 1 to disable batching.
maxBatchBytes: 2000000 # Max total payload (bytes) of a coalesced batch, default 2MB. A batch closes once it reaches maxBatchEntries or its payload reaches maxBatchBytes; the first entry is always taken, so a batch may exceed the byte cap by one entry. Set to 0 to remove the byte limit (bounded by maxBatchEntries only). Ignored when maxBatchEntries <= 1.
sendTimeout: 2s # Timeout for opening an append stream and receiving buffered responses from one replica in service mode; excludes durability acknowledgement and total append latency. Requires restart. Non-positive duration values retain Woodpecker defaults.
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.
# How long this client waits for one logstore node to answer one compaction request.
# It travels to the node as the gRPC deadline; the node applies its own ceiling
# (woodpecker.logstore.segmentCompactionPolicy.timeout) on top and the shorter of the two applies.
# Raise it together with that ceiling: on its own it has no effect while it stays above the node's.
compactionAttemptTimeout: 330s
# How long one auditor cycle keeps starting compactions. It is a start deadline, not a cap on the
# cycle: once spent no further segment is begun, but one already running finishes, so a cycle can
# overrun this by one segment. Raise it to trade the timeliness of the auditor's other passes
# (truncate state, snapshot publication, orphan sweep) for compaction throughput.
compactionPassBudget: 60s
directRead:
enabled: true # Whether the Woodpecker client reads sealed segments directly from object storage in service storage mode.
maxBatchSize: 16M # Maximum batch size for direct reads from object storage in service storage mode.
maxFetchThreads: 4 # Maximum number of concurrent fetch threads used by Woodpecker direct reads from object storage.
quorum:
selectNodesTimeout: 2s # Timeout for one SelectNodes call to one seed in service mode; expiry allows trying the next seed. Requires restart. Non-positive duration values retain Woodpecker defaults.
# Quorum Buffer Pools: Define groups of nodes for different purposes
# Example configuration below:
# - name: region1 # Name of the region pool
# seeds: [n1,n2,n3] # List of seed node addresses for this pool
# - name: region2 # Name of the region pool
# seeds: [n4,n5,n6] # List of seed node addresses for this pool
quorumBufferPools:
quorumSelectStrategy:
affinityMode: soft # Affinity mode for node selection rules. Valid values: [soft, hard]
replicas: 3 # Number of replicas in the quorum ensemble. Valid values: [3, 5]
# Node selection strategy
# Valid values: [random, single-az-single-rg, single-az-multi-rg, multi-az-single-rg, multi-az-multi-rg, cross-region, custom]
# random: nodes are selected randomly
# single-az-single-rg: All nodes in same availability zone and resource group
# single-az-multi-rg: Same availability zone, multiple resource groups
# multi-az-single-rg: Multiple availability zones, single resource group
# multi-az-multi-rg: Multiple availability zones and resource groups
# cross-region: Nodes across different regions for maximum durability
# custom: Use custom expressions defined below
strategy: random
# Custom expressions for node selection (only used when strategy is 'custom')
# Example configuration below:
# - name: replica-1
# region: "default-region-pool"
# az: "az-1"
# resourceGroup: "rg.*"
# - name: replica-2
# region: "default-region-pool"
# az: "az-2"
# resourceGroup: "rg.*"
# - name: replica-3
# region: "default-region-pool"
# az: "az.*"
# resourceGroup: "rg.*"
customPlacement:
grpc:
dialTimeout: 1s # Minimum connection attempt timeout for the Woodpecker client dialing logstores. Independent of Milvus internal gRPC clients. Requires restart. Non-positive duration values retain Woodpecker defaults.
connectBackoff:
baseDelay: 100ms # Initial delay between failed connection attempts to a Woodpecker logstore; not an RPC retry delay. Requires restart. Non-positive duration values retain Woodpecker defaults.
multiplier: 1.6 # Growth multiplier for connection backoff; must be finite and at least 1. Requires restart.
jitter: 0.2 # Connection backoff jitter fraction, between 0 and 1. Requires restart.
maxDelay: 3s # Maximum connection backoff delay; must be at least baseDelay. Invalid backoff settings retain Woodpecker defaults as a group. Requires restart. Non-positive duration values retain Woodpecker defaults.
segmentRead:
activeTimeout: 3s # Timeout per replica read of an Active segment in service mode. A timed-out pass may retry with settledTimeout. Must not exceed settledTimeout; invalid pairs retain Woodpecker defaults. Requires restart. Non-positive duration values retain Woodpecker defaults.
settledTimeout: 20s # Timeout per replica read for other segments and embedded storage, and the longer retry pass for Active segments. Does not bound direct object-storage reads. Requires restart. Non-positive duration values retain Woodpecker defaults.
skipRangeRefreshInterval: 10s # Minimum interval between background refreshes of operator-declared skip ranges when stalled readers ask. Reads use the cached copy; reader report ticks also affect propagation. Not a maximum cache age. Requires restart. Values below 1s retain Woodpecker defaults; whole seconds are used.
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.
maxIntervalForService: 10ms # Maximum interval between two sync operations for woodpecker service-storage mode (woodpecker.storage.type=service), default is 10 milliseconds. Only takes effect on standalone woodpecker log-store servers (staged-storage writer); it is not consumed by milvus embedded mode. A larger interval coalesces more entries per flush to raise QPS under small-batch high-concurrency writes, at the cost of up to that much extra durability latency. Note this raises the interval from woodpecker's built-in 1ms default, changing the sync cadence for existing service-mode deployments.
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: 4 # The maximum number of parallel upload threads for compaction.
maxParallelReads: 8 # The maximum number of parallel read threads for compaction.
# Ceiling on how long one compaction may run on a logstore node. This is the node's guardrail, not a
# per-tenant policy: one node serves many logs from this single value, and it exists so no one
# request can hold a node's compaction resources indefinitely.
timeout: 300s
# Memory a logstore node will reserve for the compactions it runs at once, across every log it
# serves. Absolute rather than a share of the pod: useful compaction concurrency saturates on
# object-storage bandwidth long before memory, so a larger node does not need a larger allowance.
# Raise it alongside maxSize or maxParallelUploads, which raise what one compaction costs.
# Compactions beyond it are refused, not queued, and retried on a later auditor cycle.
maxInflightMemory: 1000000000
# Stop taking on new compactions once a logstore node's memory usage passes this fraction of its
# limit, whatever is using it -- maxInflightMemory above only accounts for compaction. Applies only
# where a container memory limit can be read; on bare metal, with no limit set, or if detection
# fails, it is skipped rather than measured against host memory.
memoryHighWatermark: 0.7
syncScheduler:
# Workers in a logstore node's shared flush pool, as a plain count. Each one blocks in fdatasync
# while a flush is in flight, so this bounds concurrent syncs, not CPU usage. Tune it from the
# volume's IOPS budget: workers ~= target IOPS x fsync latency. Past the point where the device
# saturates, more workers buy queueing rather than throughput.
maxWorkers: 32
segmentReadPolicy:
maxBatchSize: 16M # Maximum size of a batch in bytes.
maxFetchThreads: 32 # Maximum number of threads to fetch data.
retentionPolicy:
ttl: 72h # Time to live for truncated segments in seconds, default is 72h
fencePolicy:
# Enable conditional write for embedded mode, default is auto, which will automatically detect whether the storage supports conditional write.
# Valid values: [auto, enable, disable]
conditionWrite: auto
storage:
type: minio # The Type of the storage provider. Valid values: [minio, local, service]
rootPath: default # The root path of the storage provider. If set to 'default', uses localStorage.path as base directory and creates a woodpecker subdirectory. Otherwise, specifies a custom woodpecker data storage directory.
# Related configuration of pulsar, used to manage Milvus logs of recent mutation operations, output streaming log, and provide log publish-subscribe services.
pulsar:
# IP address of Pulsar service.
# Environment variable: PULSAR_ADDRESS
# pulsar.address and pulsar.port together generate the valid access to Pulsar.
# Pulsar preferentially acquires the valid IP address from the environment variable PULSAR_ADDRESS when Milvus is started.
# Default value applies when Pulsar is running on the same network with Milvus.
address: localhost
port: 6650 # Port of Pulsar service.
# Web address of the Pulsar admin REST API, used to clean up subscriptions. It must be a full url with scheme, e.g. http://pulsar-web:8080.
# Empty by default, in which case http://<host of pulsar.address>:<pulsar.webport> is used. Set it only if the admin API is not reachable there, e.g. behind a proxy or over https.
webaddress:
webport: 80 # Web port of of Pulsar service. If you connect direcly without proxy, should use 8080.
# The maximum size of each message in Pulsar. Unit: Byte.
# By default, Pulsar can transmit at most 2MB of data in a single message. When streaming.splitChunkSN is enabled, the StreamingNode WAL layer splits larger payloads into multiple records that fit this limit.
# Values below 256 KiB are clamped to 256 KiB. The Pulsar broker/proxy limit must be no smaller than this effective value; otherwise Pulsar can still reject records that Milvus considers valid. Invalid or out-of-range values fall back to the default 2 MiB limit.
maxMessageSize: 2097152
# The headroom reserved out of the active WAL backend's message-size limit (pulsar.maxMessageSize, kafka.producer.message.max.bytes, or woodpecker.maxMessageSize) for message overhead outside the plaintext body. Unit: Byte.
# A produced record carries a streaming message header, properties added before WAL append, cipher metadata/expansion, and broker message metadata on top of the body, so the producer budgets only the active WAL backend's own message-size limit minus this value for the body itself.
# Must be a 32-bit integer of at least 1024 bytes and smaller than the active WAL backend's message-size limit: a smaller reserve cannot absorb one record's envelope, so a full-budget chunk would still be rejected by the backend. Invalid or out-of-range values fall back to the default reserve size.
messageReserveSize: 65536
# Pulsar can be provisioned for specific tenants with appropriate capacity allocated to the tenant.
# To share a Pulsar instance among multiple Milvus instances, you can change this to an Pulsar tenant rather than the default one for each Milvus instance before you start them. However, if you do not want Pulsar multi-tenancy, you are advised to change msgChannel.chanNamePrefix.cluster to the different value.
tenant: public
namespace: default # A Pulsar namespace is the administrative unit nomenclature within a tenant.
requestTimeout: 60 # pulsar client global request timeout in seconds
enableClientMetrics: true # Whether to register pulsar client metrics into milvus metrics path.
# Perform a backlog cleanup every time the data of given bytes is written.
# Because milvus use puslar reader to read the message, so if there's no pulsar subscriber when milvus running.
# If the pulsar cluster open the backlog protection (backlogQuotaDefaultLimitBytes), the backlog exceed will reported to fail the write operation
# set this option to non-zero will create a subscription seek to latest position to clear the pulsar backlog.
# If these options is non-zero, the wal data in pulsar is fully protected by retention policy,
# so admin of pulsar should give enough retention time to avoid the wal message lost.
# If these options is zero, no subscription will be created, so pulsar cluster must close the backlog protection, otherwise the milvus can not recovered if backlog exceed.
# If this option is zero or negative, it will be ignored and the default value (100m) will be used.
backlogAutoClearBytes: 100m
# The access mode of the pulsar producer that a streaming node creates for a wal topic, shared or exclusive.
# exclusive: the producer creation fails while another producer is connected to the topic, and the streaming node retries it.
# shared: multiple producers can write to the topic at the same time.
# exclusive access is enforced by pulsar broker 2.8.0 or later.
producerAccessMode: exclusive
# The max time that a streaming node retries creating the pulsar producer when it opens a wal, 1m by default.
# It's ok to set it into duration string, such as 30s or 1m30s, see time.ParseDuration
# When it is exceeded, the wal open fails and the streaming coord retries the assignment later. 0 disables the limit.
producerCreateTimeout: 1m
# If you want to enable kafka, needs to comment the pulsar configs
# kafka:
# brokerList: localhost:9092
# saslUsername:
# saslPassword:
# saslMechanisms:
# securityProtocol:
# ssl:
# enabled: false # whether to enable ssl mode
# tlsCert: # path to client's public key (PEM) used for authentication
# tlsKey: # path to client's private key (PEM) used for authentication
# tlsCaCert: # file or directory path to CA certificate(s) for verifying the broker's key
# tlsKeyPassword: # private key passphrase for use with ssl.key.location and set_ssl_cert(), if any
# producer:
# message:
# max:
# bytes: 10485760 # Maximum size of a Kafka producer message in bytes. Values below 256 KiB are clamped to 256 KiB; invalid or out-of-range values fall back to the default 10 MiB. Kafka broker/topic limits must support the configured value. Requires a restart to take effect.
# readTimeout: 10
# queuedmaxkbytes: 100000
rocksmq:
# Prefix of the key to where Milvus stores data in RocksMQ.
# Caution: Changing this parameter after using Milvus for a period of time will affect your access to old data.
# It is recommended to change this parameter before starting Milvus for the first time.
# Set an easy-to-identify root key prefix for Milvus if etcd service already exists.
path: /var/lib/milvus/rdb_data
lrucacheratio: 0.06 # rocksdb cache memory ratio
rocksmqPageSize: 67108864 # The maximum size of messages in each page in RocksMQ. Messages in RocksMQ are checked and cleared (when expired) in batch based on this parameters. Unit: Byte.
retentionTimeInMinutes: 4320 # The maximum retention time of acked messages in RocksMQ. Acked messages in RocksMQ are retained for the specified period of time and then cleared. Unit: Minute.
retentionSizeInMB: 8192 # The maximum retention size of acked messages of each topic in RocksMQ. Acked messages in each topic are cleared if their size exceed this parameter. Unit: MB.
compactionInterval: 86400 # Time interval to trigger rocksdb compaction to remove deleted data. Unit: Second
compressionTypes: 0,0,7,7,7 # compaction compression type, only support use 0,7. 0 means not compress, 7 will use zstd. Length of types means num of rocksdb level.
# Related configuration of mixCoord
mixCoord:
enableActiveStandby: false
# Related configuration of rootCoord, used to handle data definition language (DDL) and data control language (DCL) requests
rootCoord:
dmlChannelNum: 16 # The number of DML-Channels to create at the root coord startup.
# The maximum number of partitions in each collection.
# New partitions cannot be created if this parameter is set as 0 or 1.
# Range: [0, INT64MAX]
maxPartitionNum: 1024
# The minimum row count of a segment required for creating index.
# Segments with smaller size than this parameter will not be indexed, and will be searched with brute force.
minSegmentSizeToEnableIndex: 1024
enableActiveStandby: false
maxDatabaseNum: 64 # Maximum number of database
maxGeneralCapacity: 65536 # upper limit for the sum of of product of partitionNumber and shardNumber
gracefulStopTimeout: 5 # seconds. force stop node without graceful stop
clientTelemetry:
cleanupInterval: 60 # seconds. How often to sweep clients that stopped heartbeating and commands that expired.
inactiveClientThreshold: 600 # seconds. How long a client may go without a heartbeat before it is dropped from memory entirely.
# seconds. How long a client may go without a heartbeat before it is reported as inactive.
# It is still kept, and still reported, until inactiveClientThreshold.
clientStatusThreshold: 60
commandCleanupTimeout: 10 # seconds. Timeout for the etcd operations that remove expired client commands.
# bytes. Largest metrics payload accepted from one client per heartbeat; anything beyond is truncated.
# Zero removes the cap entirely, unlike the other limits here, where a non-positive value falls back to the default.
maxMetricsPerClient: 1048576
maxOperationTypesPerClient: 100 # Largest number of distinct operation types kept per client; anything beyond is truncated.
maxClientsInMemory: 100000 # Largest number of clients tracked at once, so a misconfigured or malicious fleet cannot grow this memory without bound.
# How many heartbeat windows to keep per client.
# A telemetry query is answered from the oldest window kept, so this is also how far the answer lags
# the client and how many consecutive idle intervals it survives: at 2, one interval without traffic
# cannot blank the view; at 3, two cannot. Each extra window is another copy of every operation and
# per-collection breakdown for every connected client. Values below 1 are treated as the default.
retainedWindows: 2
ip: # TCP/IP address of rootCoord. If not specified, use the first unicastable address
port: 22125 # TCP port of rootCoord
grpc:
serverMaxSendSize: 536870912 # The maximum size of each RPC request that the rootCoord can send, unit: byte
serverMaxRecvSize: 268435456 # The maximum size of each RPC request that the rootCoord can receive, unit: byte
clientMaxSendSize: 268435456 # The maximum size of each RPC request that the clients on rootCoord can send, unit: byte
clientMaxRecvSize: 536870912 # The maximum size of each RPC request that the clients on rootCoord can receive, unit: byte
# Related configuration of proxy, used to validate client requests and reduce the returned results.
proxy:
# Whether Proxy keeps the legacy row-based size packing before sending messages to StreamingNode.
# Keep this enabled until chunk writing is enabled and observed on every StreamingNode that can own a pchannel.
# For migration, enable streaming.splitChunkSN first, then disable proxy.splitChunk. Both parameters support live refresh.
splitChunk: true
exprParseCache:
enabled: true # Enable caching expression parse trees and parsing errors. These settings apply to all components using the expression parser, not only Proxy; each process maintains its own cache. Restart required; disabling the cache does not reject expressions.
maxEntries: 1024 # Maximum number of cached expression parse trees and parsing errors per process. Non-positive or invalid values use 1024. Entries retain the existing 10-minute TTL. Restart required.
timeTickInterval: 200 # The interval at which proxy synchronizes the time tick, unit: ms.
healthCheckTimeout: 3000 # ms, the interval that to do component healthy check
msgStream:
timeTick:
bufSize: 512 # The maximum number of messages can be buffered in the timeTick message stream of the proxy when producing messages.
maxNameLength: 255 # The maximum length of the name or alias that can be created in Milvus, including the collection name, collection alias, partition name, and field name.
maxCollectionDescriptionLength: 1024 # The maximum byte length of a collection description accepted by CreateCollection and AlterCollection. Existing collection metadata is not revalidated, but restore or replication flows that recreate a collection through CreateCollection must satisfy this limit or raise it first.
maxFieldNum: 256 # The maximum number of field can be created when creating in a collection. It is strongly DISCOURAGED to set maxFieldNum >= 256.
maxVectorFieldNum: 10 # The maximum number of vector fields that can be specified in a collection
maxShardNum: 16 # The maximum number of shards can be created when creating in a collection.
maxMembershipFilterSize: 67108864 # The maximum byte size of one client pre-built membership_match filter body accepted by the proxy (the fixed 32-byte MBF1/MRB1 header is allowed on top). The blob is embedded into the query plan and fanned out to every QueryNode, so this bounds per-membership-filter memory/network amplification. Must not exceed the format cap (128 MiB). Bloom SBBF bodies are powers of two, so the default admits bodies up to 64 MiB: ~48.6M int64 members at the default fpr=0.005, ~55.4M at fpr=0.01. Raising the member count past a tier boundary requires raising the fpr too, not only this limit. Roaring filters remain independently limited to 262144 high containers and a 64 MiB decoded-memory estimate per filter. Keep proxy.grpc.serverMaxRecvSize above this plus the rest of the request.
maxMembershipFilterPlanSize: 134217728 # The request-wide large-filter budget in bytes. It independently limits the aggregate serialized size of membership-filter-bearing plans, and the aggregate estimated decoded size of Roaring filters. The proxy checks assembled plans with proto.Size before proto.Marshal, and hybrid sub-searches and scorer filters share the applicable totals. Must be positive; invalid values fall back to 128 MiB.
maxDimension: 32768 # The maximum number of dimensions of a vector can have when creating in a collection.
# Whether to produce gin logs.\n
# please adjust in embedded Milvus: false
ginLogging: true
ginLogSkipPaths: / # skip url path for gin log
maxRoleDescriptionLength: 1024 # Maximum role description length in bytes.
nameValidation:
allowedChars: $ # Additional characters allowed in names beyond underscores, letters and numbers. To allow hyphens in names, add '-' here.
roleNameValidation:
allowedChars: $ # Additional characters allowed in role names beyond underscores, letters and numbers. Add '-' to allow hyphens in role names.
maxTaskNum: 1024 # The maximum number of tasks in the task queue of the proxy.
enableAutoLoad: false # whether to automatically load an unloaded collection before DQL requests
ddlConcurrency: 16 # The concurrent execution number of DDL at proxy.
dclConcurrency: 16 # The concurrent execution number of DCL at proxy.
mustUsePartitionKey: false # switch for whether proxy must use partition key for the collection
resolveAliasForPrivilege: true # switch for whether proxy shall resolve alias to actual collection name during RBAC privilege checks
maxArrayCapacity: 4096 # maximum number of elements in an array field for a single row
maxIndexParamsSize: 102400 # maximum total size of index params in bytes for create index requests
# maximum number of result entries, typically Nq * TopK * GroupSize.
# It costs additional memory and time to process a large number of result entries.
# If the number of result entries exceeds this limit, the search will be rejected.
# Disabled if the value is less or equal to 0.
maxResultEntries: -1
# maximum number of SearchAggregation result entries, calculated as Nq * DerivedTopK * DerivedGroupSize.
# DerivedTopK is the product of all aggregation level sizes. DerivedGroupSize is the max top_hits size across all levels, or 1 when top_hits is absent.
# If the number of derived result entries exceeds this limit, the search aggregation request will be rejected.
# Disabled if the value is less or equal to 0.
maxSearchAggregationResultEntries: 10000
accessLog:
enable: false # Whether to enable the access log feature.
minioEnable: false # Whether to upload local access log files to MinIO. This parameter can be specified when proxy.accessLog.filename is not empty.
localPath: /tmp/milvus_access # The local folder path where the access log file is stored. This parameter can be specified when proxy.accessLog.filename is not empty.
filename: # The name of the access log file. If you leave this parameter empty, access logs will be printed to stdout.
maxSize: 64 # The maximum size allowed for a single access log file. If the log file size reaches this limit, a rotation process will be triggered. This process seals the current access log file, creates a new log file, and clears the contents of the original log file. Unit: MB.
rotatedTime: 0 # The maximum time interval allowed for rotating a single access log file. Upon reaching the specified time interval, a rotation process is triggered, resulting in the creation of a new access log file and sealing of the previous one. Unit: seconds
remotePath: access_log/ # The path of the object storage for uploading access log files.
remoteMaxTime: 0 # The time interval allowed for uploading access log files. If the upload time of a log file exceeds this interval, the file will be deleted. Setting the value to 0 disables this feature.
formatters:
base:
format: "[$time_now] [ACCESS] <$user_name: $user_addr> $method_name [status: $method_status] [code: $error_code] [sdk: $sdk_version] [msg: $error_msg] [traceID: $trace_id] [timeCost: $time_cost] [error_type: $error_type]"
query:
format: "[$time_now] [ACCESS] <$user_name: $user_addr> $method_name [status: $method_status] [code: $error_code] [sdk: $sdk_version] [msg: $error_msg] [traceID: $trace_id] [timeCost: $time_cost] [database: $database_name] [collection: $collection_name] [partitions: $partition_name] [expr: $method_expr] [params: $query_params] [error_type: $error_type]"
methods: "Query, Delete, /query, /v2/vectordb/entities/query, /v2/vectordb/entities/get, /v2/vectordb/entities/delete"
search:
format: "[$time_now] [ACCESS] <$user_name: $user_addr> $method_name [status: $method_status] [code: $error_code] [sdk: $sdk_version] [msg: $error_msg] [traceID: $trace_id] [timeCost: $time_cost] [database: $database_name] [collection: $collection_name] [partitions: $partition_name] [expr: $method_expr] [nq: $nq] [params: $search_params] [error_type: $error_type]"
methods: "HybridSearch, Search, /search, /v2/vectordb/entities/search, /v2/vectordb/entities/advanced_search, /v2/vectordb/entities/hybrid_search"
upsert:
format: "[$time_now] [ACCESS] <$user_name: $user_addr> $method_name [status: $method_status] [code: $error_code] [sdk: $sdk_version] [msg: $error_msg] [traceID: $trace_id] [timeCost: $time_cost] [database: $database_name] [collection: $collection_name] [partitions: $partition_name] [partial_update: $partial_update] [error_type: $error_type]"
methods: Upsert
cacheSize: 0 # Size of log of write cache, in byte. (Close write cache if size was 0)
cacheFlushInterval: 3 # time interval of auto flush write cache, in seconds. (Close auto flush if interval was 0)
connectionCheckIntervalSeconds: 120 # the interval time(in seconds) for connection manager to scan inactive client info
connectionClientInfoTTLSeconds: 86400 # inactive client info TTL duration, in seconds
maxConnectionNum: 10000 # the max client info numbers that proxy should manage, avoid too many client infos
gracefulStopTimeout: 30 # seconds. force stop node without graceful stop
slowQuerySpanInSeconds: 1 # threshold for slow query detection in seconds. For Search/HybridSearch requests, the time is divided by nq for more accurate per-query measurement. Triggers slow log, WebUI display, and metrics.
queryNodePooling:
size: 10 # the size for shardleader(querynode) client pool
partialResultRequiredDataRatio: 1 # partial result required data ratio, default to 1 which means disable partial result, otherwise, it will be used as the minimum data ratio for partial result
http:
enabled: true # Whether to enable the http server
# Whether to register /v1/vector/* on the proxy HTTP port and /api/v1/_* on the metrics port.
# Disabling requires a restart and leaves the HTTP listeners, /v2/vectordb/*, probes, and metrics available.
# The non-underscore /api/v1/* REST API has been removed regardless of this setting.
# WebUI data and telemetry commands require these console APIs; disable proxy.http.enableWebUI too to hide the pages.
enableV1: true
debug_mode: false # Whether to enable http server debug mode
port: # high-level restful api
acceptTypeAllowInt64: true # high-level restful api, whether http client can deal with int64
# high-level restful api, restore the value handling of releases that predate the REST insert
# validation work. When true the server keeps the previous lenient behavior: a missing or null non-nullable field is
# stored as an empty value, out-of-range integers wrap instead of being rejected, numbers reach VarChar and JSON fields
# through their float64 rendering, and integers too large for the JSON engine become 0. This is a temporary escape hatch
# for clients that have not been corrected yet: every one of those behaviors silently changes what is stored.
compatibilityMode: false
# high-level restful api, the deepest nesting an expression template parameter may use. Converting a
# parameter walks its arrays and objects recursively, so the depth a caller may send has to be bounded; requests past the
# bound are rejected as invalid rather than served. Values above 1024 are read as 1024, since past that the recursion
# itself is the risk the setting exists to remove; values below 1 are read as 1.
maxExprParamsDepth: 100
# high-level restful api, return a JSON field as the document it holds rather than as a string.
# Turn this off only to keep clients written against the older shape working while they migrate: there a JSON field read
# back as "{\"a\":1}" while the same value in the dynamic field read back as {"a":1}. The insert path follows the same
# switch, so either shape can be sent back unchanged: while the field reads back as text, a JSON string is read as the
# document it spells; once it reads back as the document itself, a string is stored as the string it is. Rows written
# before the insert path stopped storing non-JSON bytes may not hold a document; if any row in a response is such a row,
# every JSON field in that response falls back to the string form and a warning is logged, so a caller always sees one
# shape or the other and never a mixture.
nativeJSONResponse: true
# high-level restful api, whether to return Array fields wrapped in the raw protobuf ScalarField shape
# ({"tags":{"Data":{"StringData":{"data":["a","b"]}}}}) instead of a native JSON array ({"tags":["a","b"]}).
# Only enable this to keep clients written against the old, incorrect shape working while they migrate;
# it will be removed in a future release. It covers the shape of a top-level Array field and nothing else:
# a struct array's sub-fields are unaffected, and so is Accept-Type-Allow-Int64, which renders an Int64 as a
# string wherever one appears, including inside either kind of array.
legacyArrayResponse: false
enablePprof: true # Whether to enable pprof middleware on the metrics port
# high-level restful api, reject a search/query request with HTTP 429 while the proxy's DQL task
# queue is full, before the request body is decoded. The scheduler rejects such a request with the same
# TooManyRequests error anyway, but only after the body has been decoded; admission moves the same verdict before that
# cost. Disabling restores the old always-decode behavior.
dqlAdmissionEnabled: true
readHeaderTimeout: 5s # HTTP server timeout for reading request headers
readTimeout: 0s # HTTP server timeout for reading the entire request, including the body. 0 disables this timeout
writeTimeout: 0s # HTTP server timeout for handling requests and writing responses. 0 disables this timeout
idleTimeout: 300s # HTTP server keep-alive idle timeout
maxHeaderBytes: 16777216 # Maximum number of bytes the HTTP server reads from request headers. Defaults to 16MiB to match grpc-go's max header list size, since in shared-port mode this server also serves external gRPC over HTTP/2
hstsMaxAge: 31536000 # Strict-Transport-Security max-age in seconds
hstsIncludeSubDomains: false # Include subdomains in Strict-Transport-Security
enableHSTS: false # Whether to enable setting the Strict-Transport-Security header
enableWebUI: true # Whether to enable setting the WebUI middleware on the metrics port
ip: # TCP/IP address of proxy. If not specified, use the first unicastable address
port: 19530 # TCP port of proxy
internalPort: 19529
grpc:
serverMaxSendSize: 268435456 # The maximum size of each RPC request that the proxy can send, unit: byte
serverMaxRecvSize: 134217728 # The maximum size of each RPC request that the proxy can receive, unit: byte
clientMaxSendSize: 268435456 # The maximum size of each RPC request that the clients on proxy can send, unit: byte
clientMaxRecvSize: 67108864 # The maximum size of each RPC request that the clients on proxy can receive, unit: byte
# Related configuration of queryCoord, used to manage topology and load balancing for the query nodes, and handoff from growing segments to sealed segments.
queryCoord:
taskMergeCap: 1
taskExecutionCap: 360
# Switch value to control if to automatically replace a growing segment with the corresponding indexed sealed segment when the growing segment reaches the sealing threshold.
# If this parameter is set false, Milvus simply searches the growing segments with brute force.
autoHandoff: true
autoBalance: true # Switch value to control if to automatically balance the memory usage among query nodes by distributing segment loading and releasing operations evenly.
autoBalanceChannel: true # Enable auto balance channel
balancer: ChannelLevelScoreBalancer # auto balancer used for segments on queryNodes
globalRowCountFactor: 0.1 # the weight used when balancing segments among queryNodes
scoreUnbalanceTolerationFactor: 0.05 # the least value for unbalanced extent between from and to nodes when doing balance
reverseUnBalanceTolerationFactor: 1.3 # the largest value for unbalanced extent between from and to nodes after doing balance
overloadedMemoryThresholdPercentage: 90 # The threshold of memory usage (in percentage) in a query node to trigger the sealed segment balancing.
balanceIntervalSeconds: 60 # The interval at which query coord balances the memory usage among query nodes.
memoryUsageMaxDifferencePercentage: 30 # The threshold of memory usage difference (in percentage) between any two query nodes to trigger the sealed segment balancing.
rowCountFactor: 0.4 # the row count weight used when balancing segments among queryNodes
segmentCountFactor: 0.4 # the segment count weight used when balancing segments among queryNodes
globalSegmentCountFactor: 0.1 # the segment count weight used when balancing segments among queryNodes
# the channel count weight used when balancing channels among queryNodes,
# A higher value reduces the likelihood of assigning channels from the same collection to the same QueryNode. Set to 1 to disable this feature.
collectionChannelCountFactor: 10
segmentCountMaxSteps: 50 # segment count based plan generator max steps
rowCountMaxSteps: 50 # segment count based plan generator max steps
randomMaxSteps: 10 # segment count based plan generator max steps
growingRowCountWeight: 4 # the memory weight of growing segment row count
delegatorMemoryOverloadFactor: 0.1 # the factor of delegator overloaded memory
balanceCostThreshold: 0.001 # the threshold of balance cost, if the difference of cluster's cost after executing the balance plan is less than this value, the plan will not be executed
checkSegmentInterval: 1000
checkChannelInterval: 1000
checkBalanceInterval: 300
autoBalanceInterval: 3000 # the interval for triggerauto balance
checkIndexInterval: 10000
channelTaskTimeout: 120000 # 2 minutes
segmentTaskTimeout: 300000 # 5 minutes
distPullInterval: 500
dispatchInterval: 500
heartbeatAvailableInterval: 10000 # 10s, Only QueryNodes which fetched heartbeats within the duration are available
loadTimeoutSeconds: 600
autoRelease:
enabled: false # whether QueryCoord releases collections after an idle TTL; effective only when proxy.enableAutoLoad is true
idleTTLSeconds: 600
checkIntervalSeconds: 30
releaseConcurrency: 16 # maximum concurrent automatic collection releases in one scan; changes apply to the next release batch
distRequestTimeout: 5000 # the request timeout for querycoord fetching data distribution from querynodes, in milliseconds
heatbeatWarningLag: 5000 # the lag value for querycoord report warning when last heatbeat is too old, in milliseconds
enableDataDistributionDelta: true # whether querycoord requests delta data distribution reports from querynodes
checkHandoffInterval: 5000
enableActiveStandby: false
checkInterval: 1000
checkHealthInterval: 3000 # 3s, the interval when query coord try to check health of query node
checkHealthRPCTimeout: 2000 # 100ms, the timeout of check health rpc to query node
brokerTimeout: 5000 # 5000ms, querycoord broker rpc timeout
collectionRecoverTimes: 3 # if collection recover times reach the limit during loading state, release it
observerTaskParallel: 16 # the parallel observer dispatcher task number
checkAutoBalanceConfigInterval: 10 # the interval of check auto balance config
checkNodeSessionInterval: 60 # the interval(in seconds) of check querynode cluster session
gracefulStopTimeout: 5 # seconds. force stop node without graceful stop
enableStoppingBalance: true # whether enable stopping balance
stoppingBalanceAssignPolicy: ScoreBased # assign policy for stopping balance, options: RoundRobin, RowCount, ScoreBased
channelExclusiveNodeFactor: 3 # minimum RW QueryNode count per channel required to enable channel exclusive mode
collectionObserverInterval: 200 # the interval of collection observer
updateCollectionLoadStatusInterval: 5 # 5m, max interval of updating collection loaded status for check health
channelTaskCapFraction: 0.3 # fraction of total task execution capacity reserved for channel tasks per node (0.0-1.0)
# Duration (in seconds) that a query node remains marked as resource exhausted after reaching resource limits.
# During this period, the node won't receive new tasks to loading resource.
# Set to 0 to disable the penalty period.
resourceExhaustionPenaltyDuration: 30
resourceExhaustionCleanupInterval: 10 # Interval (in seconds) for cleaning up expired resource exhaustion marks on query nodes.
autoscale:
precheckEnabled: false # Whether QueryCoord performs load resource precheck before committing load configuration changes and publishes demand counters after successful broadcasts. With tiered eviction enabled, only demand estimation is performed; capacity checks are skipped.
enabled: false # Whether QueryCoord load resource precheck can use autoscale upper bounds to admit a load request when current QueryNode capacity is insufficient. This is effective only when precheckEnabled is true and tiered eviction is disabled.
maxMemoryLimit: 0 # Maximum global QueryNode memory capacity after autoscale, unit: GiB (1 GiB = 1024^3 bytes). 0 means autoscale cannot add memory capacity.
maxDiskLimit: 0 # Maximum sum of Worker QueryNode LOCAL_STORAGE_SIZE after autoscale, unit: GiB (1 GiB = 1024^3 bytes). 0 means autoscale cannot add disk capacity.
cleanExcludeSegmentInterval: 60 # the time duration of clean pipeline exclude segment which used for filter invalid data, in seconds
ip: # TCP/IP address of queryCoord. If not specified, use the first unicastable address
port: 19531 # TCP port of queryCoord
grpc:
serverMaxSendSize: 536870912 # The maximum size of each RPC request that the queryCoord can send, unit: byte
serverMaxRecvSize: 268435456 # The maximum size of each RPC request that the queryCoord can receive, unit: byte
clientMaxSendSize: 268435456 # The maximum size of each RPC request that the clients on queryCoord can send, unit: byte
clientMaxRecvSize: 536870912 # The maximum size of each RPC request that the clients on queryCoord can receive, unit: byte
# Related configuration of queryNode, used to run hybrid search between vector and scalar data.
queryNode:
queryView:
transformLogDrainConcurrencyRatio: 0.25 # QueryNode-wide TransformLog backlog drain worker count is max(1, floor(CPU count * ratio)). Updates existing worker pools dynamically.
groupBy:
strictGroupStrategy: per_group # Strict group completion strategy: original or per_group. Independent phase-one and refinement controls still apply to original.
strictGroupPhase1CandidateWeight: 0 # Strict group phase-one consumer Next limit is topk * group_size * weight; zero disables truncation. Overflow saturates at INT64_MAX. Only group discovery is limited; completion is not. May reduce recall.
strictGroupSkipRefine: false # Skip query-time refinement consistently in both phases of single-query strict grouping with group size greater than one. May reduce recall.
stats:
publishInterval: 1000 # The interval that query node publishes the node statistics information, including segment status, cpu usage, memory usage, health status, etc. Unit: ms.
segcore:
knowhereThreadPoolNumRatio: 4 # The number of threads in knowhere's thread pool. If disk is enabled, the pool size will multiply with knowhereThreadPoolNumRatio([1, 32]).
searchFanoutPoolSizeRatio: 2 # Thread-to-core ratio for the search fanout pool; independent of the search executor and not limited by common.threadCoreCoefficient.maxThreadsSize. Invalid, non-positive, non-finite or overflowing values use the default ratio of 2.
chunkRows: 128 # Row count by which Segcore divides a segment into chunks.
interimIndex:
# Whether to create a temporary index for growing segments and sealed segments not yet indexed, improving search performance.
# Milvus will eventually seals and indexes all segments, but enabling this optimizes search performance for immediate queries following data insertion.
# This defaults to true, indicating that Milvus creates temporary index for growing segments and the sealed segments that are not indexed upon searches.
enableIndex: true
nlist: 128 # interim index nlist, recommend to set sqrt(chunkRows), must smaller than chunkRows/8
nprobe: 16 # nprobe to search small index, based on your accuracy requirement, must smaller than nlist
subDim: 4 # interim index sub dim, recommend to (subDim % vector dim == 0)
refineRatio: 4.5 # interim index parameters, should set to be >= 1.0
indexBuildRatio: 0.1 # the ratio of building interim index rows count with max row count of a flush segment, should set to be < 1.0
refineQuantType: NONE # Data representation of SCANN_DVR index, options: 'NONE', 'FLOAT16', 'BFLOAT16' and 'UINT8'
refineWithQuant: true # whether to use refineQuantType to refine for faster but loss a little precision
denseVectorIndexType: IVF_FLAT_CC # Dense vector intermin index type
memExpansionRate: 1.15 # extra memory needed by building interim index
buildParallelRate: 0.5 # the ratio of building interim index parallel matched with cpu num
growingBuildThreadRate: 0 # The ratio of the interim index build thread pool that one growing segment index build may use, resolved as round(rate * pool size) and clamped to [1, pool size]. 0 means single threaded
multipleChunkedEnable: true # Deprecated. Enable multiple chunked search
enableGeometryCache: false # Enable geometry cache for geometry data
enableGISSplitFusion: true # Enable GIS filter coarse/refine split + same-column fusion optimization
scanCursorOwnsPin: false # Use cursor-owned rather than result-owned Cell pins for scalar Scan
tieredStorage:
warmup:
# options: sync, async, disable.
# Specifies the timing for warming up the Tiered Storage cache.
# - "sync": data will be loaded into the cache before a segment is considered loaded.
# - "async": data will be loaded into the cache asynchronously in the background after a segment is loaded.
# - "disable": data will not be proactively loaded into the cache, and loaded only if needed by search/query tasks.
# Defaults to "sync", except for vector field which defaults to "disable".
scalarField: sync
# options: sync, async, disable.
# Cache warmup for scalar indexes and the system PK index.
# Defaults to "sync".
scalarIndex: sync
vectorField: disable # cache warmup for vector field raw data is by default disabled.
vectorIndex: sync
# If evictionEnabled is true, a background thread will run every evictionIntervalMs to determine if an
# eviction is necessary and the amount of data to evict from memory/disk.
# - If the current memory/disk usage exceeds the high watermark, an eviction will be triggered to evict data from memory/disk
# until the memory/disk usage is below the low watermark.
# - Disk watermark ratios are fractions of the effective local-storage disk capacity, not fractions of
# queryNode.maxDiskUsagePercentage. They must satisfy diskLowWatermarkRatio <= diskHighWatermarkRatio <=
# queryNode.maxDiskUsagePercentage / 100. When lowering queryNode.maxDiskUsagePercentage, adjust the
# disk watermarks as needed to preserve this ordering.
# - The max amount of memory/disk that can be used for cache is controlled by
# queryCoord.overloadedMemoryThresholdPercentage and queryNode.maxDiskUsagePercentage.
memoryLowWatermarkRatio: 0.75
memoryHighWatermarkRatio: 0.8
diskLowWatermarkRatio: 0.75
diskHighWatermarkRatio: 0.8
# Enable eviction for Tiered Storage. Defaults to false.
# Note that if eviction is enabled, cache data loaded during sync warmup is also subject to eviction.
evictionEnabled: false
# Enable background eviction for Tiered Storage. Defaults to false.
# Background eviction is used to do periodic eviction in a separate thread.
# And it will only work when both 'evictionEnabled' and 'backgroundEvictionEnabled' are set to 'true'.
backgroundEvictionEnabled: false
# Time in seconds after which an unaccessed cache cell will be evicted. 'backgroundEvictionEnabled' is required.
# If a cached data hasn't been accessed again after this time since its last access, it will be evicted.
# If set to 0, time based eviction is disabled.
cacheTtl: 0
storageUsageTrackingEnabled: false # Enable storage usage tracking for Tiered Storage. Defaults to false.
lazyIndexSlotEnabled: false # When enabled, sealed scalar, vector, and text index translators and cache slots with warmup=disable are created on first access instead of segment load.
lazyColumnGroupEnabled: false # When enabled, Storage V3 manifest fields with warmup=disable and no load-time side effects defer projected ChunkReader, translator, and cache creation until first access.
knowhereScoreConsistency: false # Enable knowhere strong consistency score computation logic
chainPoolSizeFactor: 1 # size factor (CPUNum * factor) of the native function-chain pool; isolated from ordinary query field retrieval; values below 1 use 1
mutatePoolSizeFactor: 2 # size factor (CPUNum * factor) of the online-write cgo pool for segment insert/delete; isolated from the load/management pool so segment loading cannot starve online writes
dynamicPoolSizeFactor: 1 # size factor (CPUNum * factor) of the dynamic cgo pool for segment create/release/statistics/index-info
deletePoolSizeFactor: 1 # size factor (CPUNum * factor) of the DeleteBatch dispatch pool
storageV2:
cellTargetSizeBytes: 4194304 # Target average byte size per storage v2 cache cell. Parquet row groups are greedily packed so that rgs_per_cell * avg_row_group_size ≈ this target. Each cell always contains at least one row group and cells never cross file boundaries. Tune larger for bigger batch IO (fewer cells) or smaller to get finer cache granularity. Default 4 MiB.
asyncLoadReadWindowSizeBytes: 16777216 # Target estimated loaded-byte threshold for one Storage V3 async read window. Each window contains at least one cell, so an oversized cell may exceed the threshold. The value must be positive. Default 16 MiB.
deleteDumpBatchSize: 10000 # Batch size for delete snapshot dump in segcore.
fmindexCostRatio: 0.001 # FM-index count-first guard threshold. An FMINDEX-accelerated LIKE (prefix/infix/suffix and general LIKE with interior wildcards) runs through the index only when occ * sa_sample_rate < fmindexCostRatio * total_tokens; otherwise it falls back to the raw-data scan (all paths are exact, this only picks the cheaper one). For the anchored forms the index answer is exact; for general LIKE it is candidate generation followed by an exact recheck of the candidate rows on the original VARCHAR data. The bound prices only FM locate, not the recheck bytes, so it stays row-length invariant only for the anchored forms; very long rows with unselective fragments may be routed to a path slower than the scan. Must be in (0, 1]; larger favors the index. Default 0.001 is the conservative crossover measured in benchmarks.
loadMemoryUsageFactor: 1 # The multiply factor of calculating the memory usage while loading segments
enableDisk: false # enable querynode load disk index, and search on disk index
maxDiskUsagePercentage: 95 # Maximum disk usage as a percentage of the effective local-storage disk capacity.
cache:
memoryLimit: 2147483648 # Deprecated: 2 GB, 2 * 1024 *1024 *1024
readAheadPolicy: willneed # The read ahead policy of chunk cache, options: `normal, random, sequential, willneed, dontneed`
mmap:
vectorField: true # Enable mmap for loading vector data
vectorIndex: false # Enable mmap for loading vector index
scalarField: false # Enable mmap for loading scalar data
scalarIndex: false # Enable mmap for loading scalar index
jsonShredding: true # Enable mmap for loading json stats
# Enable memory mapping (mmap) to optimize the handling of growing raw data.
# By activating this feature, the memory overhead associated with newly added or modified data will be significantly minimized.
# However, this optimization may come at the cost of a slight decrease in query latency for the affected data segments.
growingMmapEnabled: false
fixedFileSizeForMmapAlloc: 1 # tmp file size for mmap chunk manager
maxDiskUsagePercentageForMmapAlloc: 50 # disk percentage used in mmap chunk manager
indexOffsetCacheEnabled: false # enable index offset cache for some scalar indexes, now is just for bitmap index, enable this param can improve performance for retrieving raw data from index
scheduler:
unsolvedQueueSize: 1024
# maxReadConcurrentRatio is the concurrency ratio of read task (search task and query task).
# Max read concurrency would be the value of hardware.GetCPUNum * maxReadConcurrentRatio.
# It defaults to 2.0, which means max read concurrency would be the value of hardware.GetCPUNum * 2.
# Max read concurrency must greater than or equal to 1, and less than or equal to hardware.GetCPUNum * 100.
# (0, 100]
maxReadConcurrentRatio: 1
cpuRatio: 10 # ratio used to estimate read task cpu usage.
maxTimestampLag: 86400
scheduleReadPolicy:
# fifo: A FIFO queue support the schedule.
# user-task-polling:
# The user's tasks will be polled one by one and scheduled.
# Scheduling is fair on task granularity.
# The policy is based on the username for authentication.
# And an empty username is considered the same user.
# When there are no multi-users, the policy decay into FIFO.
name: fifo
taskQueueExpire: 60 # Control how long (many seconds) that queue retains since queue is empty
taskDeadlineAdvance: 50ms # Advance duration for cleaning queued query node read tasks before their context deadline. It supports duration strings such as 50ms and 1s. A bare number is interpreted as milliseconds for compatibility.
enableCrossUserGrouping: false # Enable Cross user grouping when using user-task-polling policy. (Disable it if user's task can not merge each other)
maxPendingTaskPerUser: 1024 # Max pending task per user in scheduler
grouping:
maxNQ: 64
nqMergeRatio: 16 # Maximum ratio between merged total NQ and the smaller task NQ when grouping query node read tasks.
maxDeadlineMergeGap: 50ms # Maximum allowed gap between task context deadlines when grouping query node read tasks. Tasks with only one deadline cannot be grouped. Set a negative duration to disable this check.
topKMergeRatio: 20
migrateDataTimeout: 10s # Duration string (e.g. 10s, 3m). After this duration, a stopping query node stops waiting for data migration if no other active query node is available.
search:
enableResultZeroCopy: false # When true, delegator passes reduced SearchResultData directly instead of re-marshaling to SlicedBlob. Toggle at runtime for instant fallback.
levelZeroForwardPolicy: FilterByBF # delegator level zero deletion forward policy, possible option["FilterByBF", "RemoteLoad"]
streamingDeltaForwardPolicy: FilterByBF # delegator streaming deletion forward policy, possible option["FilterByBF", "Direct"]
forwardBatchSize: 4194304 # the batch size delegator uses for forwarding stream delete in loading procedure
delegatorPostLoadConcurrencyFactor: 1 # delegator post-load concurrency factor after worker LoadSegments returns. Concurrency is hardware.GetCPUNum * factor
exprCache:
enabled: false # enable expression result cache
mode: disk # cache mode: 'disk' (sealed only) or 'memory' (sealed and optionally growing)
minEvalDurationUs: 1000 # global latency filter: skip expressions that eval faster than this (0=disabled)
admissionThreshold: 2 # per-cache-key frequency admission for memory and disk mode: cache after N+ occurrences (1=no gating)
materialization:
maxBytes: 268435456 # max transient heap memory for full expression-cache bitmap materializations in memory and disk modes (default 256MB)
memory:
maxBytes: 268435456 # max memory for expression cache in memory mode (default 256MB)
compressionEnabled: true # enable Roaring/Raw adaptive compression in memory mode
enableGrowing: false # cache growing-segment snapshots in expression cache memory mode
disk:
maxBytes: 10737418240 # max total disk usage for expression cache in disk mode (default 10GB)
maxFileSizeBytes: 268435456 # max file size per sealed segment in disk mode (default 256MB)
dataSync:
flowGraph:
maxQueueLength: 16 # The maximum size of task queue cache in flow graph in query node.
maxParallelism: 1024 # Maximum number of tasks executed in parallel in the flowgraph
dmlMicroBatch:
maxMsgNum: 8 # Maximum number of DML messages in one micro-batch drained by query node data sync pipeline. The batcher only drains already buffered messages and does not wait for more messages.
enableSegmentPrune: false # use partition stats to prune data in search/query on shard delegator
queryStreamBatchSize: 4194304 # return min batch size of stream query
queryStreamMaxBatchSize: 134217728 # return max batch size of stream query
enableSegmentFilter: true # Enable delegator-side segment filtering using PK predicates (min/max + bloom filter).
bloomFilterApplyParallelFactor: 2 # parallel factor when to apply pk to bloom filter, default to 2*CPU_CORE_NUM
workerPooling:
size: 10 # the size for worker querynode client pool
idfOracle:
preload: true # Whether to parse and merge BM25 stats into current during load before first target. When false, stats are only written to disk and loaded on first SyncDistribution.
readBufferSize: 4194304 # Read buffer size in bytes for streaming BM25 stats from remote storage. Reduces per-read overhead through the storage SDK.
bm25StatsBytesPerEntry: 20 # Estimated memory cost (bytes) per entry in BM25 stats rowsWithToken map for memory accounting. Empirical measurement: 12-19.5 bytes/entry depending on map fill ratio. Increase if cache eviction is too lax; decrease to load more segments concurrently.
ip: # TCP/IP address of queryNode. If not specified, use the first unicastable address
port: 21123 # TCP port of queryNode
grpc:
serverMaxSendSize: 536870912 # The maximum size of each RPC request that the queryNode can send, unit: byte
serverMaxRecvSize: 268435456 # The maximum size of each RPC request that the queryNode can receive, unit: byte
clientMaxSendSize: 268435456 # The maximum size of each RPC request that the clients on queryNode can send, unit: byte
clientMaxRecvSize: 536870912 # The maximum size of each RPC request that the clients on queryNode can receive, unit: byte
indexCoord:
bindIndexNodeMode:
enable: false
address: localhost:22930
withCred: false
nodeID: 0
segment:
minSegmentNumRowsToEnableIndex: 1024 # It's a threshold. When the segment num rows is less than this value, the segment will not be indexed
indexNode:
scheduler:
buildParallel: 1
dataCoord:
channel:
watchTimeoutInterval: 300 # Timeout on watching channels (in seconds). Datanode tickler update watch progress will reset timeout timer.
legacyVersionWithoutRPCWatch: 2.4.1 # Datanodes <= this version are considered as legacy nodes, which doesn't have rpc based watch(). This is only used during rolling upgrade where legacy nodes won't get new channels
balanceSilentDuration: 300 # The duration after which the channel manager start background channel balancing
balanceInterval: 360 # The interval with which the channel manager check dml channel balance status
checkInterval: 1 # The interval in seconds with which the channel manager advances channel states
notifyChannelOperationTimeout: 5 # Timeout notifing channel operations (in seconds).
segment:
maxSize: 1024 # The maximum size of a segment, unit: MB. datacoord.segment.maxSize and datacoord.segment.sealProportion together determine if a segment can be sealed.
diskSegmentMaxSize: 2048 # Maximum size of a segment in MB for collection which has Disk index
sealProportion: 0.12 # The minimum proportion to datacoord.segment.maxSize to seal a segment. datacoord.segment.maxSize and datacoord.segment.sealProportion together determine if a segment can be sealed.
sealProportionJitter: 0.1 # segment seal proportion jitter ratio, default value 0.1(10%), if seal proportion is 12%, with jitter=0.1, the actuall applied ratio will be 10.8~12%
maxLife: 86400 # The max lifetime of segment in seconds, 24*60*60
# If a segment didn't accept dml records in maxIdleTime and the size of segment is greater than
# minSizeFromIdleToSealed, Milvus will automatically seal it.
# The max idle time of segment in seconds, 10*60.
maxIdleTime: 600
minSizeFromIdleToSealed: 16 # The min size in MB of segment which can be idle from sealed.
smallProportion: 0.5 # Deprecated: unused since two-tier compaction. Replaced by middleSize (idealSize/4) × fillRate.
compactableProportion: 0.85 # Deprecated: fill rate is now a hardcoded constant (0.85) in the two-tier compaction algorithm.
expansionRate: 1.25 # Deprecated: no longer used by the mix compaction planner. Still read by v2 trigger and import paths.
autoUpgradeSegmentIndex: false # whether auto upgrade segment index to index engine's version
forceRebuildSegmentIndex: false # force rebuild segment index to specify index engine's version
# if param forceRebuildSegmentIndex is enabled, the vector index will be rebuilt to aligned with targetVecIndexVersion.
# if param forceRebuildSegmentIndex is not enabled, the newly created vector index will be aligned with the newer one of index engine's version and targetVecIndexVersion.
# if param targetVecIndexVersion is not set, the default value is -1, which means no target vec index version, then the vector index will be aligned with index engine's version
targetVecIndexVersion: 10
forceRebuildScalarSegmentIndex: false # force rebuild scalar segment index to specified scalar index engine's version
# if param forceRebuildScalarSegmentIndex is enabled, the scalar index will be rebuilt to aligned with targetScalarIndexVersion.
# if param forceRebuildScalarSegmentIndex is not enabled, the newly created scalar index will be aligned with the newer one of scalar index engine's version and targetScalarIndexVersion.
# if param targetScalarIndexVersion is not set, the default value is -1, which means no target scalar index version, then the scalar index will be aligned with scalar index engine's version
targetScalarIndexVersion: -1
enableArraySortIndex: auto # Whether ordinary ARRAY HYBRID may select STL_SORT, ordinary ARRAY may use explicit STL_SORT, and typed JSON ARRAY paths may use HYBRID or STL_SORT. auto: enable once all registered online components reach 3.1.0 and the stability window elapses; false: keep ordinary ARRAY HYBRID high cardinality on INVERTED, downgrade affected AUTOINDEX requests to INVERTED, and reject explicit ARRAY STL_SORT or JSON ARRAY HYBRID/STL_SORT; true: force enable and bypass the software-version gate.
segmentFlushInterval: 2 # the minimal interval duration(unit: Seconds) between flushing operation on same segment
sealPolicy:
channel:
# If the total entry number of l0 logs of each shard
# exceeds this threshold, the earliest growing segments will be sealed.
blockingL0EntryNum: 5000000
# The size threshold in MB, if the total entry number of l0 logs of each shard
# exceeds this threshold, the earliest growing segments will be sealed.
blockingL0SizeInMB: 64
manifestCommitConcurrency: 16 # Maximum concurrent DataCoord manifest commits across L0 compaction, index and stats publication, schema materialization, and GC. Values are clamped to [1, 256]. Workers start on demand. Read once during metadata initialization; changes require restart.
# Switch value to control if to enable segment compaction.
# Compaction merges small-size segments into a large segment, and clears the entities deleted beyond the rentention duration of Time Travel.
enableCompaction: true
compaction:
# Switch value to control if to enable automatic segment compaction during which data coord locates and merges compactable segments in the background.
# This configuration takes effect only when dataCoord.enableCompaction is set as true.
enableAutoCompaction: true
enableTargetBasedCompaction: false # Whether target-based compaction is enabled.
target:
maxEventsPerReconcile: 100 # Maximum number of compaction events emitted by one target reconciliation.
indexBasedCompaction: true
# compaction task prioritizer, options: [default, level, mix].
# default is FIFO.
# level is prioritized by level: L0 compactions first, then mix compactions, then clustering compactions.
# mix is prioritized by level: mix compactions first, then L0 compactions, then clustering compactions.
taskPrioritizer: level
taskQueueCapacity: 100000 # compaction task queue size
# Soft cap on pending and running compaction tasks: once reached, automatic compaction, including sort compaction and
# target-based compaction, stops planning and submitting tasks, so concurrent submissions can briefly exceed it.
# Manual compaction, import and the sort of clustering compaction outputs are not capped, nor is the sort of flushed
# segments while automatic compaction is disabled. 0 or a negative value means unlimited.
maxTaskNum: 0
rpcTimeout: 10
maxParallelTaskNum: -1 # Deprecated, see datanode.slot.slotCap
dropTolerance: 3600 # Compaction task will be cleaned after finish longer than this time(in seconds)
gcInterval: 1800 # The time interval in seconds for compaction gc
scheduleInterval: 500 # The time interval in milliseconds for scheduling compaction tasks. If the configuration setting is below 100ms, it will be adjusted upwards to 100ms
mix:
triggerInterval: 60 # The time interval in seconds to trigger mix compaction
levelzero:
triggerInterval: 10 # The time interval in seconds for trigger L0 compaction
forceTrigger:
minSize: 8388608 # The minimum size in bytes to force trigger a LevelZero Compaction, default as 8MB
maxSize: 67108864 # The maxmum size in bytes to force trigger a LevelZero Compaction, default as 64MB
deltalogMinNum: 10 # The minimum number of deltalog files to force trigger a LevelZero Compaction
deltalogMaxNum: 1000 # The maxmum number of deltalog files to force trigger a LevelZero Compaction, default as 1000
expiry:
tolerance: -1 # tolerant duration in hours for expiry data, negative value means no toleration and equivalent to zero
bumpSchemaVersion:
enabled: false # Enable schema version bump compaction
triggerInterval: 20 # The time interval in seconds for trigger schema bump compaction
single:
ratio:
threshold: 0.2 # The ratio threshold of a segment to trigger a single compaction, default as 0.2
deltalog:
maxsize: 16777216 # The deltalog size of a segment to trigger a single compaction, default as 16MB
maxnum: 200 # The deltalog count of a segment to trigger a compaction, default as 200
expiredlog:
maxsize: 10485760 # The expired log size of a segment to trigger a compaction, default as 10MB
maxFragmentsPerGroup: 8 # maximum number of fragment segments allowed per channel-partition group before fragment-tier compaction triggers
clustering:
enable: true # Enable clustering compaction
autoEnable: false # Enable auto clustering compaction
triggerInterval: 600 # clustering compaction trigger interval in seconds
minInterval: 3600 # The minimum interval between clustering compaction executions of one collection, to avoid redundant compaction
maxInterval: 259200 # If a collection haven't been clustering compacted for longer than maxInterval, force compact
newDataSizeThreshold: 512m # If new data size is large than newDataSizeThreshold, execute clustering compaction
preferSegmentSizeRatio: 0.8
maxSegmentSizeRatio: 1
maxTrainSizeRatio: 0.8 # max data size ratio in Kmeans train, if larger than it, will down sampling to meet this limit
maxCentroidsNum: 10240 # maximum centroids number in Kmeans train
minCentroidsNum: 16 # minimum centroids number in Kmeans train
minClusterSizeRatio: 0.01 # minimum cluster size / avg size in Kmeans train
maxClusterSizeRatio: 10 # maximum cluster size / avg size in Kmeans train
maxClusterSize: 5g # maximum cluster size in Kmeans train
syncSegmentsInterval: 300 # The time interval for regularly syncing segments
index:
memSizeEstimateMultiplier: 2 # When the memory size is not setup by index procedure, multiplier to estimate the memory size of index data
# Object storage layout for newly built segment index files. 0: index_files/{buildID}/{indexVersion}/{partitionID}/{segmentID}, 1: index_v1/{collectionID}/{partitionID}/{segmentID}/{buildID}/{indexVersion}. Any other value falls back to 0.
# Layout 1 cannot be read by 2.6, so enabling it commits the upgrade and gives up the ability to roll back to 2.6. Existing index files keep the layout they were built with, so this switch only affects index files built from now on.
# Layout 1 is additionally gated on no QueryNode still reporting an older release line, so setting this to 1 during a 2.6 -> 3.0 upgrade still builds layout 0 until every QueryNode is upgraded. That check reads the version each QueryNode publishes in its session, which is a per-release-line constant, so it separates 2.6.x from 3.0.x but does not differentiate binaries within the same release line.
storePathVersion: 0
# Whether completed StorageV3 index artifacts are published in segment manifests. On by default: successful builds with artifact files publish a new manifest revision, which advances the DataView and drives QueryView resource preparation; that commit atomically deletes the corresponding Finished etcd row. Unissued, InProgress, Failed, fake-finished, and other task states remain in etcd. Off keeps the legacy etcd-only path, which does not drive QueryView index refresh. StorageV1/V2 always use etcd.
# New StorageV3 builds also write artifacts under the segment manifest base/_index/<build>/<version> (path version 2). Upgrade all workers and QueryNodes before enabling. Old-layout tasks keep their original etcd publication mode; external index paths are never added.
# The setting applies when a build task is created. Existing builds keep their persisted mode across switches and restarts: path version 2 publishes to manifests, while versions 0/1 finish in etcd. Published records remain recoverable through the segment's manifest_has_index marker.
# The value must be exactly true or false. A value that does not parse as a boolean, such as yes, is silently read as false, i.e. the legacy etcd behavior.
writeSegmentIndexToManifest: true
# Concurrency of StorageV3 manifest index reads during startup and snapshot restore. Reads await asynchronous transaction callbacks in Go. Values are clamped to [1, 256], and the coordinator read limit is also capped by positive minio.maxConnections values. Restore assembly and verification share the same budget.
# Startup continuously schedules bounded concurrent reads and retries failed reads per segment. An exhausted read or invalid manifest fails startup without replaying successful reads through the metastore retry loop. Recovery follows the durable manifest_has_index marker independently of the current write-mode switch.
segmentIndexManifestLoadConcurrency: 64
manifestIndexBackfill:
# Whether DataCoord migrates historical finished StorageV3 SegmentIndex catalog rows into segment manifests. This is an operator-controlled, restart-scoped migration and is inert unless dataCoord.index.writeSegmentIndexToManifest is also true.
# Artifact files are copied with object-storage server-side Copy into the segment _index directory before publication; local-storage layout migration is unsupported. Copies run concurrently under a shared storage I/O budget.
# Each eligible record is moved through the ordinary segment manifest commit: the new manifest pointer, manifest_has_index marker, and deletion of the old catalog row land in one transaction. No separate index-prune phase is required. Failed, in-flight, fake-finished, deleted, StorageV1/V2, and L0 records remain on their existing lifecycle paths.
# Enable only after all DataCoord replicas, workers and QueryNodes support path version 2 and manifest-index reload. Migrated rows are not recreated when this switch is disabled, so rolling DataCoord back to an older version is unsupported after migration starts.
# Watch milvus_datacoord_manifest_index_backfill_pending_records. Zero means no eligible historical catalog row remains; mixed manifest and etcd placement is safe while the migration is still running.
enabled: false
interval: 60 # Interval in seconds between manifest index backfill scans while work remains. Empty scans stop the timer; new catalog-backed finished index records wake the inspector.
batchSize: 1000 # Target number of SegmentIndex catalog records migrated per scan. Whole segments are selected, so the last segment may exceed this budget; the pending gauge counts the full backlog.
concurrency: 16 # Number of segments whose manifest index backfill may run in parallel. Each segment batches its indexes into one commit unless the etcd transaction operation limit requires splitting.
manifestIndexRollback:
# Copy StorageV3 path-version-2 index files to index_v1 with object-storage server-side Copy, then atomically restore etcd records with path version 1 and remove their manifest entries. Source files remain retained for readers and snapshots. Local-storage layout migration is unsupported. This restart-scoped switch overrides forward backfill and creation of new manifest index tasks; already-created version-2 tasks still finish in manifests and are then eligible for rollback.
# Only in-memory manifest-resident records are migrated. Untracked manifest entries remain owned by GC. Readiness reports that the current record backlog is empty; later records wake the inspector.
enabled: false
interval: 60 # Seconds between rollback scans while manifest-resident records remain. Scans stop after readiness and resume on manifest-resident record notifications. Nonpositive durations use 60 seconds.
batchSize: 1000 # Maximum segments visited per rollback scan. Each visit restores at most maxEtcdTxnNum-1 indexes atomically.
concurrency: 8 # Maximum segments processed concurrently during rollback, clamped to [1, 256].
enableGarbageCollection: true # Switch value to control if to enable garbage collection to clear the discarded data in MinIO or S3 service.
gc:
interval: 3600 # The interval at which data coord performs garbage collection, unit: second.
missingTolerance: 86400 # The retention duration of the unrecorded binary log (binlog) files. Setting a reasonably large value for this parameter avoids erroneously deleting the newly created binlog files that lack metadata. Unit: second.
dropTolerance: 10800 # The retention duration of the binlog files of the deleted segments before they are cleared, unit: second.
scanInterval: 168 # orphan file (file on oss but has not been registered on meta) on object storage garbage collection scanning interval in hours
slowDownCPUUsageThreshold: 0.6 # The CPU usage threshold at which the garbage collection will be slowed down
lob:
enabled: true # Enable garbage collection for LOB (TEXT column) files
safetyWindow: 3600 # Safety window for LOB file GC in seconds. Files older than this are eligible for deletion. Default 1 hour.
checkInterval: 1800 # Interval for LOB GC check in seconds. Default 30 minutes.
pkindex:
gc:
interval: 3600 # The interval at which data coord runs garbage collection for primary key index files, unit: second.
grace: 86400 # Garbage collection keeps an unreferenced primary key index file for at least this time after its last modification, unit: second. The minimum is 600 (10 minutes); a lower value disables the garbage collection of primary key index files.
manifestRetainVersions: 8 # The number of the newest primary key index manifest versions that garbage collection keeps for each vchannel.
manifestRetainDuration: 3600 # Garbage collection keeps every primary key index manifest version written within this time, unit: second.
snapshot:
pendingTimeout: 60 # Timeout in minutes for pending snapshots before GC cleanup
maxCompactionProtectionSeconds: 604800 # Maximum allowed compaction protection duration in seconds (default 604800 = 7 days)
crossBucketEndpointAllowlist: # Comma/space separated endpoint host[:port] allowlist for snapshot server-side cross-bucket copy with custom object storage endpoints. Canonical cloud endpoints derived from cloud_provider and region are allowed without this list.
exportCopyConcurrency: 16 # Maximum concurrent provider-side object copy requests for ExportSnapshot. Invalid or non-positive values are coerced to the default value 16.
exportJobTimeout: 43200 # Maximum lifetime in seconds for an accepted snapshot export job, including queue wait time. Default 12 hours.
exportJobRetention: 10800 # Retention in seconds for completed or failed snapshot export jobs after pin cleanup. Default 3 hours.
exportMaxConcurrentJobs: 1 # Maximum number of snapshot export jobs executed concurrently by DataCoord.
enableActiveStandby: false
taskRetryBackoffInterval: 1 # Initial backoff in seconds before re-dispatching a task (compaction/stats/index/import) that failed on a worker; doubles on each consecutive failure up to dataCoord.taskRetryBackoffMaxInterval. 0 disables the backoff (legacy behavior: failed tasks are re-dispatched every scheduling tick).
taskRetryBackoffMaxInterval: 60 # Maximum backoff in seconds between re-dispatches of a task that keeps failing on workers.
brokerTimeout: 5000 # 5000ms, dataCoord broker rpc timeout
segmentChange:
stagingTimeout: 3600 # The maximum duration in seconds a segment change group may stay staged before the batch is aborted (STAGED -> ABORTED), bounding unconvergeable or externally-dropped batches.
maxMembersPerGroup: 512 # The maximum number of output segments one segment change group may carry before oversized task outputs are split into sequentially published subgroups.
autoBalance: true # Enable auto balance
checkAutoBalanceConfigInterval: 10 # the interval of check auto balance config
import:
filesPerPreImportTask: 2 # The maximum number of files allowed per pre-import task.
# The retention period in seconds for tasks in the Completed or Failed state.
# Nothing else bounds the terminal set -- maxImportJobNum counts only jobs that are
# neither Completed nor Failed -- so this value alone decides how many finished
# importJob entries stay in etcd, each carrying its schema, file list and options
# plus every preimport and import task under it.
# The 48h default exists for BulkImport idempotency and only for it: the idempotency
# window can extend beyond streaming.walBroadcaster.tombstone.maxLifetime, so a job GC'd
# earlier than its tombstone lets an in-window retry resolve to a jobID that
# GetImportProgress can no longer find. Keep this at >= 2x that lifetime for as long
# as clients send an Idempotency-Key. Twice rather than equal because a tombstone's
# age is measured from the last StreamingCoord start: every restart extends its
# remaining life by up to another maxLifetime, while this retention keeps counting
# from the job's own completion. Equal values hold only for a window with no restart,
# which is not a property a default may assume. Raise it further if StreamingCoord
# restarts more than once inside one tombstone lifetime or WAL checkpoint lag extends
# tombstone retention. No fixed multiple bounds retention during a checkpoint stall.
# A cluster whose clients never send an Idempotency-Key is under no such requirement
# and can lower this freely; 10800 was the default before idempotency keys existed.
taskRetention: 172800
maxSizeInMBPerImportTask: 8192 # To prevent generating of small segments, we will re-group imported files. This parameter represents the sum of file sizes in each group (each ImportTask).
scheduleInterval: 2 # The interval for scheduling import, measured in seconds.
checkIntervalHigh: 2 # The interval for checking import, measured in seconds, is set to a high frequency for the import checker.
checkIntervalLow: 120 # The interval for checking import, measured in seconds, is set to a low frequency for the import checker.
maxImportFileNumPerReq: 1024 # The maximum number of files allowed per single import request.
maxImportJobNum: 1024 # Maximum number of import jobs that are executing or pending.
waitForIndex: true # Indicates whether the import operation waits for the completion of index building.
enableInReplicatingCluster: false # Whether to allow import in a replicating cluster. When enabled, only auto_commit=false imports are accepted.
enableImportV3: false # One-way rollout gate for creating ImportTaskV3 jobs from new ordinary or backup import requests. Keep disabled until all DataNodes and all DataCoords that may become active support Import V3. The gate only selects the version for new requests; persisted WAL messages and jobs always resume with their stored version. Disabling the gate again after activation is unsupported.
enableL0Import: false # Whether to allow importing L0 (delete-only) segments during a binlog/backup import. Disabled by default because restoring L0 segments is incompatible with commit_timestamp (two-phase-commit / replication imports), where it silently breaks delete semantics. Fold the L0 deletes into per-segment deltalogs before restore instead; set to true only to re-enable the legacy L0 import behavior.
# Largest parquet footer, in bytes, that import sizing will read to obtain an exact row count.
# A file declaring a longer footer is rejected at submit. Footer size tracks row_groups * columns, so
# raise this for files written with small row groups, many columns, or untruncated string statistics.
parquetFooterMaxSize: 67108864
fileNumPerSlot: 4 # The files number per slot for pre-import/import task.
memoryLimitPerSlot: 160 # The memory limit (in MB) of buffer size per slot for pre-import/import task.
fragmentSizeInMB: 128 # Target logical size in MiB for one sorted ImportTaskV3 fragment.
fragmentMergeFanIn: 128 # Maximum direct merge fan-in used by ImportTaskV3. Values must be in [2,1024].
reshardResidentBucketCap: 16 # Number of (vchannel, partition) buckets whose full in-flight working set (cap x fragmentSizeInMB) the ImportTaskV3 reshard slot estimate keeps memory-resident as a ceiling, so a job with at most this many buckets can reshard without local spill on an idle node. Beyond the cap the task keeps the SAME whole-task resident budget (cap x fragmentSizeInMB) and, when the total in-memory bytes exceed it, spills the largest bucket first into the DataNode's shared spill log, so a skewed partition hash spends the spill on the hot buckets while cold buckets stay resident. The DataNode's dynamic memory probe may still spill below this ceiling when the real process memory is tight. The cap also bounds per-task slot demand so the task stays schedulable on small nodes.
reshardFlushConcurrency: 2 # Number of fragment writes one ImportTaskV3 reshard task keeps detached and in flight. A full bucket's sort/encode/upload runs on its own goroutine so it overlaps reading and hashing the next batches instead of stalling them. Every detached write holds its fragment input plus one sort copy, so the reshard slot estimate charges this many of them: raising it trades node task concurrency for per-task latency.
reshardMemoryExpansionFactor: 1.65 # Expansion factor applied to an ImportTaskV3 reshard task's whole per-task heap footprint when estimating its memory charge: WorkingSet charges factor x (fixed IO + pipeline + resident buckets + detached fragment inputs + their structural overhead + one sort copy per detached write). It covers the Go runtime headroom and the other growth between the source/flush boundaries the run returns memory at. Must be at least 1.
maxSegmentsPerCopyTask: 100 # Maximum number of segments that can be grouped into a single copy task during snapshot restore.
gracefulStopTimeout: 5 # seconds. force stop node without graceful stop
slot:
clusteringCompactionUsage: 65535 # slot usage of clustering compaction task, setting it to 65536 means it takes up a whole worker.
mixCompactionUsage: 4 # slot usage of mix compaction task.
l0DeleteCompactionUsage: 8 # slot usage of l0 compaction task.
bumpSchemaVersionCompactionUsage: 1 # slot usage of schema bump compaction task.
indexTaskSlotUsage: 64 # Deprecated: unused. Vector task slots are estimated from input, build workspace and output memory.
scalarIndexTaskSlotUsage: 16 # slot usage of scalar index task per 512mb
statsTaskSlotUsage: 8 # slot usage of stats task per 512mb
analyzeTaskSlotUsage: 65535 # slot usage of analyze task
jsonShreddingMaxColumns: 1024 # the max number of columns to shred
jsonShreddingRatioThreshold: 0.3 # the ratio threshold to shred
jsonShreddingWriteBatchSize: 81920 # the batch size to write; values must be positive, otherwise the default is used
ip: # TCP/IP address of dataCoord. If not specified, use the first unicastable address
port: 13333 # TCP port of dataCoord
grpc:
serverMaxSendSize: 536870912 # The maximum size of each RPC request that the dataCoord can send, unit: byte
serverMaxRecvSize: 268435456 # The maximum size of each RPC request that the dataCoord can receive, unit: byte
clientMaxSendSize: 268435456 # The maximum size of each RPC request that the clients on dataCoord can send, unit: byte
clientMaxRecvSize: 536870912 # The maximum size of each RPC request that the clients on dataCoord can receive, unit: byte
dataNode:
dataSync:
flowGraph:
maxQueueLength: 16 # Maximum length of task queue in flowgraph
maxParallelism: 1024 # Maximum number of tasks executed in parallel in the flowgraph
maxParallelSyncMgrTasksPerCPUCore: 16 # The max concurrent sync task number of datanode sync mgr per CPU core
skipMode:
enable: true # Support skip some timetick message to reduce CPU usage
skipNum: 4 # Consume one for every n records skipped
coldTime: 60 # Turn on skip mode after there are only timetick msg for x seconds
ioConcurrency: 0 # Concurrency of the datanode object-storage I/O pool (download/upload for compaction and stats tasks). 0 or negative means auto (CPU*2).
segment:
# The maximum size of each binlog file in a segment buffered in memory. Binlog files whose size exceeds this value are then flushed to MinIO or S3 service.
# Unit: Byte
# Setting this parameter too small causes the system to store a small amount of data too frequently. Setting it too large increases the system's demand for memory.
insertBufSize: 16777216
deleteBufBytes: 16777216 # Max buffer size in bytes to flush del for a single channel, default as 16MB
syncPeriod: 600 # The period to sync segments if buffer is not empty.
memory:
forceSyncEnable: true # Set true to force sync if memory usage is too high
forceSyncSegmentNum: 1 # number of segments to sync, segments with top largest buffer will be synced.
checkInterval: 3000 # the interal to check datanode memory usage, in milliseconds
forceSyncWatermark: 0.5 # memory watermark for standalone, upon reaching this watermark, segments will be synced.
timetick:
interval: 500
channel:
# specify the size of global work pool of all channels
# if this parameter <= 0, will set it as the maximum number of CPUs that can be executing
# suggest to set it bigger on large collection numbers to avoid blocking
workPoolSize: -1
import:
concurrencyPerCPUCore: 4 # The execution concurrency unit for import/pre-import tasks per CPU core.
maxImportFileSizeInGB: 16 # The maximum file size (in GB) for an import file, where an import file refers to either a Row-Based file or a set of Column-Based files.
readBufferSizeInMB: 16 # The base insert buffer size (in MB) during import. The actual buffer size will be dynamically calculated based on the number of shards.
readDeleteBufferSizeInMB: 128 # The delete memory budget (in MB) used for legacy L0 import slot estimation and typed snapshot delete maps. Shared-L0 snapshot tasks use bounded delete batches and pool the per-reader delete allowances for bitmaps in both phases; admission also reserves row buffers and requires an import memory allowance greater than twice this budget.
reshardSpillMaxStreams: 128 # Maximum number of spill files (Arrow IPC streams) one ImportTaskV3 reshard run keeps open. Buckets are mapped to streams by a fixed hash, so every range of one bucket lives in exactly one file and a run with more buckets than streams never opens more files than this cap. A stream file is removed as soon as all of its ranges are consumed; the actual stream count is min(buckets, this value). Must be at least 1.
memoryLimitPercentage: 10 # The percentage of memory limit for import/pre-import tasks.
# Initial backoff interval in seconds for import write retry. Must be a positive integer;
# a non-positive or unparseable value falls back to the default.
writeRetryInitialInterval: 1
# Maximum backoff interval in seconds for import write retry. Must be a positive integer;
# a non-positive or unparseable value falls back to the default. Set it to at least twice
# writeRetryInitialInterval, otherwise the effective cap is raised to twice the initial interval.
writeRetryMaxInterval: 60
copyObjectTimeout: 3600 # Timeout in seconds for copying one object during snapshot restore, including retries.
compaction:
levelZeroBatchMemoryRatio: 0.5 # The minimal memory ratio of free memory for level zero compaction executing in batch mode
levelZeroMaxBatchSize: -1 # Max batch size refers to the max number of L1/L2 segments in a batch when executing L0 compaction. Default to -1, any value that is less than 1 means no limit. Valid range: >= 1.
useMergeSort: true # Whether to enable mergeSort mode when performing mixCompaction.
maxSegmentMergeSort: 30 # The maximum number of segments to be merged in mergeSort mode.
lobHoleRatioThreshold: 0.3 # The hole ratio threshold for TEXT column compaction. If hole_ratio >= threshold, rewrite LOB files; otherwise reuse existing LOB files.
text:
inlineThreshold: 65536 # TEXT values smaller than this threshold (in bytes) are stored inline instead of in LOB files.
maxLobFileBytes: 67108864 # Maximum size of a single LOB file for TEXT column storage (in bytes).
flushThresholdBytes: 16777216 # Flush threshold for TEXT column writer buffer (in bytes).
gracefulStopTimeout: 1800 # seconds. force stop node without graceful stop
slot:
slotCap: 16 # The maximum number of tasks(e.g. compaction, importing) allowed to run concurrently on a datanode
clusteringCompaction:
memoryBufferRatio: 0.3 # The ratio of memory buffer of clustering compaction. Data larger than threshold will be flushed to storage.
workPoolSize: 8 # worker pool size for one clustering compaction job.
bloomFilterApplyParallelFactor: 2 # parallel factor when to apply pk to bloom filter, default to 2*CPU_CORE_NUM
storage:
format: parquet # storage format for insert data, options: [parquet, vortex]
deltalog: json # deltalog format, options: [json, parquet]
jsonStats:
parallelBuild:
maxWorkers: 8 # Maximum number of process-wide JSON Stats Build workers. The effective value is capped by the cgroup-aware CPU count. Values less than or equal to 0 use the safe automatic limit min(CPU, 8).
maxInflightBytes: 536870912 # Process-wide transient memory budget in bytes for materialized JSON Stats Build chunks. The budget is shared by concurrent builds. Lower values reduce peak memory at the cost of parallelism. A chunk larger than the budget is allowed to run exclusively to guarantee progress. Set to 0 to disable the limit.
ip: # TCP/IP address of dataNode. If not specified, use the first unicastable address
port: 21124 # TCP port of dataNode
grpc:
serverMaxSendSize: 536870912 # The maximum size of each RPC request that the dataNode can send, unit: byte
serverMaxRecvSize: 268435456 # The maximum size of each RPC request that the dataNode can receive, unit: byte
clientMaxSendSize: 268435456 # The maximum size of each RPC request that the clients on dataNode can send, unit: byte
clientMaxRecvSize: 536870912 # The maximum size of each RPC request that the clients on dataNode can receive, unit: byte
# This topic introduces the message channel-related configurations of Milvus.
msgChannel:
chanNamePrefix:
# Root name prefix of the channel when a message channel is created.
# It is recommended to change this parameter before starting Milvus for the first time.
# To share a Pulsar instance among multiple Milvus instances, consider changing this to a name rather than the default one for each Milvus instance before you start them.
cluster: by-dev
# Sub-name prefix of the message channel where the root coord publishes time tick messages.
# The complete channel name prefix is ${msgChannel.chanNamePrefix.cluster}-${msgChannel.chanNamePrefix.rootCoordTimeTick}
# Caution: Changing this parameter after using Milvus for a period of time will affect your access to old data.
# It is recommended to change this parameter before starting Milvus for the first time.
rootCoordTimeTick: rootcoord-timetick
# Sub-name prefix of the message channel where the root coord publishes its own statistics messages.
# The complete channel name prefix is ${msgChannel.chanNamePrefix.cluster}-${msgChannel.chanNamePrefix.rootCoordStatistics}
# Caution: Changing this parameter after using Milvus for a period of time will affect your access to old data.
# It is recommended to change this parameter before starting Milvus for the first time.
rootCoordStatistics: rootcoord-statistics
# Sub-name prefix of the message channel where the root coord publishes Data Manipulation Language (DML) messages.
# The complete channel name prefix is ${msgChannel.chanNamePrefix.cluster}-${msgChannel.chanNamePrefix.rootCoordDml}
# Caution: Changing this parameter after using Milvus for a period of time will affect your access to old data.
# It is recommended to change this parameter before starting Milvus for the first time.
rootCoordDml: rootcoord-dml
# Sub-name prefix of the message channel where the query node publishes time tick messages.
# The complete channel name prefix is ${msgChannel.chanNamePrefix.cluster}-${msgChannel.chanNamePrefix.queryTimeTick}
# Caution: Changing this parameter after using Milvus for a period of time will affect your access to old data.
# It is recommended to change this parameter before starting Milvus for the first time.
queryTimeTick: queryTimeTick
# Sub-name prefix of the message channel where the data coord publishes time tick messages.
# The complete channel name prefix is ${msgChannel.chanNamePrefix.cluster}-${msgChannel.chanNamePrefix.dataCoordTimeTick}
# Caution: Changing this parameter after using Milvus for a period of time will affect your access to old data.
# It is recommended to change this parameter before starting Milvus for the first time.
dataCoordTimeTick: datacoord-timetick-channel
# Sub-name prefix of the message channel where the data coord publishes segment information messages.
# The complete channel name prefix is ${msgChannel.chanNamePrefix.cluster}-${msgChannel.chanNamePrefix.dataCoordSegmentInfo}
# Caution: Changing this parameter after using Milvus for a period of time will affect your access to old data.
# It is recommended to change this parameter before starting Milvus for the first time.
dataCoordSegmentInfo: segment-info-channel
subNamePrefix:
# Subscription name prefix of the data coord.
# Caution: Changing this parameter after using Milvus for a period of time will affect your access to old data.
# It is recommended to change this parameter before starting Milvus for the first time.
dataCoordSubNamePrefix: dataCoord
# Subscription name prefix of the data node.
# Caution: Changing this parameter after using Milvus for a period of time will affect your access to old data.
# It is recommended to change this parameter before starting Milvus for the first time.
dataNodeSubNamePrefix: dataNode
# Configures the system log output.
log:
# Milvus log level. Option: trace, debug, info, warn, error, panic, and fatal.
# It is recommended to use debug level under test and development environments, and info level in production environment.
level: info
file:
# Root path to the log files.
# The default value is set empty, indicating to output log files to standard output (stdout) and standard error (stderr).
# If this parameter is set to a valid local path, Milvus writes and stores log files in this path.
# Set this parameter as the path that you have permission to write.
rootPath:
maxSize: 300 # The maximum size of a log file, unit: MB.
maxAge: 10 # The maximum retention time before a log file is automatically cleared, unit: day. The minimum value is 1.
maxBackups: 20 # The maximum number of log files to back up, unit: day. The minimum value is 1.
format: text # Milvus log format. Option: text and JSON
stdout: true # Stdout enable or not
grpc:
log:
level: WARNING
gracefulStopTimeout: 3 # second, time to wait graceful stop finish
client:
compressionEnabled: false
# The compression tier for gRPC messages: fastest, default, better, best.
# snappy and s2 have three tiers rather than four, so fastest and default behave identically for them.
compressionLevel: default
# The gRPC compression algorithm: zstd, snappy, or s2.
# Only zstd is understood by every Milvus version. A node that has not been upgraded yet has no snappy or s2 decompressor
# and rejects those encodings, failing every RPC sent to it, and there is no automatic fallback.
# Change this only after every node in the cluster has been upgraded.
compressionAlgorithm: zstd
# Whether the zstd encoder embeds a per-frame checksum. Off by default: it costs throughput on every message,
# while TCP already checksums the link and zstd's entropy decoding rejects a damaged frame rather than
# returning garbage. Turn it on where a verified end-to-end integrity check on the payload is worth the cost.
# Frames a peer wrote with a checksum are still verified either way.
compressionCRC: false
# Size of the zstd encoder state pool, as a multiple of GOMAXPROCS (default 2). It also sizes the free
# lists every codec parks its per-message writers and readers in, so it is the one ceiling on how much
# memory compression holds.
# Compression always runs inline on the gRPC goroutine handling the RPC; this is not a thread count.
# For the zstd encoder it is the ceiling on how many RPCs may compress at the same time: once every state is
# borrowed, further callers block until one is returned, so too small a pool costs throughput under load.
# Decoding does not draw on it -- an inbound message takes a pooled streaming decoder instead.
# The encoder pool is allocated on the first message this process compresses -- nothing at startup, then all of
# it at once -- and costs this value x GOMAXPROCS x the per-state size: roughly 2.6MB at fastest, 3.6MB at
# default, 6.5MB at better and 36MB at best. Most of a state is its history buffer, which is only allocated
# once that state sees a message above 128KB, so RSS reaches that figure in two steps.
# Raising this at a high compressionLevel is therefore expensive.
compressionConcurrency: 2
dialTimeout: 200
keepAliveTime: 10000
keepAliveTimeout: 20000
maxMaxAttempts: 10
initialBackoff: 0.2
maxBackoff: 10
backoffMultiplier: 2
minResetInterval: 1000
maxCancelError: 32
minSessionCheckInterval: 200
# Configure external tls.
tls:
serverPemPath: configs/cert/server.pem
serverKeyPath: configs/cert/server.key
caPemPath: configs/cert/ca.pem
# Configure internal tls.
internaltls:
serverPemPath: configs/cert/server.pem
serverKeyPath: configs/cert/server.key
caPemPath: configs/cert/ca.pem
sni: localhost # The server name indication (SNI) for internal TLS, should be the same as the name provided by the certificates ref: https://en.wikipedia.org/wiki/Server_Name_Indication
common:
defaultPartitionName: _default # Name of the default partition when a collection is created
defaultIndexName: _default_idx # Name of the index when it is created with name unspecified
indexSliceSize: 16 # Index slice size in MB
threadCoreCoefficient:
highPriority: 10 # This parameter specify how many times the number of threads is the number of cores in high priority pool
middlePriority: 5 # Thread-to-core ratio for the middle priority pool; follows maxThreadsSize.
lowPriority: 1 # This parameter specify how many times the number of threads is the number of cores in low priority pool
maxThreadsSize: 16 # Maximum thread count for the high, middle and low priority pools; only effective when greater than 0. Does not limit the search fanout pool.
buildIndexThreadPoolRatio: 0.75
DiskIndex:
MaxDegree: 56
SearchListSize: 100
PQCodeBudgetGBRatio: 0.125
BuildNumThreadsRatio: 1
SearchCacheBudgetGBRatio: 0.1
LoadNumThreadRatio: 8
BeamWidthRatio: 4
gracefulTime: 5000 # milliseconds. it represents the interval (in ms) by which the request arrival time needs to be subtracted in the case of Bounded Consistency.
gracefulStopTimeout: 1800 # seconds. it will force quit the server if the graceful stop process is not completed during this time.
parquetStatsSkipIndex:
enabled: true # whether to force one row group per cache cell and build the sealed-segment chunk skip index from parquet footer statistics. When enabled, packing is 1:1 even without usable statistics; disabling allows target-size packing. Takes effect only at startup (not refreshable): the flag decides the segment cache cell layout, which must not change while queries are running. Storage v2 segments only; manifest-based (v3) segments do not build this index yet.
storageType: remote # please adjust in embedded Milvus: local, available values are [local, remote], value minio is deprecated, use remote instead
storage:
manifestTransactionRetryLimit: 10 # Maximum number of retry attempts for V3 storage manifest transaction commits on optimistic concurrency conflicts
useArrowFileSystemChunkManager: false # Whether segcore routes chunk manager IO (segment load, index build/load) through the milvus-storage Arrow FileSystem, unified with storage v2. Applies to both remote and local storage types; when false, the legacy chunk managers are used. Not effective for cloudProvider=gcpnative, which always uses the legacy implementation.
stv2:
splitSystemColumn:
enabled: true # enable split system column policy in storage v2
includePK: true # whether split system column policy include pk field
splitByAvgSize:
enabled: true # enable split by average size policy in storage v2
threshold: 1024 # split by average size policy threshold(in bytes) in storage v2
useLoonFFI: false
enableGrowingSourceFlush: false # enable flushing growing segment payload from QueryNode growing source through StorageV3 manifest path
iops:
# Initial ObjectStore request rate used by the Lance AIMD limiter for External Table reads.
# The value must be greater than 0. Values above a positive maxRate are reduced to maxRate.
# The default matches the milvus-storage default.
initialRate: 2000
# Maximum request rate allowed by the Lance AIMD limiter for External Table reads.
# Set to 0 to disable the rate ceiling. This is not a strict aggregate limit across all filesystem instances.
# The default matches the milvus-storage default.
maxRate: 5000
talon:
mode: 0 # Remote milvus-storage read routing: 0 disables Talon, 1 routes all reads through Talon, and 2 routes only small reads. Requires a restart.
enableForExternalTable: false # Apply the configured Talon read routing to remote External Tables when mode is 1 or 2. Requires a restart.
smallReadThreshold: 524288 # Inclusive request size threshold in bytes for Talon mode 2, before EOF clamping. Defaults to 512 KiB. Valid range: [1, 1048576]. Requires a restart.
coordinator: # Talon coordinator address (host:port), required when Talon mode is 1 or 2. Requires a restart.
blockSize: 268435456 # Talon block size in bytes; must be greater than 0. Requires a restart.
maxIdlePerAddr: 256 # Maximum idle TCP connections per peer in each Talon pool. Must be greater than 0; does not limit active connections. Requires a restart.
externalVector:
# Policy for parent-valid external dense-vector rows containing a mix of valid and null child elements.
# Options: error, null. error rejects the row as malformed input; null promotes the whole row to a row-level null when the field is nullable.
# Rows whose child elements are all null are always promoted to row-level null for nullable fields, regardless of this setting.
partialNullPolicy: error
externalSparseVector:
conversionMemoryLimit: 268435456 # Positive byte budget for estimated additional buffers per external sparse-vector normalization call. Includes output, Arrow offsets/validity, sorting and encoding scratch; excludes source data, allocator overhead and other concurrent calls. Ordered Binary arrays reused without conversion are exempt. Requires a restart.
# Default value: auto
# Valid values: [auto, avx512, avx2, avx, sse4_2]
# This configuration is only used by querynode and indexnode, it selects CPU instruction set for Searching and Index-building.
simdType: auto
# This parameter controls the write mode of the local disk, which is used to write temporary data downloaded from remote storage.
# Currently, only QueryNode uses 'common.diskWrite*' parameters. Support for other components will be added in the future.
# The options include 'direct' and 'buffered'. The default value is 'buffered'.
diskWriteMode: buffered
# Disk write buffer size in KB, used for both 'direct' and 'buffered' modes, default is 64KB.
# Current valid range is [4, 65536]. If the value is not aligned to 4KB, it will be rounded up to the nearest multiple of 4KB.
diskWriteBufferSizeKb: 64
# This parameter controls the number of dedicated local file I/O worker threads. The valid range is [0, hardware_concurrency].
# Storage V3 async mmap load uses this pool for Arrow-to-local chunk materialization, file writes, and mmap finalization.
# The same value also limits concurrent synchronous FileWriter disk operations in legacy and index-loading paths.
# For example, set this parameter to 1 to serialize these local file writes.
# The default value is 0, which disables the dedicated pool and the concurrency limit; callers perform local file work directly.
diskWriteNumThreads: 0
diskWriteRateLimiter:
refillPeriodUs: 100000 # refill period in microseconds if disk rate limiter is enabled, default is 100000us (100ms)
avgKBps: 262144 # average kilobytes per second if disk rate limiter is enabled, default is 262144KB/s (256MB/s)
maxBurstKBps: 524288 # max burst kilobytes per second if disk rate limiter is enabled, default is 524288KB/s (512MB/s)
# amplification ratio for high priority tasks if disk rate limiter is enabled, value <= 0 means ratio limit is disabled.
# The ratio is the multiplication factor of the configured bandwidth.
# For example, if the rate limit is 100KB/s, and the high priority ratio is 2, then the high priority tasks will be limited to 200KB/s.
highPriorityRatio: -1
middlePriorityRatio: -1 # amplification ratio for middle priority tasks if disk rate limiter is enabled, value <= 0 means ratio limit is disabled
lowPriorityRatio: -1 # amplification ratio for low priority tasks if disk rate limiter is enabled, value <= 0 means ratio limit is disabled
security:
authorizationEnabled: false
# Whether the metrics port (default 9091) requires root HTTP Basic authentication
# for /management/*, /log/level, /eventlog, /debug/pprof/* and the web console.
# Probes and scrapes remain open; the retired /api/v1/health endpoint is no longer served.
# Requests without Origin or Fetch Metadata must include X-Milvus-Admin-Request: true.
# Use HTTPS for the browser console and preserve Fetch Metadata at the reverse proxy.
# Root hashes are cached for 10 seconds; a failed refresh may reuse the last hash for
# up to 10 minutes after its last fetch, including a password rotated during an outage.
# A Proxy receiving a root credential notification revokes that cached hash and any
# in-flight verification results; it returns 503 if the current hash cannot be fetched.
# Other nodes and Proxies that have not received the notification retain the TTL policy.
# Update graceful-shutdown and profiling clients before enabling. The eventlog gRPC
# stream becomes loopback-only. This port remains plaintext: use a trusted network
# or TLS proxy and rotate root with UpdateCredential, not defaultRootPassword.
# Not settable through /management/config/alter. Watch milvus_admin_auth_total.
adminAuthEnabled: false
# The superusers will ignore some system check processes,
# like the old password verification when updating the credential
superUsers:
# default password for root user. The maximum length is 72 characters.
# Large numeric passwords require double quotes to avoid yaml parsing precision issues.
defaultRootPassword: Milvus
rootShouldBindRole: false # Whether the root user should bind a role when the authorization is enabled.
enablePublicPrivilege: true # Whether to enable public privilege
# Whether to expose the feature usage report at GET /management/feature_usage on the Proxy
# management port. The endpoint requires HTTP Basic Auth as root. See
# docs/design-docs/design_docs/20260902-feature-usage-reporting.md.
featureUsageEnabled: false
# Configured initial Broker URLs for External Tables, including legacy Azure Brokers.
# Redirects follow storage SDK defaults; redirect targets are not checked.
# JSON array string, not a YAML list or comma-separated URLs.
# Example: '["https://broker.example.com/token?scope=a,b"]'
# Empty or [] denies all Brokers. Restart all components after changing this value.
credentialBrokerAllowedEndpoints: "[]"
internaltlsEnabled: false
tlsMode: 0
featureUsage:
# Whether the components count feature usage on their request paths (Proxy, QueryNode)
# and at task creation (DataCoord). One branch and one atomic add per counted feature.
# It is read once at component start; the report endpoint is gated separately by
# common.security.featureUsageEnabled.
countersEnabled: true
session:
ttl: 15 # ttl value when session granting a lease to register service
retryTimes: 30 # retry times when session sending etcd requests
estimate:
varCharLengthAvg: 256 # average length considered per VarChar/Text field when estimating record size
dynamicFieldLengthAvg: 512 # average length considered per JSON/Array/Geometry field when estimating record size
sparseFloatVectorSize: 1200 # fallback size (bytes) used when estimating sparse float vector fields
metrics:
collectionLevelMode: full # controls collection/VChannel-scoped Prometheus metrics: full keeps collection and VChannel values, aggregate replaces them with all and suppresses gauges without a truthful aggregate
locks:
metrics:
enable: false # whether gather statistics for metrics locks
threshold:
info: 500 # minimum milliseconds for printing durations in info level
warn: 1000 # minimum milliseconds for printing durations in warn level
maxWLockConditionalWaitTime: 600 # seconds before logging a wlock conditional wait that is taking long; the wait itself is not bounded by this value
traceLogMode: 0 # trace request info
bloomFilterEnabled: true # whether to load and apply bloom filter/pk stats on querynode
bloomFilterSize: 100000 # bloom filter initial size
bloomFilterType: BlockedBloomFilter # bloom filter type, support BasicBloomFilter and BlockedBloomFilter
maxBloomFalsePositive: 0.001 # max false positive rate for bloom filter
bloomFilterApplyBatchSize: 1000 # batch size when to apply pk to bloom filter
usePartitionKeyAsClusteringKey: false # if true, do clustering compaction and segment prune on partition key field
useVectorAsClusteringKey: false # if true, do clustering compaction and segment prune on vector field
enableVectorClusteringKey: false # if true, enable vector clustering key and vector clustering compaction
localRPCEnabled: false # enable local rpc for internal communication when mix or standalone mode.
# Prefer IPv6 addresses when automatically selecting the local IP.
# If enabled, IPv6 ULA/global addresses will be prioritized ahead of IPv4.
preferIPv6: false
sync:
taskPoolReleaseTimeoutSeconds: 60 # The maximum time to wait for the task to finish and release resources in the pool
nodeScheduler:
maxConcurrencyRatio: 2 # Maximum number of tasks executed concurrently by the process-level node scheduler, expressed as a ratio of CPU cores. Must be greater than zero; 2 by default.
enableFastPB: true # Enable fast protobuf decoding for RPC requests, query results, and search results. Disable to use the standard protobuf decoder.
enabledOptimizeExpr: true # Indicates whether to enable optimize expr
enableDriverPrefetch: false # Indicates whether to enable query driver prefetch in segcore.
enabledJSONShredding: true # Indicates sealedsegment whether to enable JSON key stats
enabledGrowingSegmentJSONShredding: false # Indicates growingsegment whether to enable JSON key stats
enableConfigParamTypeCheck: true # Indicates whether to enable config param type check
enablePosixMode: false # Specifies whether to run in POSIX mode for enhanced file system compatibility
usingJSONShreddingForQuery: true # Indicates whether to use json stats when query
clusterID: 0 # cluster id
fileResource:
mode:
queryNode: sync # File resource mode for query node, options: [sync, close]. Default is sync.
dataNode: sync # File resource mode for data node, options: [sync, ref, close]. Default is sync.
proxy: close # File resource mode for proxy, options: [sync, close]. Default is close.
maxFileSize: 0 # Maximum size of a single file resource accepted by AddFileResource. Set to 0 to disable the admission limit.
downloadTimeout: 5m # Timeout for downloading a single file resource. It accepts duration strings such as 30s or 5m.
cacheTtl: 15m # Idle lease for on-demand analyzer resource files after their last consumer releases them. Accepts duration strings such as 30s or 15m; 0s disables retention. Takes effect on restart.
groupBy:
maxGroups: 100000 # Maximum number of groups allowed in GROUP BY aggregation, enforced both per segment and during cross-segment merge. Exceeding this limit fails the query.
# QuotaConfig, configurations of Milvus quota and limits.
# By default, we enable:
# 1. TT protection;
# 2. Memory protection.
# 3. Disk quota protection.
# You can enable:
# 1. DML throughput limitation;
# 2. DDL, DQL qps/rps limitation;
# 3. DQL Queue length/latency protection;
# 4. DQL result rate protection;
# If necessary, you can also manually force to deny RW requests.
quotaAndLimits:
enabled: true # `true` to enable quota and limits, `false` to disable.
# quotaCenterCollectInterval is the time interval that quotaCenter
# collects metrics from Proxies, Query cluster and Data cluster.
# seconds, (0 ~ 65536)
quotaCenterCollectInterval: 3
# FactorChangeThreshold defines the minimum relative change in factor to trigger an update.
# If the factor change is less than this threshold (e.g., 5%), the update is skipped
# to reduce unnecessary proxy updates. Range: (0, 1]
factorChangeThreshold: 0.05
forceDenyAllDDL: false # true to force deny all DDL requests, false to allow.
limits:
allocRetryTimes: 15 # retry times when delete alloc forward data from rate limit failed
allocWaitInterval: 1000 # retry wait duration when delete alloc forward data rate failed, in millisecond
complexDeleteLimitEnable: false # whether complex delete check forward data by limiter
maxCollectionNum: 65536
maxCollectionNumPerDB: 65536 # Maximum number of collections per database.
# maximum protobuf size of the Proxy-side materialized insert message, in bytes,
# for both insert and upsert; -1 means no limit. The check runs after Proxy field
# materialization, including generated fields, row IDs, timestamps, namespace data,
# and partial-upsert query reconstruction. It does not include later streaming-message
# properties, encryption expansion, StreamingNode-generated function fields, or the
# broker envelope.
maxInsertSize: 67108864
# maximum protobuf size of each Proxy-side materialized delete message, in bytes,
# for both delete and upsert tombstones; -1 means no limit. The check runs after
# primary keys and timestamps are materialized and routed to a vchannel. It does
# not include later streaming-message properties, encryption expansion, chunk
# markers, or the broker envelope.
maxDeleteSize: 16777216
maxResourceGroupNumOfQueryNode: 1024 # maximum number of resource groups of query nodes
maxGroupSize: 10 # maximum size for one single group when doing search group by
ddl:
enabled: false # Whether DDL request throttling is enabled.
# Maximum number of collection-related DDL requests per second.
# Setting this item to 10 indicates that Milvus processes no more than 10 collection-related DDL requests per second, including collection creation requests, collection drop requests, collection load requests, and collection release requests.
# To use this setting, set quotaAndLimits.ddl.enabled to true at the same time.
collectionRate: -1
# Maximum number of partition-related DDL requests per second.
# Setting this item to 10 indicates that Milvus processes no more than 10 partition-related requests per second, including partition creation requests, partition drop requests, partition load requests, and partition release requests.
# To use this setting, set quotaAndLimits.ddl.enabled to true at the same time.
partitionRate: -1
db:
collectionRate: -1 # qps of db level , default no limit, rate for CreateCollection, DropCollection, LoadCollection, ReleaseCollection
partitionRate: -1 # qps of db level, default no limit, rate for CreatePartition, DropPartition, LoadPartition, ReleasePartition
indexRate:
enabled: false # Whether index-related request throttling is enabled.
# Maximum number of index-related requests per second.
# Setting this item to 10 indicates that Milvus processes no more than 10 partition-related requests per second, including index creation requests and index drop requests.
# To use this setting, set quotaAndLimits.indexRate.enabled to true at the same time.
max: -1
db:
max: -1 # qps of db level, default no limit, rate for CreateIndex, DropIndex
flushRate:
enabled: true # Whether flush request throttling is enabled.
# Maximum number of flush requests per second.
# Setting this item to 10 indicates that Milvus processes no more than 10 flush requests per second.
# To use this setting, set quotaAndLimits.flushRate.enabled to true at the same time.
max: -1
collection:
max: 1 # Maximum number of flush requests per second for each collection.
db:
max: -1 # qps of db level, default no limit, rate for flush
compactionRate:
enabled: false # Whether manual compaction request throttling is enabled.
# Maximum number of manual-compaction requests per second.
# Setting this item to 10 indicates that Milvus processes no more than 10 manual-compaction requests per second.
# To use this setting, set quotaAndLimits.compaction.enabled to true at the same time.
max: -1
db:
max: -1 # qps of db level, default no limit, rate for manualCompaction
dbRate:
enabled: false # Whether DB request throttling is enabled
# Maximum number of db-related requests per second.
# Setting this item to 10 indicates that Milvus processes no more than 10 db-related requests per second, including db creation/drop/alter requests.
# To use this setting, set quotaAndLimits.dbRate.enabled to true at the same time.
#
max: -1
dml:
enabled: false # Whether DML request throttling is enabled.
insertRate:
# Highest data insertion rate per second.
# Setting this item to 5 indicates that Milvus only allows data insertion at the rate of 5 MB/s.
# To use this setting, set quotaAndLimits.dml.enabled to true at the same time.
max: -1
db:
max: -1 # MB/s, default no limit
collection:
# Highest data insertion rate per collection per second.
# Setting this item to 5 indicates that Milvus only allows data insertion to any collection at the rate of 5 MB/s.
# To use this setting, set quotaAndLimits.dml.enabled to true at the same time.
max: -1
partition:
max: -1 # MB/s, default no limit
deleteRate:
# Highest data deletion rate per second.
# Setting this item to 0.1 indicates that Milvus only allows data deletion at the rate of 0.1 MB/s.
# To use this setting, set quotaAndLimits.dml.enabled to true at the same time.
max: -1
db:
max: -1 # MB/s, default no limit
collection:
# Highest data deletion rate per second.
# Setting this item to 0.1 indicates that Milvus only allows data deletion from any collection at the rate of 0.1 MB/s.
# To use this setting, set quotaAndLimits.dml.enabled to true at the same time.
max: -1
partition:
max: -1 # MB/s, default no limit
bulkLoadRate:
max: -1 # MB/s, default no limit, not support yet. TODO: limit bulkLoad rate
db:
max: -1 # MB/s, default no limit, not support yet. TODO: limit db bulkLoad rate
collection:
max: -1 # MB/s, default no limit, not support yet. TODO: limit collection bulkLoad rate
partition:
max: -1 # MB/s, default no limit, not support yet. TODO: limit partition bulkLoad rate
dql:
enabled: false # Whether DQL request throttling is enabled.
searchRate:
# Maximum number of vectors to search per second.
# Setting this item to 100 indicates that Milvus only allows searching 100 vectors per second no matter whether these 100 vectors are all in one search or scattered across multiple searches.
# To use this setting, set quotaAndLimits.dql.enabled to true at the same time.
max: -1
db:
max: -1 # vps (vectors per second), default no limit
collection:
# Maximum number of vectors to search per collection per second.
# Setting this item to 100 indicates that Milvus only allows searching 100 vectors per second per collection no matter whether these 100 vectors are all in one search or scattered across multiple searches.
# To use this setting, set quotaAndLimits.dql.enabled to true at the same time.
max: -1
partition:
max: -1 # vps (vectors per second), default no limit
queryRate:
# Maximum number of queries per second.
# Setting this item to 100 indicates that Milvus only allows 100 queries per second.
# To use this setting, set quotaAndLimits.dql.enabled to true at the same time.
max: -1
db:
max: -1 # qps, default no limit
collection:
# Maximum number of queries per collection per second.
# Setting this item to 100 indicates that Milvus only allows 100 queries per collection per second.
# To use this setting, set quotaAndLimits.dql.enabled to true at the same time.
max: -1
partition:
max: -1 # qps, default no limit
limitWriting:
# forceDeny false means dml requests are allowed (except for some
# specific conditions, such as memory of nodes to water marker), true means always reject all dml requests.
forceDeny: false
ttProtection:
enabled: false
# maxTimeTickDelay indicates the backpressure for DML Operations.
# DML rates would be reduced according to the ratio of time tick delay to maxTimeTickDelay,
# if time tick delay is greater than maxTimeTickDelay, all DML requests would be rejected.
# seconds
maxTimeTickDelay: 1200
memProtection:
# When memory usage > memoryHighWaterLevel, all dml requests would be rejected;
# When memoryLowWaterLevel < memory usage < memoryHighWaterLevel, reduce the dml rate;
# When memory usage < memoryLowWaterLevel, no action.
enabled: true
dataNodeMemoryLowWaterLevel: 0.85 # (0, 1], memoryLowWaterLevel in DataNodes
dataNodeMemoryHighWaterLevel: 0.95 # (0, 1], memoryHighWaterLevel in DataNodes
queryNodeMemoryLowWaterLevel: 0.85 # (0, 1], memoryLowWaterLevel in QueryNodes
queryNodeMemoryHighWaterLevel: 0.95 # (0, 1], memoryHighWaterLevel in QueryNodes
growingSegmentsSizeProtection:
# No action will be taken if the growing segments size is less than the low watermark.
# When the growing segments size exceeds the low watermark, the dml rate will be reduced,
# but the rate will not be lower than minRateRatio * dmlRate.
enabled: false
minRateRatio: 0.5
lowWaterLevel: 0.2
highWaterLevel: 0.4
diskProtection:
enabled: true # When the total file size of object storage is greater than `diskQuota`, all dml requests would be rejected;
diskQuota: -1 # MB, (0, +inf), default no limit
loadedDiskQuota: -1 # MB, (0, +inf), default no limit
diskQuotaPerDB: -1 # MB, (0, +inf), default no limit
diskQuotaPerCollection: -1 # MB, (0, +inf), default no limit
diskQuotaPerPartition: -1 # MB, (0, +inf), default no limit
l0SegmentsRowCountProtection:
enabled: false # switch to enable l0 segment row count quota
lowWaterLevel: 30000000 # l0 segment row count quota, low water level
highWaterLevel: 50000000 # l0 segment row count quota, high water level
deleteBufferRowCountProtection:
enabled: false # switch to enable delete buffer row count quota
lowWaterLevel: 32768 # delete buffer row count quota, low water level
highWaterLevel: 65536 # delete buffer row count quota, high water level
deleteBufferSizeProtection:
enabled: false # switch to enable delete buffer size quota
lowWaterLevel: 134217728 # delete buffer size quota, low water level
highWaterLevel: 268435456 # delete buffer size quota, high water level
limitReading:
# forceDeny false means dql requests are allowed (except for some
# specific conditions, such as collection has been dropped), true means always reject all dql requests.
forceDeny: false
trace:
# trace exporter type, default is stdout,
# optional values: ['noop','stdout', 'jaeger', 'otlp']
exporter: noop
# fraction of traceID based sampler,
# optional values: [0, 1]
# Fractions >= 1 will always sample. Fractions < 0 are treated as zero.
sampleFraction: 0
jaeger:
url: # when exporter is jaeger should set the jaeger's URL
otlp:
endpoint: # example: "127.0.0.1:4317" for grpc, "127.0.0.1:4318" for http
method: # otlp export method, acceptable values: ["grpc", "http"], using "grpc" by default
secure: true
headers: # otlp header that encoded in base64
initTimeoutSeconds: 10 # segcore initialization timeout in seconds, preventing otlp grpc hangs forever
#when using GPU indexing, Milvus will utilize a memory pool to avoid frequent memory allocation and deallocation.
#here, you can set the size of the memory occupied by the memory pool, with the unit being MB.
#note that there is a possibility of Milvus crashing when the actual memory demand exceeds the value set by maxMemSize.
#if initMemSize and MaxMemSize both set zero,
#milvus will automatically initialize half of the available GPU memory,
#maxMemSize will the whole available GPU memory.
gpu:
initMemSize: 2048 # Gpu Memory Pool init size
maxMemSize: 4096 # Gpu Memory Pool Max size
overloadedMemoryThresholdPercentage: 95
# Any configuration related to the streaming node server.
streamingNode:
ip: # TCP/IP address of streamingNode. If not specified, use the first unicastable address
port: 22222 # TCP port of streamingNode
grpc:
serverMaxSendSize: 268435456 # The maximum size of each RPC request that the streamingNode can send, unit: byte
serverMaxRecvSize: 268435456 # The maximum size of each RPC request that the streamingNode can receive, unit: byte
clientMaxSendSize: 268435456 # The maximum size of each RPC request that the clients on streamingNode can send, unit: byte
clientMaxRecvSize: 268435456 # The maximum size of each RPC request that the clients on streamingNode can receive, unit: byte
# Any configuration related to query views.
queryView:
idfOracle:
lazyLoadSealedStats: false # Whether QueryView IDF runtimes defer sealed BM25 resource discovery and stats materialization until the first BM25 search.
sealedStatsLoadConcurrencyRatio: 4 # Maximum process-wide concurrency for loading sealed BM25 stats, expressed as a ratio of CPU cores.
leaseDuration: 5s # Renewable SN Up-view retention after query access. Delays normal Down; non-positive durations disable timed retention. Not refreshable.
logicalSize:
source: rowCount # LogicalSize source: rowCount uses physical rows; insertBytes uses ceil(segment insert_binlog_size / bytesPerUnit). Unsupported values use rowCount. Missing size falls back to rows, then segmentBaseCost is added. Sampled once when the DataView manager is initialized; requires coordinator restart.
bytesPerUnit: 64KB # Bytes per logical unit for the insertBytes source, parsed as a size (for example 64KB or 1MB). Non-positive or invalid values use 64KB. Sampled once when the DataView manager is initialized; requires coordinator restart. Missing segment size estimates one unit per physical row.
segmentBaseCost: 16 # Non-negative fixed cost in logical units added to physical rows or normalized segment bytes when building each new DataView LogicalSize. Changes apply on the next DataView update, never to existing snapshots. Invalid values retain the last valid sampled cost; zero disables the fixed cost.
balancer:
reconcileInterval: 1m # Positive duration with a unit between periodic reconciles. Decrease for faster convergence and more coordinator work; increase to reduce scan frequency. Events reconcile independently.
optimization:
enabled: true # Enables optional placement optimization. Disable to stop optional movement; mandatory recovery, version updates and releases continue independently of queryCoord.autoBalance.
minScoreGain: 1 # Positive minimum net weighted score gain after movement and loading costs for optional optimization. Increase to reject marginal moves; decrease to accept smaller improvements.
maxCandidateEvaluationsPerShard: 100000 # Positive maximum optional candidate evaluations per shard pass. Increase to search more candidates at higher CPU cost; decrease to yield earlier and continue on a later reconcile. Mandatory placement is not capped.
scoring:
targetLogicalSizePerNode: 100000 # Positive concentration scale in logical size units for preferred shard fanout and the collection concentration floor. Increase to favor fewer participants; decrease to favor spreading. Not a capacity limit.
resourceGroup:
weight: 1 # Weight of RG load-band improvement. Increase to favor reducing aggregate logical-size skew over local concentration and loading cost.
relativeTolerance: 0.1 # Fractional RG load tolerance, in [0,1). Increase to accept more relative skew and reduce movement; decrease to pursue closer logical-size balance.
absoluteTolerance: 100000 # Positive minimum RG tolerance in logical size units. Increase to keep tiny shards concentrated at low total volume; decrease to rebalance smaller absolute load differences.
concentration:
shardWeight: 1 # Weight of excess shard logical size units on one node. Increase to spread large shards more strongly; small shards within their preferred footprint receive no spreading reward.
collectionWeight: 1 # Weight of excess collection-replica logical size units on one node. Increase to distribute large collections made of many small shards more evenly.
relativeTolerance: 0.1 # Fractional allowance above shard and collection concentration targets. Increase to retain more concentrated layouts; decrease to spread large data more strongly.
fanout:
weight: 1 # Weight of net excess shard fanout. Increase to favor consolidation and fewer query participants; decrease to permit wider spreading.
hysteresis: 0.1 # Fractional growth/shrink margin for preferred fanout, in [0,1). Increase to reduce fanout changes near size boundaries; decrease to react sooner to data growth and shrinkage.
movement:
moveCostPerUnit: 0.02 # Cost multiplier on published LogicalSize whose node changes. Increase to reduce movement; decrease to accept smaller placement improvements, even when destination resources already exist.
loadCostPerUnit: 0.08 # Additional cost multiplier on logical size units needing a compatible destination load. Increase to favor protected ready-resource reuse; decrease to favor balance despite additional loading.
# Any configuration related to the streaming service.
streaming:
schemaCacheTTL: 900 # Idle lifetime in seconds of cached schema bodies. Non-positive values disable schema body retention.
queryView:
liveEventDispatchConcurrencyRatioPerPChannel: 0.25 # QueryRuntime live-event worker count per PChannel is max(1, floor(CPU count * ratio)). Updates existing worker pools dynamically.
# Whether StreamingNode splits oversized logical messages into physical WAL records.
# Enable this on every StreamingNode and confirm the live update before disabling proxy.splitChunk.
# Once chunk records have been written, do not roll StreamingNode back to a version that cannot reassemble them. Both parameters support live refresh.
splitChunkSN: false
walBalancer:
# The interval of balance task trigger at background, 1 min by default.
# It's ok to set it into duration string, such as 30s or 1m30s, see time.ParseDuration
triggerInterval: 1m
# The initial interval of balance task trigger backoff, 10 ms by default.
# It's ok to set it into duration string, such as 30s or 1m30s, see time.ParseDuration
backoffInitialInterval: 10ms
backoffMultiplier: 2 # The multiplier of balance task trigger backoff, 2 by default
# The max interval of balance task trigger backoff, 5s by default.
# It's ok to set it into duration string, such as 30s or 1m30s, see time.ParseDuration
backoffMaxInterval: 5s
# The timeout of wal balancer operation, 30m by default.
# If the operation exceeds this timeout, it will be canceled.
operationTimeout: 30m
# The wait time before assigning the pchannels of a streaming node that has left the session view to another streaming node, 5s by default.
# It's ok to set it into duration string, such as 30s or 1m30s, see time.ParseDuration
# It gives the old streaming node time to exit before another streaming node writes to the same wal.
# It lowers the chance of two writers on one wal but does not rule it out. 0 disables the wait.
nodeLostGracePeriod: 5s
balancePolicy:
name: vchannelFair # The multiplier of balance task trigger backoff, 2 by default
# Whether to allow rebalance, true by default.
# If the rebalance is not allowed, only the lost wal recovery will be executed, the rebalance (move a pchannel from one node to another node) will be skipped.
allowRebalance: true
minRebalanceIntervalThreshold: 5m # The max interval of rebalance for each wal, 5m by default.
# The threshold of recovery lag for rebalance, 1s by default.
# If the recovery lag is greater than this threshold, the rebalance of current pchannel is not allowed.
allowRebalanceRecoveryLagThreshold: 1s
vchannelFair:
# The weight of pchannel count in vchannelFair balance policy,
# the pchannel count will more evenly distributed if the weight is greater, 0.4 by default
pchannelWeight: 0.4
# The weight of vchannel count in vchannelFair balance policy,
# the vchannel count will more evenly distributed if the weight is greater, 0.3 by default
vchannelWeight: 0.3
# The weight of affinity in vchannelFair balance policy,
# the fewer VChannels belonging to the same Collection between two PChannels, the higher the affinity,
# the vchannel of one collection will more evenly distributed if the weight is greater, 0.01 by default
antiAffinityWeight: 0.01
# The tolerance of vchannelFair balance policy, if the score of two balance result is less than the tolerance,
# the balance result will be ignored, the lower tolerance, the sensitive rebalance, 0.01 by default
rebalanceTolerance: 0.01
# Indicates how many pchannels will be considered as a batch for rebalancing,
# the larger step, more aggressive and accurate rebalance,
# it also determine the depth of depth first search method that is used to find the best balance result, 3 by default
rebalanceMaxStep: 3
walBroadcaster:
concurrencyRatio: 4 # The concurrency ratio based on number of CPU for wal broadcaster, 4 by default.
txn:
defaultKeepaliveTimeout: 10s # The default keepalive timeout for wal txn, 10s by default
walWriteAheadBuffer:
capacity: 64m # WAB cache capacity. Capacity/keepalive eviction only removes records consumed by RecoveryStorage and preserves the durable catchup anchor. Also scales walRateLimit.writeAheadBuffer.slowdownRatio.
keepalive: 30s # WAB cache TTL. Expired records are evictable only after RecoveryStorage consumes them; the durable catchup anchor is retained.
walReadAheadBuffer:
# The buffer length (pending message count) of read ahead buffer of each wal scanner can be used, 128 by default.
# Higher one will increase the throughput of wal message handling, but introduce higher memory utilization.
# Use the underlying wal default value if 0 is given.
length: 128
logging:
# The threshold of slow log, 1s by default.
# If the wal implementation is woodpecker, the minimum threshold is 3s
appendSlowThreshold: 1s
flush:
# The threshold of memory usage for one streaming node,
# If the memory usage is higher than this threshold, the node will try to trigger flush action to decrease the total of growing segment until growingSegmentBytesLwmThreshold,
# the value should be in the range of (0, 1), 0.6 by default.
memoryThreshold: 0.6
# The high watermark of total growing segment bytes for one streaming node,
# If the total bytes of growing segment is greater than this threshold,
# a flush process will be triggered to decrease total bytes of growing segment until growingSegmentBytesLwmThreshold, 0.2 by default
growingSegmentBytesHwmThreshold: 0.2
# The lower watermark of total growing segment bytes for one streaming node,
# growing segment flush process will try to flush some growing segment into sealed
# until the total bytes of growing segment is less than this threshold, 0.1 by default.
growingSegmentBytesLwmThreshold: 0.1
l0:
# The max lifetime of l0 segment, 10 minutes by default.
# If the l0 segment is older than this time, it will be flushed.
maxLifetime: 10m
# The max row num of l0 segment, 500000 by default.
# If the row num of l0 segment is greater than this num, it will be flushed.
maxRowNum: 500000
# The max size of l0 segment, 32m by default.
# If the binary size of l0 segment is greater than this size, it will be flushed.
maxSize: 32m
summary:
cacheBytesPerPChannel: 64MB # Encoded WALSummary chunk cache budget per PChannel. Zero disables residency. Indexes, in-flight reads and decoded delivery batches are accounted separately. Applied when the WAL opens.
walRecovery:
# The interval of persist recovery info, 10s by default.
# Every the interval, the recovery info of wal will try to persist, and the checkpoint of wal can be advanced.
# Currently it only affect the recovery of wal, but not affect the recovery of data flush into object storage
persistInterval: 10s
# The max dirty message count of wal recovery, 100 by default.
# If there are more than this count of dirty message in wal recovery info, it will be persisted immediately,
# but not wait for the persist interval.
maxDirtyMessage: 100
# Deprecated. RecoveryStorage no longer persists recovery metadata during close.
# This no-op setting is retained so existing configurations remain loadable.
gracefulCloseTimeout: 3s
tail:
lowWatermark: 4g # RecoveryStorage releases WAL append pressure after the unpublished WAL tail falls to this logical size.
softWatermark: 8g # RecoveryStorage requests VChannel persistence and slows WAL append after the unpublished WAL tail reaches this logical size.
highWatermark: 16g # RecoveryStorage rejects new DML append after the unpublished WAL tail reaches this logical size.
transformLog:
catchupConcurrencyRatioPerPChannel: 0.25 # TransformLog catch-up worker count for each consumer's PChannel stream is max(1, floor(CPU count * ratio)). Updates existing worker pools dynamically.
replication:
pendingMessagesQueueLength: 128 # The capacity of pending message queue for each replication stream client.
pendingMessagesQueueMaxSize: 134217728 # The maximum size (in bytes) of pending message queue for each replication stream client. Default is 128MB.
# Any configuration related to the knowhere vector search engine
knowhere:
enable: true # When enable this configuration, the index parameters defined following will be automatically populated as index parameters, without requiring user input.
AISAQ:
build:
max_degree: 56 # Maximum degree of the Vamana graph
pq_code_budget_gb_ratio: 0.125 # Size limit on the PQ code (compared with raw data)
search_list_size: 100 # Size of the candidate list during building graph
search:
beam_width_ratio: 4 # Ratio between the maximum number of IO requests per search iteration and CPU number
DISKANN:
build:
max_degree: 56 # Maximum degree of the Vamana graph
pq_code_budget_gb_ratio: 0.125 # Size limit on the PQ code (compared with raw data)
search_cache_budget_gb_ratio: 0.1 # Ratio of cached node numbers to raw data
search_list_size: 100 # Size of the candidate list during building graph
search:
beam_width_ratio: 4 # Ratio between the maximum number of IO requests per search iteration and CPU number
# credential configs, support apikey, AKSK, gcp credential
# examples:
# credential:
# your_apikey_crendential_name:
# apikey: # Your apikey credential
# your_aksk_crendential_name:
# access_key_id:
# secret_access_key:
# your_gcp_credential_name:
# credential_json:
credential:
aksk1:
access_key_id: # Your access_key_id
secret_access_key: # Your secret_access_key
apikey1:
apikey: # Your apikey credential
gcp1:
credential_json: # base64 based gcp credential data
# Any configuration related to functions
function:
grep:
maxArgumentBytes: 65536 # Maximum byte length of GrepOp arguments. Invalid or non-positive values fall back to 65536. Changes apply to newly prepared operators.
maxRegexBytes: 10485760 # Regex engine compiled-program size budget in bytes. Invalid or non-positive values fall back to 10485760. Changes apply to newly prepared operators.
maxDFACacheBytes: 8388608 # Regex engine DFA cache budget in bytes; not an aggregate process memory limit. Invalid or non-positive values fall back to 8388608. Changes apply to newly prepared operators.
batchSize: 128 # Candidate text rows per Grep read batch, independent of the matching limit. Invalid or non-positive configuration falls back to 128. Changes apply to newly prepared operators.
maxScanRows: 0 # Maximum candidate offsets returned per segment for Grep after filter and MVCC. 0 disables the row cap; invalid or negative configuration falls back to 0. A positive cap truncates candidate selection and logs a warning when more candidates may remain; Grep results may be incomplete. Changes apply to newly enabled candidate plans.
model:
requestTimeout: 30s # Global timeout for external model requests, e.g. 30s. Function param timeout_ms overrides it.
textEmbedding:
providers:
azure_openai:
credential: # The name in the crendential configuration item
enable: true # Whether to enable azure openai model service
resource_name: # Your azure openai resource name
url: # Your azure openai embedding url, Default is the official embedding url
bedrock:
credential: # The name in the crendential configuration item
enable: true # Whether to enable bedrock model service
cohere:
credential: # The name in the crendential configuration item
enable: true # Whether to enable cohere model service
url: # Your cohere embedding url, Default is the official embedding url
dashscope:
credential: # The name in the crendential configuration item
enable: true # Whether to enable dashscope model service
url: # Your dashscope embedding url, Default is the official embedding url
gemini:
credential: # The name in the credential configuration item
enable: true # Whether to enable Gemini model service
url: # Your Gemini embedding url, Default is the official embedding url
huggingface:
credential: # The name in the credential configuration item
enable: true # Whether to enable Hugging Face text embedding service
url: # Your Hugging Face Inference Providers router URL, default is https://router.huggingface.co
openai:
credential: # The name in the crendential configuration item
enable: true # Whether to enable openai model service
url: # Your openai embedding url, Default is the official embedding url
siliconflow:
credential: # The name in the crendential configuration item
enable: true # Whether to enable siliconflow model service
url: # Your siliconflow embedding url, Default is the official embedding url
tei:
credential: # The name in the crendential configuration item
enable: true # Whether to enable TEI model service
vertexai:
credential: # The name in the crendential configuration item
enable: true # Whether to enable vertexai model service
url: # Your VertexAI embedding url
voyageai:
credential: # The name in the crendential configuration item
enable: true # Whether to enable voyageai model service
url: # Your voyageai embedding url, Default is the official embedding url
yc:
credential: # The name in the credential configuration item
enable: true # Whether to enable Yandex Cloud model service
url: # Your Yandex Cloud text embedding url, Default is the official text embedding url
rerank:
model:
providers:
cohere:
credential: # The name in the crendential configuration item
enable: true # Whether to enable cohere model service
url: # Your cohere rerank url, Default is the official rerank url
huggingface:
credential: # The name in the credential configuration item
enable: true # Whether to enable Hugging Face rerank service
url: # Your Hugging Face Inference Providers router URL, default is https://router.huggingface.co
siliconflow:
credential: # The name in the crendential configuration item
enable: true # Whether to enable siliconflow model service
url: # Your siliconflow rerank url, Default is the official rerank url
tei:
credential: # The name in the crendential configuration item
enable: true # Whether to enable TEI rerank service
vllm:
credential: # The name in the crendential configuration item
enable: true # Whether to enable vllm rerank service
voyageai:
credential: # The name in the crendential configuration item
enable: true # Whether to enable voyageai model service
url: # Your voyageai rerank url, Default is the official rerank url
analyzer:
local_resource_path: /var/lib/milvus/analyzer
concurrency_per_cpu_core: 8 # The concurrency per cpu core for analyzer, pipeline not included
runner_concurrency: 8 # The concurrency for each function runner to tokenize text
pyUDF:
enabled: false # Whether to enable PyUDF in processes that use it. Enabling it on Proxy also requires common.fileResource.mode.proxy: sync. Restart is required after changing this value.
address: 127.0.0.1:19090 # Shared local IPv4 address and port of the PyUDF workers. Keep on loopback or a trusted, access-controlled network; the worker endpoint has no TLS or authentication. Restart is required after changing this value.
rpcTimeout: 30s # Deadline for one PyUDF Execute call, including serialization. Range: 5s to 300s, in whole milliseconds; invalid values log an error and use 30s. Restart is required after changing this value.
connectionPoolSize: 10 # Number of reused client connections; this does not limit concurrent RPCs. Restart is required after changing this value.
maxMessageBytes: 67108864 # Maximum serialized size of one PyUDF gRPC message in bytes. Restart is required after changing this value.
server:
workerCount: 1 # Number of Python worker processes sharing the configured address. Restart is required after changing this value.
grpcConcurrency: 10 # Per-worker gRPC executor threads. Restart is required after changing this value.
maxConcurrentRPCs: 100 # Maximum in-flight RPCs per Python worker, including requests waiting in the gRPC executor. Restart is required after changing this value.
shutdownTimeout: 30s # Python worker termination escalation deadline. Range: 5s to 60s, in whole milliseconds; invalid values log an error and use 30s. Restart is required after changing this value.