探索 Milvus 存储系统:如何评估和优化 Milvus 存储性能

欢迎来到探索 Milvus 系列。Milvus 是一款支持水平扩展和具备出色性能的开源向量数据库。Milvus 的核心是其强大的存储系统,是数据持久化和存储的关键基础。该系统包括几个关键组成部分:元数据存储(meta storage)、消息存储(log broker)和对象存储(object storage)。

本文将深入探讨 Milvus 架构,分析其核心存储组件,并介绍如何有效评估 Milvus 存储系统性能。

Milvus 架构

Milvus 采用了分布式架构,确保了存储和计算的分离,并支持水平扩展计算节点。Milvus 架构主要分为四层:接入层(Access Layer)、协调服务(Coordinator Service)、执行节点(Worker Node)和存储服务 (Storage)。每一层都可以独立扩展并针对灾难恢复进行了优化。

  • 接入层:作为系统的主要用户接口,由无状态代理组成,处理用户请求并优化响应。

  • 协调服务:作为系统中央协调服务,管理任务分配、集群拓扑、负载均衡和跨工作节点的数据管理。

  • 执行节点:作为执行者,负责完成协调服务下发的指令和 proxy 发起的数据操作语言(DML)命令。

  • 存储服务 : 对数据持久性至关重要,负责 Milvus 数据的持久化,分为元数据存储(meta store)、消息存储(log broker)和对象存储(object storage)三个部分。

Milvus 存储组件

Milvus 使用以下三个主要的存储组件来确保数据的完整性和可用性。

元数据存储

负责存储元信息的快照,比如 collection schema 信息、节点状态信息、消息消费的 checkpoint 等。鉴于对高可用性、强一致性和事务支持的需求,Milvus 利用 etcd 作为其元存储解决方案。etcd 是一个健壮且分布式的键值存储,对 Milvus 内部的分布式系统至关重要。同时它还处理服务注册和健康检查以及元数据保存等任务。

对象存储

负责存储日志的快照文件、标量/向量索引文件以及查询的中间处理结果。Milvus 采用 MinIO 作为对象存储,另外也支持 AWS S3 和Azure Blob 这两大最广泛使用的低成本存储。但是由于对象存储访问延迟较高,且需要按照查询计费,因此 Milvus 未来计划支持基于内存或 SSD 的缓存池,通过冷热分离的方式提升性能以降低成本。

消息存储

消息存储是一套支持回放的发布订阅系统,用于持久化流式写入的数据,以及可靠的异步执行查询、事件通知和结果返回。执行节点宕机恢复时,通过回放消息存储保证增量数据的完整性。目前分布式 Milvus 依赖 Pulsar 作为消息存储,Milvus standalone 依赖 RocksDB 作为消息存储。消息存储也可以替换为 Kafka 等流式存储。

何评估和优化 Milvus 存储的性能

持续评估和改进存储性能至关重要。

Etcd:Milvus 的元数据存储

Etcd 是为分布式系统设计的分布式键值存储。在 Milvus 中,etcd 用作元数据存储,存储诸如collection schema 信息、节点状态信息、消息消费的 checkpoint 等关键数据。

磁盘写入延迟对于 etcd 的性能至关重要;速度较慢的磁盘可能会显著增加请求延迟并危及系统稳定性。我们推荐在生产环境中至少保持 500+ IOPS(每秒输入/输出操作)以获得最佳性能,确保 99% 的 fdatasync 持续时间在十毫秒以下。虽然 etcd 通常只需适度的磁盘带宽,但增加带宽可以显著减少恢复时间。因此,我们推荐生产环境的最低磁盘带宽至少为 100MB/s。

为了验证您的存储解决方案是否满足这些标准,可以考虑使用 Fio 进行性能评估,Fio 是一种磁盘性能测试工具。

首先,请确保您的系统上安装了 Fio。然后,运行以下命令,指定挂载存储的目录作为测试数据目录。这个目录应该位于您的存储连接点之下。

fio --rw=write --ioengine=sync --fdatasync=1 --directory=test-data --size=22m --bs=2300 --name=mytest

查看结果,确保 99% 的 fdatasync 持续时间少于 10 毫秒,且写入 IOPS 高于 500。如果满足这些条件,则代表存储性能良好。

以下为输出结果示例:

