当前位置: 首页 > news >正文

更多场景、更多选择,Milvus 新消息队列 NATS 了解一下

在 Milvus 的云原生架构中,消息队列(Log Broker)可谓任重道远,它不仅要具备流式数据持久性、支持 TT 同步、事件通知等能力,还要确保工作节点从系统崩溃中恢复时增量数据的完整性。

在 Milvus 的架构中,一切围绕消息队列构建,遵循日志结构化存储的原则,消息队列在 Milvus 中的作用可以类比于传统数据库的 WAL(Redo Log)的角色。在 Milvus 2.3 之前,Milvus 官方支持 RocksMQ(Standalone 模式限定,Milvus 官方基于 RockDB 实现的 MQ 系统),以及 Pulsar、Kafka 等传统 MQ。

在 Milvus Standalone 模式下,相比于 Pulsar 和 Kafka,RocksMQ 是最简单的 MQ 部署方案。但由于 RocksMQ 基于 RocksDB,在大消息体以及海量消息的场景下性能表现一般。同时 RocksMQ 需要 rocksdb,频繁的调用 CGO,带来额外的性能负担。在 Milvus 2.3中,Milvus Standalone 最新引入了新的基于 NATS 的单机 MQ 实现,给用户提供在不同的使用场景下更多的 MQ 选择。

本文将介绍新 MQ 的使用方式以及与其他 MQ 的对比。

01.什么是 NATS

NATS 是 GO 实现的分布式系统连接技术,支持 Request-Reply、Publish-Subscribe 等跨系统沟通模式,通过底层的 JetStream 支持数据的持久化,以及内置的 RAFT 来提供分布式能力。想要系统的了解 NATS,可以查看官方网站:https://nats.io/。

NATS 支持的 Feature 非常多,在 Milvus 2.3 standalone 模式下,Milvus 利用单机版的 NATS+JetStream+PubSub 模式提供 MQ 能力。同时,Nats-server 被 Embedding 进了 Milvus 的程序中,不需要额外的 NATS 部署即可实现 NATSMQ。

02.如何启用 NATS

在 Milvus 2.3中,新引入了mq.type作为 MQ 类型的控制选项,为了保持向上兼容,NATS 不会进入默认的 MQ 选择优先级中,需要使用mq.type=natsmq强制指定。在 Milvus 实例启动后,如果看到以下的日志,则说明 Milvus使用了 NATS 作为 MQ。

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

03.NATS 配置项详解

当前配置项支持下述的定制化配置能力:

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.
  • server.port:由于 Nats 为 C-S 模式程序,当前不支持使用类似于 unix socket 等不占用端口的套接字方案,当前在 Milvus 中需要指定server.port作为 NATS Server 的端口,如果出现端口冲突,则 Milvus 不能正常启动。填写server.port=-1,可以随机选择端口。

  • storeDir:用于指定底层的 JetStream 持久化机制的存储目录,建议将该目录挂载在高性能的 SSD 上来提升 Milvus 的读写吞吐。如果出现 Milvus 无法启动的情况,请检查该目录是否存在或者目录的使用权限。

  • maxFileStore:用于限制 JetStream 的存储量上限,如果超出该上限将会出现禁止写入的情况。

  • maxPayload:单个消息的硬大小限制,Milvus 最大的消息chunk支持到5MB,因此该配置应该要保持在5MB以上并留有一定的余量,否则可能出现 Milvus 拒绝写入的情况。

  • initializeTimeout:用于控制 Milvus 启动时,Nats Server 的启动超时配置。如果出现以下日志,可以适当调高该配置。

[WARN] [nmq/nmq_server.go:77] ["nmq is not ready within timeout"]
  • monitor:用于配置 NATS 的独立日志,建议在日常运行环境中启用 trace 日志。

  • retention:用于控制 NATS 消息的保持机制,由于当前 Milvus 的消息保持机制与消息消费机制尚未实现同步。因此请务必保持该配置有充足的余量,让 Milvus 可以在消息被消息队列清退前消费完毕,否则 Milvus 可能会出现数据丢失的情况。

以上的绝大部分配置都与 NATS 官方配置对齐,如果需要了解更多的配置,或者希望 Milvus 引入更多的定制化配置,可以查看 NATS 的官方文档 https://docs.nats.io/running-a-nats-service/config。

04.RocksMQ 迁移至 NATS

