Milvus lite start 及存储策略

背景

今天开始写下Milvus,为了方便,我直接使用的是  milvus-lite 版本,default 情况下,你可能不知道他到底将 db 存储到什么位置了。启动 default-server,看下Milvus 的start及存储逻辑

主逻辑

def start(self):self.config.resolve()_initialize_data_files(self.config.base_data_dir)

-> 看下 resolve 的逻辑:

def resolve(self):self.cleanup_listen_ports()self.resolve_all_listen_ports()self.resolve_storage()for key, value in self.configurable_items.items():if value[1] is None:raise RuntimeError(f'{key} is still not resolved, please try specify one.')# ready to startself.cleanup_listen_ports()self.write_config()self.verbose_configurable_items()

-> 重点是 resolve_storage,继续看:

def resolve_storage(self):self.base_data_dir = self.configs.get('data_dir', self.get_default_data_dir())self.base_data_dir = abspath(self.base_data_dir)makedirs(self.base_data_dir, exist_ok=True)config_dir = join(self.base_data_dir, 'configs')logs_dir = join(self.base_data_dir, 'logs')storage_dir = join(self.base_data_dir, 'data')for subdir in (config_dir, logs_dir, storage_dir):makedirs(subdir, exist_ok=True)

-> 先看下 base dir:,get_default_data_dir:

def get_default_data_dir(cls):if sys.platform.lower() == 'win32':default_dir = expandvars('%APPDATA%')return join(default_dir, 'milvus.io', 'milvus-server', __version__)default_dir = expandvars('${HOME}')return join(default_dir, '.milvus.io', 'milvus-server', __version__)

看到这里,你应该明白,网上有人说使用Milvus 必须要下载 docker,那不太对,别人是支持 win32的。而且这个源码还是使用的 2.26 的版本,最新的2.4 更应该支持。

非常清晰。继续看,日志和配置,晚点在说,先看 data,因为你最关心的,也应该是 data 部分:

看下 data 的 结构:

# data
self.set('etcd_data_dir', join(storage_dir, 'etcd.data'))
self.set('local_storage_dir', storage_dir)
self.set('rocketmq_data_dir', join(storage_dir, 'rocketmq'))

关于这里的配置文件最终会写在:

中,当然除了上面的咨询,你也可以看到下面索引的核心default 配置:

HNSW 在前面的文章已经讲述过了,默认采用的是 HNSW 可导航分成小世界算法,采用IP丈量距离的方式,M和efCons 是 HNSW 的两个参数,分别代表本层和向下寻找的节点数。

config = MilvusServerConfig()
config.base_data_dir = 'milvus_austin_base_data_dir'
server = MilvusServer(config, debug=True)
server.start()

你发现这样设置了无效,原因应该通过上面的代码很清楚了,

self.base_data_dir = self.configs.get('data_dir', self.get_default_data_dir())

已经限制了他的输出路径。

如何修改

要怎么才能使得放在自己的目录下呢?其实有个函数,你在调用下:

server.set_base_dir(config.base_data_dir)

ok了

你可能会比较疑惑,代码是 

为什么设置了 没有被覆盖?

原因很简单:

原因很清楚了

当然你也可以直接调用 Milvus 封装好的 milvus-server --debug 启动,后面也可以接 --data 参数。但我更喜欢自己看内部的实现。

start逻辑

其实 milvus lite 的 start 就三个作用:

1)加载全局配置,将 data 相关的copy 到指定位置,没有的话,就创建folder 和文件

2)用进程方式加载 milvus.exe

cmds = [milvus_exe, 'run', 'standalone']
proc_fds = self.proc_fds
if self._debug:self.server_proc = subprocess.Popen(cmds, env=envs)
else:# pylint: disable=consider-using-withself.server_proc = subprocess.Popen(cmds, stdout=proc_fds['stdout'], stderr=proc_fds['stderr'], env=envs)

3)等待 client 指令

实际上, milvus lite,只是一个外壳,启动了 milvus exe 执行

与传统数据库对比

Milvus Collection 就是 传统db 的 table

entity 就是 传统 db 的row

field 就是传统db 的 column
这个前面讲的chroma 很接近。因为在vector db 的世界中都大同小异。

milvus架构