Jobs: 1 (f=1): [W(1)][100.0%][w=1771KiB/s][w=788 IOPS][eta 00m:00s]
mytest: (groupid=0, jobs=1): err= 0: pid=703: Mon Jul 25 08:36:48 2022write: IOPS=967, BW=2173KiB/s (2225kB/s)(220MiB/103664msec); 0 zone resetsclat (nsec): min=1903, max=29662k, avg=287307.76, stdev=492386.04lat (nsec): min=1981, max=29662k, avg=287583.67, stdev=492438.10clat percentiles (usec):|  1.00th=[    3],  5.00th=[    4], 10.00th=[    4], 20.00th=[    5],| 30.00th=[    6], 40.00th=[    9], 50.00th=[  233], 60.00th=[  343],| 70.00th=[  437], 80.00th=[  553], 90.00th=[  701], 95.00th=[  742],| 99.00th=[ 1172], 99.50th=[ 2114], 99.90th=[ 6390], 99.95th=[ 8455],| 99.99th=[15533]bw (  KiB/s): min= 1630, max= 2484, per=100.00%, avg=2174.66, stdev=193.65, samples=207iops        : min=  726, max= 1106, avg=968.37, stdev=86.19, samples=207lat (usec)   : 2=0.03%, 4=16.49%, 10=27.68%, 20=3.21%, 50=0.71%lat (usec)   : 100=0.27%, 250=2.65%, 500=24.64%, 750=20.40%, 1000=2.57%lat (msec)   : 2=0.82%, 4=0.30%, 10=0.18%, 20=0.03%, 50=0.01%fsync/fdatasync/sync_file_range:sync (usec): min=309, max=21848, avg=741.93, stdev=489.64sync percentiles (usec):|  1.00th=[  392],  5.00th=[  437], 10.00th=[  474], 20.00th=[  529],| 30.00th=[  578], 40.00th=[  619], 50.00th=[  660], 60.00th=[  709],| 70.00th=[  742], 80.00th=[  791], 90.00th=[  988], 95.00th=[ 1369],| 99.00th=[ 2442], 99.50th=[ 3523], 99.90th=[ 6915], 99.95th=[ 8586],| 99.99th=[11994]

在云环境中部署 Milvus 集群时,由于 etcd 对磁盘性能的敏感性,选择适合的块存储类型至关重要。云服务提供商提供了各种块存储选项,每种都具备独特性能特征,适用于不同的工作场景。

以下是在各个云提供商推荐的使用的卷类型和性能指标。

云服务提供商卷类型规格IOPSP99 sync
AWSgp320Gi6604.3ms
GCPpd-ssd20Gi12621.3ms
AzurePremiumV220Gi7052.6ms
阿里云cloud_essd20Gi11373.5ms

您还可以使用 Fio 来确认所选的块存储是否满足 etcd 在 Milvus 部署中正常运行所需的性能基准。

MinIO:Milvus 对象存储工具

MinIO 是一种高性能、Kubernetes 原生的对象存储解决方案,专门针对云原生任务进行了优化。Milvus 使用 MinIO 来存储日志的快照文件、标量/向量索引文件以及查询的中间处理结果。

像 MinIO 这样的对象存储的性能主要通过 I/O 吞吐量而不是 IOPS 来衡量。这个指标显著影响 Milvus 中的各种操作,如加载 Collection、构建索引和插入数据。许多因素影响 MinIO 的吞吐性能,包括网络带宽、Linux 内核性能调优以及单个磁盘驱动器的性能。其中,磁盘性能尤为关键。

我们可以使用 dd 命令来测量单个驱动器的性能。DD 是一个 Unix 工具,它按位从一个文件复制数据到另一个文件,并提供了各种选项来控制每次读写的块大小。

在下面的示例中,当使用 16MB 块大小测试单个 NVMe 驱动器时, O_DIRECT 选项 count=64,每个驱动器写入性能超过每秒 2GB。

$ dd if=/dev/zero of=/mnt/drive/test bs=16M count=64 oflag=direct
64+0 records in
64+0 records out
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 0.443096 s, 2.4 GB/s

在同一示例中,当使用 16MB 块大小测试单个 NVMe 驱动器时,O_DIRECT 选项 count=64,每个驱动器读取性能超过每秒 5GB。

