优化数据通信:Milvus 采用 NATS 信息传输技术
在错综复杂的数据处理过程中,无缝通信是连接操作符的纽带。具有开拓性的开源向量数据库 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 日志验证迁移等步骤。
在开始迁移之前,先停止 Milvus 中的所有写操作。
在 Milvus 中执行
FlushALL
操作符并等待其完成。此步骤可确保所有待处理数据都已刷新,系统已为关闭做好准备。修改 Milvus 配置文件,在
natsmq
部分下设置mq.type=natsmq
并调整相关选项。启动 Milvus 2.3。
备份并清理存储在
rocksmq.path
目录中的原始数据。可选
NATS 与 RocksMQ:性能对决
发布/子性能测试
测试平台M1 Pro 芯片/内存:16GB
测试场景向一个主题重复订阅和发布随机数据包,直到收到最后一个发布结果。
测试结果
对于较小的数据包(< 64kb),RocksMQ 在内存、CPU 和响应速度方面都优于 NATS。
对于较大的数据包(> 64kb),NATS 的响应速度要比 RocksMQ 快得多。
测试类型 | MQ | 操作次数 | 每次操作成本 | 内存成本 | CPU 总时间 | 存储成本 |
---|---|---|---|---|---|---|
5MB*100 发布/分 | NATS | 50 | 1.650328186 秒/操作 | 4.29 GB | 85.58 | 25G |
5MB*100 发布/分 | RocksMQ | 50 | 2.475595131 s/op | 1.18 GB | 81.42 | 19G |
1MB*500 发布/分 | NATS | 50 | 2.248722593 S/OP | 2.60 GB | 96.50 | 25G |
1MB*500 发布/分 | RocksMQ | 50 | 2.554614279 s/op | 614.9 MB | 80.19 | 19G |
64KB*10000 发布/分 | 国家统计局 | 50 | 2.133345262 S/OP | 3.29 GB | 97.59 | 31G |
64KB*10000 发布/分 | RocksMQ | 50 | 3.253778195 s/op | 331.2 MB | 134.6 | 24G |
1KB*50000 发布/分 | NATS | 50 | 2.629391004 S/OP | 635.1 MB | 179.67 | 2.6G |
1KB*50000 发布/子 | RocksMQ | 50 | 0.897638581 s/op | 232.3 MB | 60.42 | 521M |
表 1:Pub/Sub 性能测试结果
Milvus 集成测试
数据大小:100M
结果在使用 1 亿向量数据集进行的大量测试中,NATS 展示了较低的向量搜索和查询延迟。
指标 | RocksMQ (毫秒) | NATS (毫秒) |
---|---|---|
向量搜索平均延迟 | 23.55 | 20.17 |
每秒向量搜索请求数 (RPS) | 2.95 | 3.07 |
平均查询延迟 | 7.2 | 6.74 |
每秒查询请求 (RPS) | 1.47 | 1.54 |
表 2:Milvus 与 100M 数据集的集成测试结果
数据集:<100M
结果对于小于 100M 的数据集,NATS 和 RocksMQ 显示出相似的性能。
结论用 NATS 消息传递增强 Milvus 的能力
在 Milvus 中集成 NATS 标志着在数据处理方面取得了重大进展。无论是深入研究实时分析、机器学习应用,还是任何数据密集型风险投资,NATS 都能为您的项目带来效率、可靠性和速度。随着数据领域的不断发展,在 Milvus 中拥有像 NATS 这样强大的消息传递系统,可以确保无缝、可靠和高性能的数据通信。
- 了解消息队列在 Milvus 中的作用
- 什么是 NATS?
- 启用 NATS
- 为 Milvus 配置 NATS
- 从RocksMQ迁移到NATS
- NATS 与 RocksMQ:性能对决
- 结论用 NATS 消息传递增强 Milvus 的能力
On This Page
Try Managed Milvus for Free
Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.
Get StartedLike the article? Spread the word