1)接入层(Access Layer):系统的门面,由一组无状态 proxy 组成。负责客户端请求并返回结果。
2)协调服务(Coordinator Service):Coordinator,顾名思义,协调者,负责分配任务给执行节点。协调功能有四种,分别为 root coord、data coord、query coord 和 index coord。
3)执行节点(Worker Node):负责执行协调者所下发的任务,实际干活儿的人。执行节点分为三种角色,分别为 data node、query node 和 index node。
4)存储服务 (Storage): 负责 Milvus 数据的存储,也就是持久化,分为元数据存储(meta store)、消息存储(log broker)和对象存储(object storage)三个部分。

实际上我们看到 Milvus 这种架构做的非常优秀,适合数据与服务的横向扩展

接入层和协调服务

root coordinator

主要处理DDL 与  DCL 请求,包括 create 与 delete collections, partitions, or indexes 等。还有一些与时间同步等请求。

query coodinator

查询coodinator 有点不太好理解,要多描述下。它主要负责管理查询节点(Query node)的拓扑结构和负载均衡,以及处理从增长段(Growing segments)到密封段(Sealed segments)的转换操作。有点生硬,展开描述一下:
 

1.管理查询节点的拓扑结构

  • 拓扑结构管理:Query coord负责维护系统中所有查询节点的布局和连接关系。这确保了当查询请求到来时,系统能够高效地将请求分发到合适的查询节点上进行处理。
  • 节点状态监控:Query coord还负责监控查询节点的状态,包括节点的健康状况、负载情况等,以便在必要时进行节点间的负载均衡调整。

2. 负载均衡

  • 请求分发:Query coord接收来自客户端的查询请求,并根据当前查询节点的负载情况和拓扑结构,智能地将请求分发到合适的节点上进行处理。这有助于提高系统的整体性能和响应时间。
  • 动态调整:随着查询请求的变化和查询节点负载的波动,Query coord会动态地调整查询节点的负载,以确保系统的负载均衡性和稳定性。

3. 从增长段到密封段的转换

    这算是milvus 的一大特色。其他地方很少听到这种存储理念。

  • 段的状态管理:在Milvus中,数据被组织成段(segments),这些段可以是增长段(Growing segments)或密封段(Sealed segments)。增长段用于存储新的写入数据,而密封段则用于存储已经稳定的数据。
  • 转换操作:当增长段的数据量达到一定程度时(默认为512MB),Query coord会触发从增长段到密封段的转换操作。这个过程中,Query coord会协调查询节点和数据节点,将增长段中的数据迁移到密封段,并进行必要的索引构建和优化操作。

data coordinator

顾名思义,就是存data的。包括了索引,数据,及元数据。负责管理数据节点(Data node)和索引节点(Index node)的拓扑结构、维护元数据,并触发如flush、compact、索引构建等后台数据操作。以下是这些职责的详细阐述:

1. 管理数据节点和索引节点的拓扑结构

Data coord负责维护系统中数据节点和索引节点的整体布局和相互连接关系。这种拓扑结构的设计旨在确保数据的均匀分布和高效访问。随着系统的扩展或节点的增减,Data coord会相应地调整拓扑结构,以保持系统的平衡和高效。

2. 维护元数据

元数据是描述数据的数据,对于Milvus系统来说,包括但不限于集合(collection)、分区(partition)、段(segment)的定义、属性以及它们之间的关系。Data coord负责存储和更新这些元数据,确保它们在系统中的一致性和准确性。这对于数据查询、数据迁移、数据恢复等操作至关重要。

3. 触发后台数据操作

Data coord负责监控系统的状态,并在适当时机触发一系列后台数据操作,以优化数据存储和查询性能。这些操作包括:

  • Flush操作:当内存中的数据量达到阈值时,Data coord会触发flush操作,将内存中的数据写入磁盘上的段中。这有助于减少内存使用,并确保数据的持久化。
  • Compact操作:为了优化存储效率和查询性能,Data coord会定期或按需触发compact操作。这个过程中,多个小段(segment)会被合并成一个大段,并删除其中的重复或无效数据。
  • 索引构建:根据用户配置的索引策略和参数,Data coord会触发索引构建操作。索引的创建可以显著加快查询速度,因为系统可以直接在索引上执行搜索,而无需遍历整个数据集。
  • 其他后台操作:除了上述操作外,Data coord还可能触发其他必要的后台数据操作,如数据修复、数据迁移、数据清理等,以确保系统的稳定性和数据的可靠性。

