🚀 免费试用 Zilliz Cloud,完全托管的 Milvus,体验 10 倍的性能提升!立即试用>

milvus-logo
LFAI
  • Home
  • Blog
  • 优化数据通信:Milvus 采用 NATS 信息传输技术

优化数据通信:Milvus 采用 NATS 信息传输技术

  • Engineering
November 24, 2023
Zhen Ye

在错综复杂的数据处理过程中,无缝通信是连接操作符的纽带。具有开拓性的开源向量数据库 Milvus 凭借其最新功能踏上了转型之旅:NATS 消息集成。在这篇综合性博文中,我们将揭开这一集成的神秘面纱,探讨其核心功能、设置过程、迁移优势以及与其前身 RocksMQ 相比的优势。

了解消息队列在 Milvus 中的作用

在 Milvus 的云原生架构中,消息队列或日志代理(Log Broker)具有举足轻重的地位。它是确保持久数据流、同步、事件通知和系统恢复期间数据完整性的支柱。传统上,在 Milvus Standalone 模式中,RocksMQ 是最直接的选择,尤其是与 Pulsar 和 Kafka 相比,但在大量数据和复杂场景下,它的局限性就显而易见了。

Milvus 2.3 引入了单节点 MQ 实现 NATS,重新定义了如何管理数据流。与前代产品不同,NATS 将 Milvus 用户从性能限制中解放出来,为处理大量数据提供无缝体验。

什么是 NATS?

NATS 是用 Go 实现的分布式系统连接技术。它支持跨系统的各种通信模式,如请求-回复(Request-Reply)和发布-订阅(Publish-Subscribe),通过 JetStream 提供数据持久性,并通过内置的 RAFT 提供分布式功能。有关 NATS 的更多详情,请参阅 NATS官方网站

在 Milvus 2.3 Standalone 模式下,NATS、JetStream 和 PubSub 为 Milvus 提供了强大的 MQ 功能。

启用 NATS

Milvus 2.3 提供了一个新的控制选项mq.type ,允许用户指定要使用的 MQ 类型。要启用 NATS,请设置mq.type=natsmq 。如果在启动 Milvus 实例后看到类似下面的日志,就说明已成功启用 NATS 作为消息队列。

[INFO] [dependency/factory.go:83] ["try to init mq"] [standalone=true] [mqType=natsmq]

为 Milvus 配置 NATS

NATS 自定义选项包括指定监听端口、JetStream 存储目录、最大有效载荷大小和初始化超时。微调这些设置可确保最佳性能和可靠性。

natsmq:
server: # server side configuration for natsmq.
port: 4222 # 4222 by default, Port for nats server listening.
storeDir: /var/lib/milvus/nats # /var/lib/milvus/nats by default, directory to use for JetStream storage of nats.
maxFileStore: 17179869184 # (B) 16GB by default, Maximum size of the 'file' storage.
maxPayload: 8388608 # (B) 8MB by default, Maximum number of bytes in a message payload.
maxPending: 67108864 # (B) 64MB by default, Maximum number of bytes buffered for a connection Applies to client connections.
initializeTimeout: 4000 # (ms) 4s by default, waiting for initialization of natsmq finished.
monitor:
trace: false # false by default, If true enable protocol trace log messages.
debug: false # false by default, If true enable debug log messages.
logTime: true # true by default, If set to false, log without timestamps.
logFile: /tmp/milvus/logs/nats.log # /tmp/milvus/logs/nats.log by default, Log file path relative to .. of milvus binary if use relative path.
logSizeLimit: 536870912 # (B) 512MB by default, Size in bytes after the log file rolls over to a new one.
retention:
maxAge: 4320 # (min) 3 days by default, Maximum age of any message in the P-channel.
maxBytes: # (B) None by default, How many bytes the single P-channel may contain. Removing oldest messages if the P-channel exceeds this size.
maxMsgs: # None by default, How many message the single P-channel may contain. Removing oldest messages if the P-channel exceeds this limit.

