Milvus 核心参数与核心机制

配置层级关系

milvus.yaml          ← 主配置文件(Milvus 镜像内置默认值)
    │
    └── user.yaml    ← 用户覆盖配置(优先级最高,覆盖 milvus.yaml)
         │
         └── 环境变量  ← 部分参数可通过环境变量注入
                        (如 ETCD_ENDPOINTS、MINIO_ADDRESS)

配置加载顺序(后者覆盖前者):

  1. 代码内置默认值
  2. milvus.yaml(镜像内 /milvus/configs/milvus.yaml
  3. user.yaml(用户映射 /milvus/configs/user.yaml
  4. 环境变量(仅部分参数支持)

挂载自定义配置

# docker-compose.yml 中的配置挂载
services:
  standalone:
    volumes:
      # 方式1:挂载完整的 milvus.yaml(完全替换)
      - ./my_milvus.yaml:/milvus/configs/milvus.yaml

      # 方式2:挂载 user.yaml(仅覆盖需要修改的参数,推荐)
      - ./user.yaml:/milvus/configs/user.yaml
# Docker run 方式挂载配置
docker run -d --name milvus-standalone \
  -p 19530:19530 -p 9091:9091 \
  -v /host/path/user.yaml:/milvus/configs/user.yaml \
  milvusdb/milvus:v2.6.16 milvus run standalone

查看当前运行时配置

# 进入容器查看完整配置
docker exec -it milvus-standalone cat /milvus/configs/milvus.yaml

# 查看特定配置段
docker exec milvus-standalone cat /milvus/configs/milvus.yaml | grep -A 20 "^proxy:"

# 查看合并后的运行时参数(通过 API)
curl -s http://localhost:9091/api/v1/health

核心参数分类详解

milvus.yaml 配置

  • 依赖组件配置
    • etcd—元数据存储与服务发现
    • minio— S3 兼容对象存储(binlog +索引文件持久化)
    • mq —消息队列:rocksmq(SD默认) / pulsar / kafka / woodpecker
  • 自身组件配置
    • proxy / rootCoord / queryCoord / queryNode
    • dataCoord / dataNode / indexCoord / indexNode
  • 通用功能配置
    • common(安全/多租户/TLS)/quotaAndLimits(配额限流)/log(日志)

如果要理解这块,得了解Milvus的架构:

image-20260715212651555

  1. 流节点 (StreamingNode) = 逻辑功能, 没有专门的配置 。它的功能分布融合在了 datanodequerynode 上。所有 Worker Node(包含 QueryNode/DataNode)都可以视为 Streaming Node在物理部署上,它则表现为独立的 QueryNode 和 DataNode 进程。

  2. IndexNode 的角色被 DataNode 替代

  3. 独立的 coord 配置项也被融合querycoordindexcoord 在较新版本中也已合并,不再单独配置。

本质可以通过以下命令去快速定位到对应的模块

# 查看特定配置段
docker exec milvus-standalone cat /milvus/configs/milvus.yaml | grep -A 20 "^proxy:"
docker exec milvus-standalone cat /milvus/configs/milvus.yaml | grep -A 20 "^etcd:"

不过这里要查看,有更好的方式。我把Milvus 这种 milvus.yaml 复制出来,给大家查看!

# 假设容器名为 milvus-standalone
docker cp milvus-standalone:/milvus/configs/milvus.yaml /home/milvus.yaml

image.png

依赖组件参数

etcd — 元数据存储

etcd 是 Milvus 的元数据大脑,存储所有 Collection Schema、索引元数据、Segment 状态、节点拓扑信息。

etcd:
  endpoints:
    - etcd:2379              # etcd 服务地址(Standalone 模式下 localhost:2379)
  rootPath: by-dev           # Milvus 数据在 etcd 中的键前缀(多实例隔离用)
  metaSubPath: meta          # 元数据子路径
  kvSubPath: kv              # 键值数据子路径
  requestTimeout: 10000      # 请求超时(毫秒)
  dialTimeout: 10000         # 连接超时(毫秒)
  use:
    embed: false             # Standalone 是否使用内嵌 etcd
  auth:
    enabled: false           # 是否启用 etcd 认证
    userName: ""             # etcd 用户名
    password: ""             # etcd 密码
  ssl:
    enabled: false           # 是否启用 TLS
参数 默认值 说明 调优建议
endpoints ["localhost:2379"] etcd 地址列表 生产环境建议 3 节点 etcd 集群
rootPath by-dev 数据前缀 多环境隔离时修改此项
requestTimeout 10000 请求超时 ms 网络延迟大时适当增大
use.embed false 内嵌模式 Standalone embed 版自动设为 true

minio — 对象存储

MinIO/S3 负责存储所有持久化的向量数据,包括 binlog(数据日志)、index(索引文件)、delta_log(删除日志)。

minio:
  address: minio:9000       # S3 兼容存储地址
  port: 9000                # S3 API 端口
  accessKeyID: minioadmin   # 访问密钥 ID
  secretAccessKey: minioadmin # 访问密钥 Secret
  useSSL: false             # 是否使用 HTTPS
  bucketName: a-bucket      # 存储桶名称
  rootPath: files           # 数据存储根路径

  # 云存储提供商(可选)
  cloudProvider: aws        # aws / gcp / azure / aliyun
  iamEndpoint: ""           # IAM 端点

  # 连接池配置
  useVirtualHost: false
  requestTimeout: 10000     # 请求超时(毫秒)
参数 默认值 说明 调优建议
bucketName a-bucket 存储桶名 按项目/环境划分不同 bucket
rootPath files 数据前缀 多实例共享 MinIO 时设不同前缀
useSSL false SSL/TLS 生产环境必须启用
requestTimeout 10000 请求超时 大文件场景适当增大

浏览器访问 MinIO Console(需提前暴露 9001 端口)

浏览器打开 http://localhost:9001

用户名: minioadmin, 密码: minioadmin

mq — 消息队列(WAL 底层实现)

消息队列在 Milvus 中充当预写日志 (WAL) 的角色,保障数据可靠性。

mq:
  type: rocksmq             # Standalone 默认:rocksmq
                            # 可选:pulsar / kafka / woodpecker

# 使用 RocksMQ(Standalone 默认,基于 RocksDB,无需额外容器)
rocksmq:
  path: /var/lib/milvus/rdb_data  # RocksDB 数据存储路径
  rocksmqPageSize: 67108864        # 每页大小 (64MB)
  retentionTimeInMinutes: 4320     # 消息保留时间 (72小时)

# 使用 Pulsar(Distributed 默认,集群模式推荐)
# pulsar:
#   address: pulsar://pulsar:6650
#   maxMessageSize: 5242880        # 单消息最大 5MB

# 使用 Kafka
# kafka:
#   brokerList: kafka:9092

消息队列选择指南:

MQ 类型 适用场景 外部依赖 性能
rocksmq Standalone 单机 无(内嵌 RocksDB) 低延迟,无网络开销
pulsar Distributed 集群 需独立 Pulsar 集群 高吞吐,支持多租户
kafka 已有 Kafka 生态 需独立 Kafka 集群 成熟稳定,生态丰富
woodpecker v2.6 新增 无(直接写 S3) 零磁盘占用,云原生

核心组件参数

proxy — 访问层网关

Proxy 是客户端与 Milvus 交互的唯一入口,负责认证、限流、路由和结果合并。

proxy:
  port: 19530                    # gRPC 服务端口
  http:
    enabled: true                # 启用 HTTP 端点
    port: 9091                   # HTTP 端口
    debug_mode: false            # 调试模式(生产关闭)

  timeTickInterval: 200          # 时间滴答间隔(毫秒)
  msgStream:
    timeTick:
      bufSize: 512               # 时间滴答缓冲区大小

  # 连接管理
  maxUserNum: 100                # 最大客户端连接数
  maxNameLength: 255             # Collection/Field 名称最大长度
  maxFieldNum: 64                # 单 Collection 最大字段数
  maxVectorFieldNum: 10          # 单 Collection 最大向量字段数
  maxShardNum: 64                # 单 Collection 最大分片数
  maxDimension: 32768            # 向量最大维度

  # 访问日志
  accessLog:
    enabled: false               # 是否记录访问日志
    maxSize: 512                 # 单日志文件最大大小(MB)
    maxBackups: 8                # 日志备份数
    maxAge: 7                    # 日志保留天数

  # 超时配置
  searchTimeout: 0               # 搜索超时(0 = 不限制)
  createTimeout: 60000           # 创建操作超时(ms)

  # 连接保活
  connectionCheckInterval: 120   # 连接检查间隔(秒)
  gracefulStopTimeout: 30        # 优雅关闭超时(秒)

  # 客户端缓存
  cache:
    enabled: true                # 启用查询结果缓存
    ttl: 0                       # 缓存 TTL(0 = 永不过期)

  # 请求限制
  maxTaskNum: 1024              # 最大并发任务数
参数 默认值 说明 调优建议
maxFieldNum 64 最大标量字段数 按需调整,单表字段 ≤ 32 更佳
maxVectorFieldNum 10 最大向量字段 混合搜索场景可增大
maxShardNum 64 最大分片数 每 2 亿数据 1 个 shard
maxDimension 32768 最大向量维度 超大规模 embedding 模型需调大
timeTickInterval 200ms Time Tick 间隔 实时性要求高可减小(最低 10ms)

rootCoord — 根协调器(DDL + TSO)

rootCoord:
  address: localhost:53100       # 服务地址
  port: 53100                    # 服务端口
  maxPartitionNum: 1024          # 单 Collection 最大分区数
  maxDatabaseNum: 64             # 最大数据库数
  enableActiveStandby: false     # 主备高可用开关

  # DDL 操作限制
  minDdlChannalRpcTimeout: 20000 # DDL 最小 RPC 超时(ms)  --legacy
  dmlChannelNum: 16             # DML 通道数  --legacy
  maxDdlChanNum: 16             # 最大 DDL 通道数  --legacy

  # TSO 时间戳
  timestamp:
    timetickInterval: 200        # 时间滴答间隔(ms)

  # 优雅关闭
  gracefulStopTimeout: 30

queryCoord — 查询协调器

queryCoord:
  address: localhost:53110
  port: 53110

  # 负载均衡
  autoBalance: true              # 自动负载均衡
  checkInterval: 1               # 负载检查间隔(秒)
  balanceIntervalSeconds: 60     # 负载均衡执行间隔(秒)
  overloadedMemoryThreshold: 70  # 过载内存阈值(百分比)

  # Segment 分配
  taskExecutionTimeout: 120000   # 任务执行超时(ms)

  # 握手
  enableHandoff: true           # 启用 Segment Handoff
  handoffTimeout: 5000          # Handoff 超时(ms)
参数 默认值 说明 调优建议
autoBalance true 自动负载均衡 生产环境保持开启
balanceIntervalSeconds 60s 均衡检查间隔 频繁写入时适当缩短
overloadedMemoryThreshold 70% 过载阈值 内存资源紧张时调低至 50-60%
handoffTimeout 5000ms 交接超时 大 Segment 场景适当增加

dataCoord — 数据协调器

dataCoord:
  address: localhost:53120
  port: 53120

  # Segment 管理(核心!)
  segment:
    maxSize: 1024               # 单 Segment 最大容量(MB)
    diskSegmentMaxSize: 2048     # 磁盘索引 Segment 最大容量(MB)
    sealProportion: 0.12         # Growing→Sealed 触发系数
    expansionRate: 1.25          # Compaction 膨胀倍数

    # 生命周期
    maxLifetime: 86400           # Segment 最大存活时间(秒)
    minSizeFromIdToSealed: 16    # Growing→Sealed 最小行数(MB)
    maxBinlogFileNum: 10         # 触发 Flush 的 binlog 文件数上限

  # Compaction 压缩合并
  enableCompaction: true
  compaction:
    mix:
      triggerInterval: 60        # 混合合并触发间隔(秒)
    levelzero:
      triggerInterval: 60        # L0 合并触发间隔(秒)
    clustering:
      enable: false              # 聚类压缩开关
      autoEnable: false           # 自动触发聚类压缩
      triggerInterval: 600       # 触发间隔(ms)
      minInterval: 3600          # 最小间隔(秒)
      maxInterval: 259200        # 最大间隔(秒, 默认3天)
      newDataSizeThreshold: 512m  # 新数据量阈值
      timeout: 7200              # 压缩超时(秒)

  # 垃圾回收
  enableGarbageCollection: true
  gc:
    interval: 3600               # GC 执行间隔(秒)
    dropTolerance: 86400         # 删除容忍时间(秒, 24小时)
    scanInterval: 168            # 对象存储孤儿文件扫描间隔(小时)

  # 索引构建
  index:
    taskSlot: 1                  # 索引任务并发槽位
参数 默认值 说明 调优建议
segment.maxSize 1024MB Segment 最大大小 内存充裕可增至 4096MB(减少 Segment 数)
segment.sealProportion 0.12 Seal 触发系数 写入吞吐高时设小(如 0.08);离线场景设大(如 0.3)
segment.expansionRate 1.25 合并膨胀率 默认即可
gc.dropTolerance 86400s 数据删除宽限期 若需要 Time Travel 超过 24h,需增大
enableCompaction true 合并开关 纯只读场景可关闭

indexCoord — 索引协调器

indexCoord:
  address: localhost:53130
  port: 53130
  enable: true                 # v2.5+ 索引协调功能已并入 DataCoord
  bindInterval: 5000

v2.6 变更: IndexCoord 功能已合并到 DataCoord。此配置段保留向后兼容。

queryNode — 查询节点

queryNode:
  port: 21123

  # 缓存管理(v2.6 重要特性)
  cache:
    enabled: true
    memory: 2048               # 缓存内存容量(MB)
    warmup: async              # 预热策略: async | sync | disable

    # 块缓存 (Chunk Cache)
    chunk:
      enabled: false           # 是否启用本地磁盘缓存
      path: /var/lib/milvus/chunk_cache
      size: 104857600          # 缓存大小(字节, 默认100MB)

  # 内存映射 (mmap)
  mmap:
    vectorField: false         # 向量字段是否使用 mmap
    scalarField: false         # 标量字段是否使用 mmap
    vectorIndex: false         # 向量索引是否使用 mmap

  # 搜索配置
  scheduler:
    receiveChanSize: 10240     # 调度接收通道大小
    readChanSize: 128
    maxReadConcurrentRatio: 1.0 # 最大并发读比例

  # 优雅关闭
  gracefulStopTimeout: 1800    # 优雅关闭超时(秒)

  # 磁盘索引
  disk:
    enabled: false             # 是否启用磁盘索引(DiskANN)
参数 默认值 说明 调优建议
cache.memory 2048MB 查询缓存大小 内存充裕可增大至 4-8GB
cache.warmup async 预热策略 async: 加载快但初期慢;sync: 加载慢但查询无延迟;disable: 不预热
mmap.vectorField false 向量 mmap 内存不足时设为 true,用磁盘换内存
mmap.scalarField false 标量 mmap 有大标量字段(JOSN/Array)时推荐开启
disk.enabled false DiskANN 磁盘索引 十亿级数据且内存有限时开启

dataNode — 数据节点

dataNode:
  port: 21124

  # 数据刷新
  flush:
    insertBufSize: 16777216    # 插入缓冲区大小(字节, 16MB)
    mergeBufSize: 16777216     # 合并缓冲区大小(字节)
    interval: 1                # Flush 检查间隔(秒)

  # 数据导入
  import:
    maxConcurrentTaskNum: 16
    MaxImportFileSize: 4194304 # 最大导入文件大小(字节, 4GB)
    memoryLimit: 2147483648    # 导入内存限制(字节, 2GB)

  # Compaction 执行
  compaction:
    useMergeSort: true         # 使用归并排序
    memoryBufferRatio: 0.1     # 压缩内存缓冲比例
    workPoolSize: 8            # 压缩工作池大小

  # 优雅关闭
  gracefulStopTimeout: 1800

indexNode — 索引构建节点

indexNode:
  port: 21121
  scheduler:
    buildParallel: 1           # 并行构建索引的任务数

  # 磁盘索引
  disk:
    enabled: false

  gracefulStopTimeout: 1800
参数 默认值 说明 调优建议
buildParallel 1 并行构建数 CPU 充裕可增至 2-4,但会增加内存压力

通用配置参数

common — 通用安全配置

common:
  # 安全
  security:
    authorizationEnabled: false       # RBAC 鉴权开关
    defaultRootPassword: Milvus       # 默认 root 密码(首次启动后修改!)
    superUsers: ""                    # 超级用户列表
    tlsMode: 0                        # TLS 模式: 0=关闭 1=单向 2=双向

  # 多租户
  session:
    ttl: 604800                       # 会话 TTL(秒, 7天)
    retryTimes: 30                    # 重试次数

  # 存储
  storageType: remote                 # 存储类型: remote(MinIO/S3) | local
  retentionDuration: 86400            # 数据保留时长(秒),影响 Time Travel 窗口

  # 时间戳
  usePartitionKeyAsClusteringKey: false  # 分区键用作聚类键

  # 会话管理
  sessionTTL: 60                      # 会话超时(秒)
  sessionRetryTimes: 30               # 会话重试次数

  # 指标
  metrics:
    port: 9090                        # Prometheus 指标端口

quotaAndLimits — 配额与限流

这是 milvus.yaml 中配置项最多的章节,防止单个操作或用户打爆系统。

quotaAndLimits:
  enabled: true                # 全局限流开关

  # ====== 内存保护 ======
  forceDenyAllDDL: false       # 紧急开关:内存不足时强制拒绝所有 DDL
  forceDenyAllDML: false       # 紧急开关:内存不足时强制拒绝所有 DML

  # ====== DDL 限制 ======
  ddl:
    enabled: false             # DDL 限流开关
    collectionRate: -1         # -1 不限制
    partitionRate: -1

  # ====== DML 限制(数据写入) ======
  dml:
    enabled: false
    insertRate:
      collection:
        max: -1                # 单 Collection 最大插入速率(MB/s)
      db:
        max: -1
    upsertRate:
      collection:
        max: -1
    deleteRate:
      collection:
        max: -1
    bulkLoadRate:
      collection:
        max: -1

  # ====== DQL 限制(查询搜索) ======
  dql:
    enabled: false
    searchRate:
      collection:
        max: -1                # 单 Collection 最大搜索 QPS
      db:
        max: -1
    queryRate:
      collection:
        max: -1

  # ====== 写入保护 ======
  flushRate:
    enabled: false
    collection:
      max: 0.1                 # 每 Collection Flush 频率(次/秒),默认 10s 1 次

  # ====== 磁盘保护 ======
  diskProtection:
    enabled: true
    diskQuota: -1              # 磁盘配额限制(字节), -1 = 不限制

  # ====== 内存保护 ======
  memoryProtection:
    enabled: true
    waterMarkMemoryRatio: 0.85 # 内存水位线(85% 触发保护)

  # ====== 结果限制 ======
  limits:
    maxCollectionNum: 65536    # 最大 Collection 数量
    maxInsertSize: -1          # 单次 Insert 最大数据量(字节)
    maxSearchSize: -1          # 单次 Search 最大数据量
    maxQuerySize: -1           # 单次 Query 最大数据量
    maxQueryResultWindow: 16384  # 查询结果最大窗口

  # ====== Deny Writing ======
  denyWritingOnMemoryWatermark: true  # 内存水位触发时拒绝写入
参数 默认值 说明 调优建议
flushRate.collection.max 0.1 Flush 频率限制 写入密集时可增至 1.0
waterMarkMemoryRatio 0.85 内存水位 系统内存紧张时调低至 0.7
maxCollectionNum 65536 最大 Collection 数 多租户场景默认够用
maxQueryResultWindow 16384 查询窗口 需要大量分页时增大

log — 日志配置

log:
  level: info                  # 日志级别: debug | info | warn | error | panic | fatal
  file:
    rootPath: ""               # 日志目录
    maxSize: 512               # 单文件最大(MB)
    maxBackups: 20             # 最大备份文件数
    maxAge: 7                  # 最大保留天数
  format: text                 # 格式: text | json
  stdout: true                 # 输出到标准输出

⚠️ 重要提醒:debug 级别日志量非常大,仅调试时使用。生产环境必须设为 info。Docker 部署时务必限制容器日志大小:

// /etc/docker/daemon.json
{
 "log-driver": "json-file",
 "log-opts": {
   "max-size": "10m",
   "max-file": "3"
}
}

Milvus 2.6.x-核心机制深度解析

核心机制 — 流批分离架构(v2.6 重大变更)

https://milvus.io/docs/v2.5.x/assets/milvus_architecture.png

https://milvus.io/docs/v2.5.x/assets/milvus_architecture.png

2.5 vs 2.6 组件变化对比:

2.5.x 组件 2.6.x 组件 变化说明
QueryNode QueryNode 仅处理 Sealed Segment 批量查询
DataNode DataNode 仅做 Compaction + 索引构建
StreamingNode 全新!接管所有实时数据写入
IndexNode 独立 合并入 DataNode 简化拓扑
RootCoord/QueryCoord/DataCoord MixCoord 协调器三合一

核心机制 — 数据写入完整路径

image.png

这里的TSO:它是一个全局单调递增的时钟,给每条写入数据盖一个”时间邮戳”,用来确定”谁先谁后”。

因为这里有可能有多个stream的node节点,TSO 解决的就是这个问题 :不管你从哪个 StreamingNode 写入,所有数据都用同一个全局序号,绝对的”先来后到”。

核心机制 — WAL 预写日志

WAL = 数据可靠性核心支柱。任何操作先写 WAL,后处理。

WAL 关键特性:

特性 说明
先写后处理 任何 DML/DDL 先记录到 WAL,然后才处理
崩溃恢复 StreamingNode 崩溃 → 重放 WAL → 完整恢复
TSO 排序 每条消息带全局 TSO,WAL 中的顺序 = 操作发生的顺序
原子写入 VChannel 级别保证原子性
可迁移 WAL 可在 StreamingNode 间迁移,实现高可用

核心机制 — Segment 生命周期

Segment 是 Milvus 中数据管理的****最小物理单元

image.png

segment 状态速查:

状态 可写 可查 索引 存储位置 持久化
Growing ✅ (BF) StreamingNode 内存
Sealed 待构建 MinIO + QueryNode
Loaded QueryNode 内存/磁盘
Compacted QueryNode + MinIO

核心机制 — Flush + Compaction

Flush 是将 Growing Segment 的数据从内存****持久化到对象存储的过程。

触发条件(满足任一):
① 大小:≥ 1024MB × 0.12 ≈ 123MB
② 文件数:binlog ≥ 10 个
③ 时长:Segment ≥ 86400s
④ 手动:client.flush() API

执行流程:
Seal 指令 → WAL 消费完毕
→ 序列化为 binlog → 上传 S3
→ 标记 Sealed → Handoff
→ DataNode 异步建索引

✅ 非阻塞:其他 Segment 不受影响
✅ TSO 保证一致性快照

Compaction 压缩合并:**Compaction 将多个小 Sealed Segment **合并为更大的 Segment。

三种类型:
① Binlog(L0):合并 insert+delta log
② Segment(Mix):小段合并
③ Clustering:按标量 key 重排

合并流程:
检测小段 → 下发任务 → 读取
→ 合并去重 → 新段写 S3
→ 建索引 → QueryNode 加载
→ 旧段标记 GC → 异步清理

✅ 后台异步:不阻塞查询
✅ 原子切换:新段就绪后切换

三种 Compaction 类型:

类型 触发条件 作用
Binlog Compaction (L0) delta binlog 行数 > 总量的 20% 合并 insert log + delta log,清理已删除数据
Segment Compaction (Mix) 小于 0.5×maxSize 的段 > 10 个 小段合并,减少碎片
Clustering Compaction 需手动开启 + 按配置触发 按标量 key 重排数据,优化标量过滤

核心机制 — (Timestamp Oracle)

TSO 是 Milvus 分布式一致性的****核心支柱

TSO 核心作用:

作用 说明
全局有序 所有操作获得严格递增的时间戳,操作顺序明确
因果一致性 TSO(A) < TSO(B) ⇒ 操作 A 发生在操作 B 之前
一致性快照 查询可指定 Guarantee Timestamp,读取某时间点快照
崩溃恢复 WAL 中按 TSO 顺序重放,恢复状态一致

一致性级别与 TSO 的关系:

一致性级别 Guarantee Timestamp 性能 适用场景
Strong 最新 TSO(等待所有已提交数据) 最低 金融、强一致业务
Bounded TSO − 可配置时间窗口 大多数业务
Session 同一会话内自己的写入可见 Web 应用
Eventually 不保证 最高 推荐系统、搜索

Time Tick + 负载均衡机制

Time Tick 是 WAL 流中的****心跳/推进信号,代表”此时间点之前的所有消息都已写入 WAL”。

Time Tick 四大作用:

  1. 推进可读水位: QueryNode 需要知道 WAL 已写到哪个时间点,以确定哪些 Growing Data 可安全读取
  2. 触发 Flush 决策: Time Tick 推进到 Segment 所有数据已写入时,可安全 Flush
  3. 一致性边界: Bounded Consistency 的”允许滞后 N 秒”依赖 Time Tick 确定当前最新可读时间
  4. 防止查询饥饿: 即使无新数据写入,Time Tick 也周期性推进,查询不被无限阻塞

**Proxy 在路由查询请求到 QueryNode 时,通过 **LoadBalancer 接口选择目标节点。

三种策略(Proxy 路由到 QueryNode):

① RoundRobin 轮询
Q1→Q2→Q3→Q1 轮流,简单高效
适合:节点同配、数据均匀

② LeastCost 最少代价
选 CPU/内存/请求数最轻的节点
适合:节点异构、负载波动大

③ LookAside 旁路
查本地缓存 → 命中直接转发
适合:高并发 + 低延迟

--- 本文结束 The End ---