$ dd of=/dev/null if=/mnt/drive/test bs=16M count=64 iflag=direct
64+0 records in
64+0 records out
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 0.187263 s, 5.7 GB/s

磁盘驱动器的读写性能越高,MinIO 的整体吞吐性能越好。我们建议在 MinIO 设置中使用 SSD 或 NVMe 类型的驱动器作为存储磁盘,以获得最佳性能。这些驱动器可以有效支持 MinIO 操作的高吞吐量要求。请避免使用 SAN/NAS 设备作为 MinIO 存储,因为此类存储方式通常会引入并发问题和性能瓶颈,可能会降低系统的效率和响应性。

Pulsar/Kafka:Milvus 消息存储工具

如上所述,Milvus 根据特定的部署模式使用不同的日志代理工具。Milvus 分布式版使用 Pulsar 或 Kafka,而 Milvus Standalone 版本通常使用 RocksDB。

Pulsar 和 Kafka 都用于支持持久性消息存储,并为消息消费提供高吞吐量。它们的性能严重依赖于所使用的磁盘存储类型,因为它们依赖于磁盘 I/O 操作。

对于 Pulsar,高性能磁盘对于保证 BookKeeper 的日志文件的数据完整性和持久性至关重要。Pulsar Ledgers 和 Kafka 都针对磁盘效率进行了优化,利用文件系统缓存,并且在 HDD 和 SSD 上表现良好。然而,对于追求低延时的应用或大规模部署,SSD 有着显著的性能优势。

为了优化性能,应为 Pulsar 和 Kafka 使用多个磁盘设备。特别是对于 Pulsar,使用单独的磁盘存储日志可以将写操作的延迟与读操作隔离开来。为了确保最佳的延迟,不要使用相同的驱动器存储数据、应用程序日志或其他操作系统的活动。这些驱动器可以使用 RAID 配置为单个卷,或者每个驱动器可以格式化并挂载为自己的目录。应避免使用共享存储(SAN/NAS),因为它的性能较慢,延迟更高且更不稳定,并且可能成为单点故障。

总结

本文对 Milvus 存储系统进行了深入探索,并全面介绍了 Milvus 存储架构和组件,展现了这些存储组件在支持大规模数据管理和分析中的作用。此外,本文还详细分析了 Milvus 的三个主要存储组件——元数据存储、对象存储和消息存储系统,并提供了评估和优化 Milvus 存储性能的最佳实践。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/50638.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

苹果电脑怎么使用Windows软件 苹果笔记本怎么安装Windows mac怎么安装windows

最早的苹果电脑的概念是在1976年的时候由乔布斯提出来的,在1977年的时候发行的第一款个人电脑,也就是苹果笔记本电脑。苹果笔记本的操作系统是MAC OSmac OS是基于unix内核的系统,这个系统是专门为苹果电脑开发的。macOS比windows的视觉冲击大…

Synchronized的锁升级过程是怎样的?

文章目录 一、Synchronized的使用1、修饰实例方法2、修饰静态方法3、修饰代码块4、总结: 二、Monitor1、Java对象头1.1 32 位虚拟机的对象头1.2 64位虚拟机的对象头 2、Mark Word 结构3、Moniter4、Synchronized 字节码5、轻量级锁6、锁膨胀7、自旋优化8、偏向锁9、…

C++ 代码实现局域网即时通信功能 (windows 系统 客户端)

本项目使用C实现具备多个客户端和服务器端即时通信聊天功能软件 一:项目内容 使用C实现一个具备多客户端和一个服务器端即时通信功能的聊天软件。 本项目的目的是 学习在windows平台下,进行C网络开发的基本概念:TCP/IP socket通信&#xff0…

Java集合之HashMap的数据结构分析

总所周知,Java中键值对集合,我们最常用的就是HashMap,那么它的数据结构,以及如何存储键值对,包括为什么使用红黑树,链表等许多数据结构,下面我们一起学习交流 1.HashMap的数据结构:…

scratch二次开发:如何修改toolbox宽度

大家好,我是小黄。 使用场景:有时候我们开发图形化编程时,我们的积木块很长,导致一部分无法显示,我们想要把目录区域位置放大,比如下面红色方框区域位置,那么改如何实现这个过程呢?…

Qt,获取其他.exe文件的标准输出流的信息(printf/print的输出信息)