从整体上说,query coord 就是为了负载均衡及query 等效率。所以从这里看出 milvus 对query 效能是有比较好的设计。当然类似  partition 的设计 chroma 也有。只是segment 在 milvus 中还进行了区分。

Index coordinator

index coord主要负责管理索引节点(Index node)的拓扑结构、构建索引、维护索引元信息,并协调索引相关的操作。以下是Index coord主要职责的详细阐述:

1. 管理索引节点的拓扑结构

  • Index coord负责维护系统中索引节点的布局和连接关系,确保索引数据能够均匀分布在各个索引节点上,以实现高效的索引构建和查询。
  • 随着系统的扩展或索引节点的增减,Index coord会相应地调整拓扑结构,以保持系统的平衡和高效。

2. 构建和维护索引

  • 当有新的向量数据需要被索引时,Index coord会协调索引节点进行索引构建工作。这包括选择合适的索引算法、分配索引任务给索引节点,并监控索引构建的进度和结果。
  • Index coord还负责维护索引的元信息,如索引的类型、参数、状态等,以便在查询时能够快速地定位到相应的索引数据。

3. 协调索引相关的操作

  • Index coord会与其他协调器(如Data coord、Query coord)和执行节点(如Data node、Query node)进行交互,以协调索引相关的操作。例如,在数据迁移或数据修复过程中,Index coord会确保索引数据的一致性和完整性。
  • 当索引节点发生故障或性能瓶颈时,Index coord会参与故障恢复或负载均衡的决策过程,以确保系统的稳定性和性能。

4. 支持索引的更新和删除

  • 随着数据的不断变化,索引也需要进行相应的更新或删除操作。Index coord会处理这些请求,并确保索引的更新或删除操作能够正确地执行,同时保持索引数据的一致性和准确性。

5. 监控和优化索引性能

  • Index coord会监控索引的性能指标,如索引构建速度、查询响应时间等,并根据监控结果进行相应的优化操作。例如,通过调整索引算法、参数或增加索引节点来提高索引的性能。

milvus 的底层采用的是对象存储负责存储日志的快照文件、标量/向量索引文件以及查询的中间处理结果。采用 MinIO 作为对象存储。

当系统启动后,我们看到各自服务的端口是不一样的:

[INFO] [indexcoord/service.go:328] [IndexCoord] ["network address"=192.168.3.164] ["network port"=40003]

[INFO] [querynode/service.go:111] [QueryNode] [port=40002]

["Proxy internal server listen on tcp"] [port=19529]

["Proxy server listen on tcp"] [port=19530]

外面使用 19530 访问,内部 milvus 通过 19529 进行分发到内部处理

存储结构

其实在最底层,milvus 的存储是  etcd + MinIO 的形式

我们可以打开etcd文件夹,能窥探到一点内容,当然,网上有专门的软件打开,我这里直接打开看一看,也能看到一点痕迹:

其实这里每一个概念都可以是一个topic,先简单介绍下吧,后面再细说。什么是 wal?write-ahead logging,预写日志系统。这里就体现出milvus的设计理念。尽快可靠的返回,不要阻塞用户操作,真正需要系统落地的事情,根据wal 的记录交给milvus后面以async的方式来完成吧。

当用户向系统中插入数据时, milvus会先把数据攒在内存里,然后当内存数据达到一定规模(默认128M)或者定时器超时(默认1s)后,内存数据再排队刷入磁盘。当数据真正落盘后它们就能被访问了。这个设计借鉴了操作系统对流数据的处理方式,在写磁盘频率和数据可靠性之间做了一定的平衡。然而随着我们接触到越来越多的用户场景,以上设计渐渐不能满足需求了。首先,用户命令的原子性没得到保证,比如在系统意外退出时,用户某一次插入的数据可能部分落盘、部分丢失;其次,用户无法明确知道数据何时可见,即使在客户端等待1s也未必能保证之前插入数据全部可见;最后,当初设计时没有考虑数据删除,同步执行删除有可能要长时间阻塞用户线程。为解决上述问题,wal文件机制应运而生,没记错的话,应该是 milvus早期0.7 就引入wal文件。

先直观感受下wal文件:

还是能感受点东西,可以自己体会下,好东西有时候只能意会不能言传。

其核心思想是把用户所有的修改操作(插入、删除)先写入日志中,然后再应用到系统状态里。一旦成功写完日志,即可通知用户操作成功。由于日志是以尾部追加方式写入,耗时较短,所以不会长时间阻塞用户线程。此外为防止意外退出导致数据丢失,系统重启时还会根据日志重做用户操作,以保证数据可靠性。这个消息队列的某些机制很像。时间有限,今天先写到这里。后面再慢慢梳理

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

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

相关文章

【绿色版】Mysql下载、安装、配置与使用(保姆级教程)

大家都知道,Mysql安装版的卸载过程非常繁琐,而且卸载不干净会出现许多问题,很容易让大家陷入重装系统的窘境。基于此,博主今天给大家分享绿色版Mysql的安装、配置与使用。 目录 一、Mysql安装、配置与使用 1、下载解压 2、创建…

vue对axios进行请求响应封装

一、原因 像是在一些业务逻辑上,比如需要在请求之前展示loading效果,或者在登录的时候判断身份信息(token)等信息有没有过期,再者根据服务器响应回来的code码进行相应的提示信息。等等在请求之前,之后做的一…

ABAP注释快捷键修改(留着备用)

ABAP注释快捷键修改(留着备用) 在使用ABAP编辑器的时候,原有的添加代码注释和取消代码注释的快捷键未生效,这时我们可以考虑对注释快捷键进行修改 在事务码SE38(ABAP编辑器)屏幕右下角,点击【Options选项】图标 在【键盘】|【命令】输入栏中…

DWM 相关实现代码 [自用]

1. DWM 缩略图和模糊隐藏实现半透明 #include <windows.h> #include <dwmapi.h> #include <string> #pragma comment(lib, "dwmapi.lib")// 检查 UWP 窗口是否可见 bool IsUWPWindowVisible(HWND hwnd) {DWORD cloaked 0;DwmGetWindowAttribute(…

【c语言】玩转文件操作

&#x1f31f;&#x1f31f;作者主页&#xff1a;ephemerals__ &#x1f31f;&#x1f31f;所属专栏&#xff1a;C语言 目录 引言 一、文件的打开和关闭 1.流 2.标准流 3.文本文件和二进制文件 4.控制文件打开与关闭的函数 二、文件的顺序读写 三、文件的随机读写 1…

深入理解OAuth 2.0:原理、流程与实践

一、什么是OAuth 2.0 1. 什么是OAuth 2.0 OAuth 2.0 是一套关于授权的行业标准协议。 OAuth 2.0 允许用户授权第三方应用访问他们在另一个服务提供方上的数据&#xff0c;而无需分享他们的凭据&#xff08;如用户名、密码&#xff09;。 2. OAuth 2.0 应用场景 OAuth 2.0的…

服务器U盘安装Centos 7时提示Warning:/dev/root does not exist

这是没有找到正确的镜像路径导致的&#xff0c;我们可以在命令行输入ls /dev看一下有哪些盘符 像图中红色圈起来的就是我插入U盘的盘符&#xff0c;大家的输几盘可能做了多个逻辑盘&#xff0c;这种情况下就可以先将U盘拔掉再ls /dev看一下和刚才相比少了那两个盘符&#xff0c…

权力之望怎么下载客户端 权力之望一键下载

《权力之望》是一款由NX3 Games开发、Smilegate发行的多人在线动作MMORPG游戏。这款游戏最大的特点是高度的自由度和丰富的角色定制选项。我们在游戏中不仅可以自由更换武器&#xff0c;而且游戏还提供了54种能力和60多种职业选择&#xff0c;让我们可以根据自己的游戏风格和喜…

继 承

为什么要有继承&#xff0c;继承的作用&#xff1f; 继承(inheritance)机制&#xff1a;是面向对象程序设计使代码可以复用的最重要的手段&#xff0c;它允许程序员在保持原有类特性的基础上进行扩展&#xff0c;增加新功能&#xff0c;这样产生新的类&#xff0c;称派生类。 …

【人工智能】—基于成都市各区(市)县租房价格预测建模研究