可以采用 Milvus 的通用 MQ 迁移方案。

  • 停止 Milvus 一切的写入操作。

  • 调用 FlushALL 操作,等待 FlushALL 完毕后,关闭Milvus 进程。

  • 修改配置项 mq.type=natsmq,以及 natsmq下相关需要修改的配置项(如果出现端口冲突或者目录权限等问题)

  • 启动 2.3 版本的 Milvus 进程:

    • 日志应当出现 mqType=natsmq日志。
    • natsm.server.storeDir配置的目录下应当出现 jetstream 文件夹。
  • 可选:备份并清理原rocksmq.path存储目录下的文件数据。

05.NATS 和 RocksMQ 对比

Pub/Sub 性能对比

测试平台与方案

  • M1 Pro Chip / Memory: 16GB

  • 启动 MQ,同时对一个 Topic 进行订阅和发布随机内容数据包,循环 N 次发布操作后,直到订阅得到最后一次发布结果时,测试结束。

测试结果

  • NATS 为纯 GO 的实现,而 RocksMQ 使用 CGO 与 rocksdb 的 lib 交互。因此 NATS 的绝大部分内存由 GO 的 GC 接管,而 RocksMQ 依赖 lib 自身的内存管理。NATS 的内存开销会更高。

  • 在数据包较小(小于 64kb)的场景下,RocksMQ 不论在内存、CPU 还是在响应速度都具备较大优势。(1kb message rocksmq 有1x 以上性能优势)

  • 在数据包较大的场景下(大于 64kb),NATS 在内存充足以及理想的 GC 场景下,在响应速度方面有较大的优势(5MB message NATS 有 1x 以上性能优势)

  • 存储方面,RocksMQ 当前有 Zstd 压缩加持,消耗的磁盘空间更少(NATS 未开压缩)

alt

Milvus 集成测试

  • 在 1 亿级别的向量对比测试中:NATS 可以支持更低的检索延迟。
alt
  • 在数据量较少的场景下:NATS 与 RocksMQ 的差距不大。

以上就是关于 Milvus 新消息队列 NATS 的全部内容,如果大家有任何疑问都可以跟我们沟通,下一篇我们会继续讲解 Milvus 2.3 的新功能——MMap,敬请期待。


  • 如果在使用 Milvus 或 Zilliz 产品有任何问题,可添加小助手微信 “zilliz-tech” 加入交流群。

  • 欢迎关注微信公众号“Zilliz”,了解最新资讯。

本文由 mdnice 多平台发布

相关文章:

更多场景、更多选择,Milvus 新消息队列 NATS 了解一下

在 Milvus 的云原生架构中,消息队列(Log Broker)可谓任重道远,它不仅要具备流式数据持久性、支持 TT 同步、事件通知等能力,还要确保工作节点从系统崩溃中恢复时增量数据的完整性。 在 Milvus 的架构中,一切…...

如何通过python实现一个web自动化测试框架?

要实现一个web自动化测试框架,可以使用Python中的Selenium库,它是最流行的Web应用程序测试框架之一。以下是一个基本的PythonSelenium测试框架的示例: 1、安装Selenium 在终端中输入以下命令,使用 pip 安装 Selenium&#xff1a…...

Linux —— 信号阻塞

目录 一,信号内核表示 sigset_t sigprocmask sigpending 二,捕捉信号 sigaction 三,可重入函数 四,volatile 五,SIGCHLD 信号常见概念 实际执行信号的处理动作,称为信号递达Delivery;信…...

【【萌新编写riscV之计算机体系结构之CPU 总二】】

萌新编写riscV之计算机体系结构之CPU 总二(我水平太差总结不到位) 在学习完软件是如何使用之后 我们接下来要面对的问题是 整个程序是如何运转的这一基本逻辑 中央处理器(central processing unit,CPU)的任务就是负责提取程序指令&#xff0…...

error:03000086:digital envelope routines::initialization error

项目背景 前端vue项目启动突然报错error:03000086:digital envelope routines::initialization error 我用的开发工具是vscode,node版本是v18.17.0 前端项目版本如下↓ 具体报错如下↓ 报错原因 node版本过高 解决方法 1输入命令 $env:NODE_OPTIONS"--op…...

暴涨130万粉仅用3个月,一招转型成B站热门UP主