比如,通过Python编写爬虫软件功能是运行程序获取豆瓣电影排行榜信息,并通过print打印出来。将其打包成.exe,通过Qt来调用,并获取到.exe程序运行的结果 简单示例代码: // 创建 QProcess 对象QProcess process;// 连接信号槽以获取…

嵌入式学习Day14---C语言进阶

目录 一、构造类型 1.1.结构体 1.存储 2.输入输出(传参) 3.结构体数组 1.2.共同体(联合体) 1.格式 2.存储 3.测试一个平台是打端还是小端 1.3.枚举 1.格式 2.特点 二、位运算(操作二进制) 2.1.&a…

培训第十六天(web服务apache与nginx)

上午 静态资源 根据开发者保存在项目资源目录中的路径访问静态资源html 图片 js css 音乐 视频 f12,开发者工具,网络 1、web基本概念 web服务器(web server):也称HTTP服务器(HTTP server)&am…

翻译: 可视化深度学习神经网络一

这是一个随意书写的28*28像素、分辨率很低的数字 3 但你的大脑一看见就能轻松辨识出来 ,我想要你好好欣赏这点 人脑能够毫无障碍地辨识是非常厉害的 我的意思是,这个、这个、还有这个,都能被识别为 3 即使前后图像的图形组成有很大差异 当你…

懂个锤子Vue 项目工程化扩展:

Vue项目工程化扩展📶: 前言:当然既然学习框架的了,HTMLCSSJS三件套必须的就不说了: JavaScript 快速入门 紧跟前文,目标学习Vue2.0——3.0: 懂个锤子Vue、WebPack5.0、WebPack高级进阶 涉及的…

WEB前端开发中如何实现大文件上传?

大文件上传是个非常普遍的场景,在面试中也会经常被问到,大文件上传的实现思路和流程。在日常开发中,无论是云存储、视频分享平台还是企业级应用,大文件上传都是用户与服务器之间交互的重要环节。随着现代网络应用的日益复杂化&…

康师傅JAVA核心内容

链接:康师傅JAVA核心内容 (qq.com)

黑龙江等保测评如何做到既全面又高效?

在黑龙江省进行等保测评,必须在全面和高效之间寻求一个平衡点,以保证网络的安全性和可靠性。黑龙江等保测评怎样才能在二者之间发现黄金交汇点?下面,我们来揭开谜底。 精准定位,明确测评范围 首先,一个综…

Docker与LXC差异以及相关命令

容器:Docker与LXC差异以及相关命令 ​ LXC与Docker对比,LXC只实现了进程沙盒化,不支持在不同的机器上进行移植;Docker将应用的所有配置和环境进行了抽象,打包到一个容器中,此容器可以在任何安装了docker的…

vscode搭建rust开发环境

由于rustrover不是免费的,此处教学搭建一套基于vscode的rust开发环境,可运行,可调式 1.下载vscode1.91.1 Download Visual Studio Code - Mac, Linux, Windows 2.下载插件 打开网站下载插件 rust-analyzer-0.4.2049、vscode-lldb-1.10.0、…

IDEA项目的依赖(pom.xml文件)导入问题及解决

前言:该文章为转载,没有仔细的看 IDEA新建项目和pom.xml文件被修改时,右下角都会出现 Maven projects need to be imported(项目需要导入依赖) 如下,点击 Import Changes导入后,有时会一直处于…

NAS、SAN 与 DAS 的比较与应用场景

文章目录 1. NAS(网络附加存储)定义特点实现成本:适用场景 2. SAN(存储区域网络)定义特点实现成本:适用场景 3. DAS(直接附加存储)定义特点实现成本:适用场景 区别总结结…

Redis学习[1] ——基本概念和数据类型

Redis学习[1] ——基本概念和数据类型 一、Redis基础概念 1.1 Redis是什么,有什么特点? Redis是一个基于**内存的数据库,因此读写速度非常快**,常用作缓存、消息队列、分布式锁和键值存储数据库。支持多种数据结构:…

Java 内推 | 教育行业缺口来了,研发,运维,产品,教研,职能,营销... 别错过

Java 内推 | 教育行业缺口来了,研发,运维,产品,教研,职能,营销… 别错过 岗位职责: 1、根据公司战略及业务规划,参与部门业务架构分析与设计,包含规划立足当前、面向未来的应用架构…