注意

  • 必须为 NATS 服务器监听指定server.port 。如果存在端口冲突,Milvus 将无法启动。将server.port=-1 设置为随机选择端口。

  • storeDir 指定 JetStream 存储目录。建议将目录存储在高性能固态硬盘 (SSD) 中,以提高 Milvus 的读/写吞吐量。

  • maxFileStore 设置 JetStream 存储容量的上限。超过此上限将阻止继续写入数据。

  • maxPayload 限制单条信息的大小。应保持在 5MB 以上,以避免任何写入拒绝。

  • initializeTimeout控制 NATS 服务器启动超时。

  • monitor 配置 NATS 的独立日志。

  • retention 控制 NATS 报文的保留机制。

更多信息,请参阅NATS 官方文档

从RocksMQ迁移到NATS

从 RocksMQ 迁移到 NATS 是一个无缝的过程,涉及到停止写操作、刷新数据、修改配置和通过 Milvus Operator 日志验证迁移等步骤。

  1. 在开始迁移之前,先停止 Milvus 中的所有写操作。

  2. 在 Milvus 中执行FlushALL 操作符并等待其完成。此步骤可确保所有待处理数据都已刷新,系统已为关闭做好准备。

  3. 修改 Milvus 配置文件,在natsmq 部分下设置mq.type=natsmq 并调整相关选项。

  4. 启动 Milvus 2.3。

  5. 备份并清理存储在rocksmq.path 目录中的原始数据。可选

NATS 与 RocksMQ:性能对决

发布/子性能测试

  • 测试平台M1 Pro 芯片/内存:16GB

  • 测试场景向一个主题重复订阅和发布随机数据包,直到收到最后一个发布结果。

  • 测试结果

    • 对于较小的数据包(< 64kb),RocksMQ 在内存、CPU 和响应速度方面都优于 NATS。

    • 对于较大的数据包(> 64kb),NATS 的响应速度要比 RocksMQ 快得多。

测试类型MQ操作次数每次操作成本内存成本CPU 总时间存储成本
5MB*100 发布/分NATS501.650328186 秒/操作4.29 GB85.5825G
5MB*100 发布/分RocksMQ502.475595131 s/op1.18 GB81.4219G
1MB*500 发布/分NATS502.248722593 S/OP2.60 GB96.5025G
1MB*500 发布/分RocksMQ502.554614279 s/op614.9 MB80.1919G
64KB*10000 发布/分国家统计局502.133345262 S/OP3.29 GB97.5931G
64KB*10000 发布/分RocksMQ503.253778195 s/op331.2 MB134.624G
1KB*50000 发布/分NATS502.629391004 S/OP635.1 MB179.672.6G
1KB*50000 发布/子RocksMQ500.897638581 s/op232.3 MB60.42521M

表 1:Pub/Sub 性能测试结果

Milvus 集成测试

数据大小:100M

结果在使用 1 亿向量数据集进行的大量测试中,NATS 展示了较低的向量搜索和查询延迟。

指标RocksMQ (毫秒)NATS (毫秒)
向量搜索平均延迟23.5520.17
每秒向量搜索请求数 (RPS)2.953.07
平均查询延迟7.26.74
每秒查询请求 (RPS)1.471.54

表 2:Milvus 与 100M 数据集的集成测试结果

数据集:<100M

结果对于小于 100M 的数据集,NATS 和 RocksMQ 显示出相似的性能。

结论用 NATS 消息传递增强 Milvus 的能力

在 Milvus 中集成 NATS 标志着在数据处理方面取得了重大进展。无论是深入研究实时分析、机器学习应用,还是任何数据密集型风险投资,NATS 都能为您的项目带来效率、可靠性和速度。随着数据领域的不断发展,在 Milvus 中拥有像 NATS 这样强大的消息传递系统,可以确保无缝、可靠和高性能的数据通信。

Like the article? Spread the word

扩展阅读