引言 随着城市化进程的加速&#xff0c;人口流动日益频繁&#xff0c;租房市场作为城市生活的重要组成部分&#xff0c;其价格波动对居民生活质量和城市经济发展具有显著影响。成都市&#xff0c;作为中国西部地区的经济、文化、交通和科技中心&#xff0c;近年来吸引了大量人…

为什么独立站需要高质量的GPB外链?

独立站需要高质量的GPB外链&#xff0c;主要是因为它们能显著提升网站的可信度和可见性。高质量的外链相当于得到其他权威网站的认可和推荐&#xff0c;这会让搜索引擎认为你的内容有价值&#xff0c;从而提升你的搜索排名。试想一下&#xff0c;当其他有影响力的网站愿意链接到…

请求接口在控制台报cors跨域问题

我的问题是&#xff1a;BASE_URL没有和本地IP设置一致 刚开始&#xff1a;&#xff08;这个不是我本地电脑的地址&#xff09; 所以我要把&#xff1a;这个地址改为我本地电脑的ip&#xff08;http://192.168.2.50:8087&#xff09; BASE_URL: http://localhost:8087/api/ 或…

单位电脑文档怎么加密?哪种方法最有效?

单位电脑文档的加密是保障信息安全的重要措施之一&#xff0c;它可以防止未经授权的访问和数据泄露。 选择最佳的加密方法取决于您的具体需求&#xff0c;包括文档的敏感程度、加密的便捷性、成本、以及是否需要跨平台兼容性。下面是几种常见的加密方法及其优缺点&#xff0c;…

昇思学习打卡-8-FCN图像语义分割

目录 FCN介绍FCN所用的技术训练数据的可视化模型训练模型推理FCN的优点和不足优点不足 FCN介绍 FCN主要用于图像分割领域&#xff0c;是一种端到端的分割方法&#xff0c;是深度学习应用在图像语义分割的开山之作。通过进行像素级的预测直接得出与原图大小相等的label map。因…

若依微服务初始化搭建教程

文章目录 &#x1f95d;从Gitee拉取代码&#x1f344;初始化项目配置配置项目maven配置项目JDKmaven - clean - install &#x1f352;数据源配置创建config / seata数据库创建ry-cloud数据源导入ry-cloud数据 &#x1f370;启动Nacos下载Nacos修改Nacos配置双击startup.cmd启动…

GraphRAG:AI的全局文本理解革新

前言 在人工智能领域&#xff0c;处理和理解大量文本数据始终是一个挑战。随着大型语言模型&#xff08;LLMs&#xff09;的出现&#xff0c;自动化地进行复杂的语义理解和文本摘要变得可能。检索增强生成&#xff08;RAG&#xff09;方法因其能有效结合检索与生成技术&#x…

C++基础语法之重载引用和命名空间等

1.C关键字 c的关键字比我们的c语言的关键字多&#xff0c;c包容C语言并对C语言进行了补充&#xff0c;但是我们对关键字的学习是在我们后面逐渐学习的。这里我们的只是提供一个表格对齐了解一下。 2.命名空间 我们c出现了命名空间的概念&#xff0c;用关键字namespace来定义。…

论文阅读 - Intriguing properties of neural networks

Intriguing properties of neural networks 经典论文、对抗样本领域的开山之作 发布时间&#xff1a;2014 论文链接: https://arxiv.org/pdf/1312.6199.pdf 作者&#xff1a;Christian Szegedy, Wojciech Zaremba, Ilya Sutskever, Joan Bruna, Dumitru Erhan, Ian Goodfellow,…

信息技术课堂上如何有效防止学生玩游戏?

防止学生在信息技术课堂上玩游戏需要综合运用教育策略和技术手段。以下是一些有效的措施&#xff0c;可以用来阻止或减少学生在课堂上玩游戏的行为&#xff1a; 1. 明确课堂规则 在课程开始之初&#xff0c;向学生清楚地说明课堂纪律&#xff0c;强调不得在上课时间玩游戏。 制…

电阻负载柜的工作原理是什么?

电阻负载柜是用于模拟电网中各种负载特性的设备&#xff0c;广泛应用于电力系统、新能源发电、电动汽车充电站等领域。其工作原理主要包括以下几个方面&#xff1a; 1. 结构组成&#xff1a;电阻负载柜主要由变压器、调压器、电阻器、控制器、保护装置等部分组成。其中&#xf…