- 导语 起号难、找不到内容方向、没流量、没粉丝等等运营困境环绕在创作者之间,近期,有黑马UP主短时间内就在B站涨粉百万,飞升成为热门UP主,以下,飞瓜数据(B站版)剖析黑马UP主运营技巧&#xf…...

【Linus】vim的使用:命令模式、底行模式、插入模式、视图模式、替换模式的常用操作介绍

目录 注意:以下操作前提是要确保你输入法是英文模式 一、进入和退出各个模式的方法 1.命令模式 2.底行模式 3.插入模式 4.视图模式 5.替换模式 二、在命令模式中一些常用的操作 1.移动光标 2.删除文字 3.复制 4.替换 5.撤销上一次操作 6.更改 7.跳至指…...

leetcode第362场周赛补题

8029. 与车相交的点 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a;差分数组 class Solution { public:int numberOfPoints(vector<vector<int>>& nums) {int diff[102] {}; for(auto p : nums)//差分{diff[p[0]] ;diff[p[1] 1] -- ;}int res …...

SpringMvc 之crud增删改查应用

目录 1.创建项目 2.配置文件 2.1pom.xml文件 2.2 web.xml文件 2.3 spring-context.xml 2.4 spring-mvc.xml 2.5 spring-MyBatis.xml 2.6 jdbc.properties 数据库 2.7 generatorConfig.xml 2.8 日志文件log4j2 3.后台代码 3.1 pageBean.java 3.2切面类 3.3 biz层…...

【业务功能109】微服务-springcloud-springboot-Skywalking-链路追踪-监控

Skywalking skywalking是一个apm系统&#xff0c;包含监控&#xff0c;追踪&#xff0c;并拥有故障诊断能力的 分布式系统 一、Skywalking介绍 1.什么是SkyWalking Skywalking是由国内开源爱好者吴晟开源并提交到Apache孵化器的产品&#xff0c;它同时吸收了Zipkin /Pinpoint …...

《向量数据库指南》——AI原生向量数据库Milvus Cloud 2.3架构升级

架构升级 GPU 支持 早在 Milvus 1.x 版本,我们就曾经支持过 GPU,但在 2.x 版本中由于切换成了分布式架构,同时出于对于成本方面的考虑,暂时未加入 GPU 支持。在 Milvus 2.0 发布后的一年多时间里,Milvus 社区对 GPU 的呼声越来越高,再加上 NVIDIA 工程师的大力配合——为…...

Flutter中实现交互式Webview的方法

前言&#xff1a; Flutter是一款强大的跨平台移动应用开发框架&#xff0c;而Webview则是在应用中展示Web内容的重要组件。本文将介绍如何在Flutter应用中实现交互式的Webview&#xff0c;以便为用户提供更加丰富的内容和功能。 1. 引入webview_flutter插件 要在Flutter应用中…...

【Java Web】用Redis优化登陆模块

使用Redis存储验证码 验证码需要频繁访问和封信&#xff0c;对性能要求高&#xff1b;验证码不需要永久保存&#xff0c;通常在很短时间内失效&#xff1b;分布式部署&#xff0c;存在Session共享问题&#xff1b; 使用Redis存储登陆凭证 处理每次请求时&#xff0c;都要查询用…...

华为云云耀云服务器L实例评测|docker私有仓库部署手册

【软件安装版本】【集群安装&#xff08;是&#xff09;&#xff08;否&#xff09;】 版本号 文档编写 文档审核 创建日期 修改日期 1.0 jzg jzg 2023.9.13 一. 部署规划与架构 1. 规划&#xff1a;&#xff08;集群&#xff1a;网络规划&…...

JAVA-3DES对称加解密工具(不依赖第三方库)

import javax.crypto.Cipher; import javax.crypto.spec.SecretKeySpec; import java.nio.charset.StandardCharsets; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException;public class EncryptUtil {// 密钥public static final String ENCR…...

基于Matlab卡尔曼滤波的IMU和GPS组合导航数据融合(附上源码+数据)

本文介绍了如何使用Matlab实现惯性测量单元&#xff08;IMU&#xff09;和全球定位系统&#xff08;GPS&#xff09;组合导航数据融合的卡尔曼滤波算法。通过将IMU和GPS的测量数据进行融合&#xff0c;可以提高导航系统的精度和鲁棒性。我们将详细介绍卡尔曼滤波的原理和实现步…...

net自动排课系统完整源码(适合智慧校园)

目录 1 net自动排课系统完整源码(适合智慧校园) 1.1 后台管理admin 1.1.1 菜单 1.1.2 教学计划 net自动排课系统完整源码(适合智慧校园) 后台管理admin<%@ Page Language="C#" AutoEventWireup="true" CodeBehind=&...

Matlab匿名函数教程

Matlab匿名函数是一种方便、简洁的函数定义方式&#xff0c;可以在不使用函数文件的情况下&#xff0c;直接在命令行或脚本中定义函数。本文将介绍Matlab匿名函数的基本语法和用法。 匿名函数的基本语法如下&#xff1a; function_handle (input_variables) expression其中&…...

【Vue】一文让你进入Vue的大门

Vue简介 官网 ● 英文官网 ● 中文官网 介绍与描述 Vue历史 Vue 是一套用来动态构建用户界面的渐进式JS框架 构建用户界面&#xff1a;把数据通过某种办法变成用户界面 渐进式&#xff1a;Vue可以自底向上逐层的应用&#xff0c;简单应用只需要一个轻量小巧的核心库&#xff0c…...

Linux mmap读/写触发共享文件页生命周期

概述 Linux的mm内存子系统的核心功能就要要管理各种类型的page,确保能高效分配和释放,让物理内存得以最大化使用。初识内存系统往往关注的是page的申请和管理流程,容易忽略page的释放回收流程,其实理解mm中的内存回收和释放也是最核心的机制。 Linux内核为了支持各种场景…...

linux之kylin系统nginx的安装

一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源&#xff08;HTML/CSS/图片等&#xff09;&#xff0c;响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址&#xff0c;提高安全性 3.负载均衡服务器 支持多种策略分发流量…...

51c自动驾驶~合集58

我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留&#xff0c;CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制&#xff08;CCA-Attention&#xff09;&#xff0c;…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》

引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...

centos 7 部署awstats 网站访问检测

一、基础环境准备&#xff08;两种安装方式都要做&#xff09; bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats&#xff0…...

【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题

【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要&#xff1a; 近期&#xff0c;在使用较新版本的OpenSSH客户端连接老旧SSH服务器时&#xff0c;会遇到 "no matching key exchange method found"​, "n…...

MySQL 索引底层结构揭秘:B-Tree 与 B+Tree 的区别与应用

文章目录 一、背景知识&#xff1a;什么是 B-Tree 和 BTree&#xff1f; B-Tree&#xff08;平衡多路查找树&#xff09; BTree&#xff08;B-Tree 的变种&#xff09; 二、结构对比&#xff1a;一张图看懂 三、为什么 MySQL InnoDB 选择 BTree&#xff1f; 1. 范围查询更快 2…...

用鸿蒙HarmonyOS5实现中国象棋小游戏的过程

下面是一个基于鸿蒙OS (HarmonyOS) 的中国象棋小游戏的实现代码。这个实现使用Java语言和鸿蒙的Ability框架。 1. 项目结构 /src/main/java/com/example/chinesechess/├── MainAbilitySlice.java // 主界面逻辑├── ChessView.java // 游戏视图和逻辑├──…...

Android写一个捕获全局异常的工具类

项目开发和实际运行过程中难免会遇到异常发生&#xff0c;系统提供了一个可以捕获全局异常的工具Uncaughtexceptionhandler&#xff0c;它是Thread的子类&#xff08;就是package java.lang;里线程的Thread&#xff09;。本文将利用它将设备信息、报错信息以及错误的发生时间都…...

【题解-洛谷】P10480 可达性统计

题目&#xff1a;P10480 可达性统计 题目描述 给定一张 N N N 个点 M M M 条边的有向无环图&#xff0c;分别统计从每个点出发能够到达的点的数量。 输入格式 第一行两个整数 N , M N,M N,M&#xff0c;接下来 M M M 行每行两个整数 x , y x,y x,y&#xff0c;表示从 …...

二叉树-144.二叉树的前序遍历-力扣(LeetCode)

一、题目解析 对于递归方法的前序遍历十分简单&#xff0c;但对于一位合格的程序猿而言&#xff0c;需要掌握将递归转化为非递归的能力&#xff0c;毕竟递归调用的时候会调用大量的栈帧&#xff0c;存在栈溢出风险。 二、算法原理 递归调用本质是系统建立栈帧&#xff0c;而非…...