聊聊 Milvus GC:从一次数据丢失事件展开

news2024/12/23 10:04:49

QueryNode 日志中频繁报错?对象存储数据离奇消失[1]?

令人震惊的数据丢失事件就这样发生了,一位来自 BOSS 直聘的 AI 研发工程师无意卷入到此次的风波中,他和 Milvus 社区的伙伴经过层层排查、抽丝剥茧,成功找出了问题所在——GC。

风波已然平息,不过,提起当日事件,这位工程师仍心有余悸,于是将自己的亲身经历记录下来,以求为其他伙伴提供借鉴。

对象存储数据离奇消失始末

那是一个风和日丽的下午,我像往常一样部署了一套 Milvus 集群,并写入了一批数据,愉快地进行着检索,相安无事。

好景不长,第二天我忽然发现 QueryNode 日志中频繁出现 No Such Key 的 ERROR,这个错误意味着节点无法从对象存储的对应路径下获取数据文件。已知并没有进行过任何删除操作与 TTL 设置,同时经过测试在 insert 后,对象存储中也确实能够正常产生相应的 Log 文件,数据消失发生在写入后的一定时间间隔之后。

最终经过社区协助,可以确定,这是由于路径配置重复,GC 操作造成的。

Milvus 的 GC 流程

我们知道,Milvus 的删除是软删除,即标记删除策略。在调用 drop 相关的方法时,会先在 meta 中将被删除项标记为 dropped,待到 GC 触发时,再进行具体的清理。

GC的目标主要包含两部分,一是 Etcd 中保存的元数据,二是对象存储的存储空间。

GC 行为由 DataCoord 发起。当 DataCoord 启动时,随之产生 Garbage Collector,执行周期性的 GC 任务,由 milvus.yaml 中的参数 dataCoord.gc.interval 指定 GC 周期。

alt

阅读 master 分支代码 internal/datacoord/garbage_collector.go 可知,每一次的 GC 分 5 步进行。

alt

第一步是 clearEtcd,在这一步中,主要关注已标记为 Dropped 的 segment。

a. 通过遍历 meta 中的 segment 信息,统计出所有应该删除的 segment 信息,再逐一执行删除操作。

b. 对于每个待删除的 segment,首先进行删除校验。

  • 判断 segment 是否满足过期时间,该时间由 dataCoord.gc.dropTolerance [2]参数指定;
alt
  • 判断 channel checkpoint 是否为最新,在 dml 位置之后;

  • 判断 compact 后的旧 segment 是否可以删除。(在 compact 过后,旧的 segment 会被标记为 Dropped,但若新的 segment 并未完成索引构建,则不能进行清理。)

c. 校验通过后,则执行对象存储回收动作,先清理 log 数据,再清理 meta 数据。

  • 删除对象存储的 log 数据;

  • 删除 meta 中的段信息;

  • 删除空 channel 及对应 checkpoint。

第二步是 recycleUnusedIndexes,清理已标记删除的 index 的 meta 信息。

第三步是 recycleUnusedSegIndexes,同样是清理 index 的 meta 信息,这一步主要关注没有对应 segment 信息的 index。

第四步是 scan,顾名思义,这一步中扫描所有的 segment 的 meta 数据与对象存储路径下文件(insetLog/statsLog/deltaLog),如果存储中的数据与元数据不匹配,在容忍一段时间后,执行清理,容忍时间由参数 dataCoord.gc.missingTolerance 指定。

alt

最后是 recycleUnusedIndexFiles,执行 index file 的清理。

流程与 scan 步骤类似,扫描对象存储的 index_file 路径,清理所有在 meta 中已删除的 index 的索引文件。其中,为加快清理速度,若该路径对应的 segment 已删除时,则直接删除所有以该 segment ID 为前缀的所有 index file。

alt

复盘小结

回到我们的问题上。经过排查,我发现该集群与另一集群配置了相同的 bucket 与 rootPath。通过对 GC 流程的了解,可知问题出现在第四步 scan。当集群 A 写入完成后,数据正常持久化到对象存储中,此时集群 B 的 garbage Collector 扫描存储路径,发现这一批数据在 meta 中不存在,但是由于仍在容忍时间内,所以暂不回收。而等到容忍时间一过,数据便被逐渐回收掉了。

如果不小心触发了此问题,配置到重复 bucket 存储路径的集群将互相干扰,互相 GC,互相损坏数据。当我们将其中的干扰集群下线后,问题便自然停止了。但伤痕难以抚平,若重新 load 那些遭到清理的 collection 时,我们会发现依然无法成功加载。这也很容易理解,在加载时,querynode 会按照 meta 中的 segment 存储路径寻找数据文件,一旦发生 No Such Key 的错误,便会加载失败。很可惜,这种数据的破坏是不可逆的(除非所依赖的对象存储有数据恢复的能力),不过如果是已经加载到内存的 collection,不会受到对象存储数据文件的消失的影响,仍可进行正常的检索操作。

为了避免此类乌龙事件的发生,我们需要保证一个独立的 Milvus 集群拥有独立的存储资源,若是依赖于外部的 Etcd 与对象存储服务,需要格外注意配置中 etcd.rootPath 与 minio.rootPath 的全局唯一。为什么会出现不同集群使用相同的存储路径的问题呢?这不能以粗心大意一言蔽之。主观上,这是手动部署的必然缺陷,若是将集群部署纳入到自动化流程中,进行统一的配置管理,可以防患于未然;客观角度,在集群启动时没有对存储路径的校验环节,一个简单的解决方法是对 rootPath 加锁,从而避免冲突配置的集群能够启动。 (本文作者马秉政系 BOSS 直聘 AI 研发工程师)

🌟【相关链接】🌟

[1] 问题链接

[2] dataCoord.gc.dropTolerance)


  • 如果在使用 Milvus 或 Zilliz 产品有任何问题,可添加小助手微信 “zilliz-tech” 加入交流群。 ​
  • 欢迎关注微信公众号“Zilliz”,了解最新资讯。 ​ alt

本文由 mdnice 多平台发布

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

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

相关文章

还在用 JS 做节流吗?CSS 也可以防止按钮重复点击

目录 一、CSS 实现思路分析 二、CSS 动画的精准控制 三、CSS 实现的其他思路 四、总结一下 众所周知,函数节流(throttle)是 JS 中一个非常常见的优化手段,可以有效的避免函数过于频繁的执行。 举个例子:一个保存按…

opencv_c++学习(二十)

一、形态学应用案例 开、闭运算、形态学梯度等原理: 相关函数: morphologyEx(InputArray src, OutputArray dst, int op, lnputArray kernel, Point anchor Point(-1,-1), int iterations 1, int borderType BORDER_CONSTANT, const Scalar & border…

Android中静态和动态文字的绘制和测量

Android中静态和动态文字的绘制和测量 Android中自定义视图的时候存在两种情况,静态文字和动态文字。 顾名思义,静态文字就是显示内容是固定的,不会产生变化的文字,而动态文字则是内容会不断产生变化的文字信息。 在说明为什么…

Revit技巧 | Revit中图元不可见怎么办?

在revit中,控制图元课件性的设置有很多种,因此图元不可见,也会有各种各样的原因,这也是经常困扰新手的问题,下面我把这些解决办法做一些归纳总结。 图元如果过远偏离当前视图的中心,将导致视图不可见这时&…

MySQL:数据库的查询与连接

目录 1.复合查询 1.1 多表查询(联合查询) 1.2 join on (inner join) 1.3 自连接 1.4 子查询 1.5 合并查询 2.内外连接 3.关于高内聚、低耦合 1.复合查询 1.1 多表查询(联合查询) 什么是多表插叙?实际开发中往…

网络安全管理员证书有什么用?2023证书怎么考?证书报考条件?

网络安全管理员是做什么工作的呢?现如今,网络高速发展,带动了很多行业的兴起,比如说电商行业,今天已经步入到足不出户即可购物的时代了,当然网络也是一把“双刃剑”,带来了好处的同时&#xff0…

Sui Move Object讲解

要了解Sui的独特特性,首先要了解Sui中以对象为中心的数据模型。 Sui的设计初衷是重新定义数字资产所有权的可能性。重新设计的一个基本部分 — — Sui是以对象为中心的数据模型,也是Sui和其他Layer 1区块链之间的一个显著区别。 其他L1如何处理资产所有…

day8 - 使用不同的滤波核进行图像降噪

本期主要介绍用于图像平滑处理的滤波,分别是方框滤波、均值滤波、中值滤波、高斯滤波,比较不同滤波的效果;并了解自定义滤波器进行图像处理。 完成本期内容,你可以: 会使用方框滤波、均值滤波、中值滤波、高斯滤波进行…

实时聊天组合功能,你了解吗?

你有兴趣安装实时聊天组合功能吗?如果您选择了SaleSmartly(ss客服),您的实时聊天插件可以不仅仅只是聊天通道,还可以有各种各样的功能,你不需要包含每一个功能,正所谓「宁缺勿滥」,功…

Windows主机中构建适用于K8S Operator开发环境

基于 win 10 打造K8S应用开发环境 一、wsl子系统安装 在cmd命令行终端或powershell中操作 1.1 确认windows操作系统版本 1.2 开启wsl功能 1.3 wsl配置 PS C:\Users\cpf> wsl提示:适用于 Linux 的 Windows 子系统没有已安装的分发版。可以通过访问 Microsoft St…

使用canvas给图片添加水印

上接文章“图片处理” canvas元素其实就是一个画布,我们可以很方便地绘制一些文字、线条、图形等,它也可以将一个img标签里渲染的图片画在画布上。 我们在上传文件到后端的时候,使用input标签读取用户本地文件后得到的其实是一个Blob对象&a…

Redis7实战加面试题-基础篇(Redis持久化,Redis事务,Redis管道,Redis发布订阅)

Redis持久化 RDB (Redis DataBase) RDB(Redis 数据库):RDB 持久性以指定的时间间隔执行数据集的时间点快照。实现类似照片记录效果的方式,就是把某一时刻的数据和状态以文件的形式写到磁盘上,也就是快照。这样一来即使…

HCIA-ARP、MAC、交换机工作原理

目录 万能数据转发模型 ARP协议:地址解析协议 以太网帧的交换 IP地址和Mac地址的区别: 以太网交换机介绍: 交换机的工作原理: ​编辑交换机处理数据的三种方式: Mac表和ARP表的区别: 万能数据转发模…

自定义注解和@Target、@Retention注解的使用

说明:注解可以理解为另一种形式的配置,可用于在类上、方法上等,标志是“”,如重写方法上的“Override”就是一种注解。这里我通过一个实例,来介绍自定义注解和java元注解(Target、Retention)的使…

案例20:Java物流管理系统设计与实现开题报告

博主介绍:✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专…

ChatGPT全球最大开源平替OpenAssistant:基于Pythia和LLaMA微调而来

论文地址:https://drive.google.com/file/d/10iR5hKwFqAKhL3umx8muOWSRm7hs5FqX/view 项目地址:https://github.com/LAION-AI/Open-Assistant 数据集地址:https://huggingface.co/datasets/OpenAssistant/oasst1 体验地址:http…

Hiredis的基本使用

目录 前言 一.hiredis的安装 二.同步API 2.1.连接Redis数据库 2.1.1 无超时时间,阻塞等待连接 2.1.2 设置超时时间,阻塞等待连接。 2.1.3 非阻塞,不管连接与否,立即返回。 2.2.执行命令 2.2.1 返回执行上下文 2.2.2 没有返回执…

伪类元素的用法总结

1:自闭标签不适用伪类元素 自闭合标签 1. 一般标签   由于有开始符号和结束符号&#xff0c;因此可以在内部插入其他标签或文字。 <p>“绿叶&#xff0c;给你初恋般的感觉。”</p> 2. 自闭合标签   由于只有开始符号而没有结束符号&#xff0c;因此不可以在内…

2023-05-24:为什么要使用Redis做缓存?

2023-05-24&#xff1a;为什么要使用Redis做缓存&#xff1f; 答案2023-05-24&#xff1a; 缓存的好处 买啤酒和喝啤酒的例子可以帮助我们理解缓存的好处。 假设你在超市里买了一箱啤酒&#xff0c;如果你需要每次想喝啤酒就去超市购买&#xff0c;无疑会浪费很多时间和精力…

vue+element纯手工完美模拟实现小米有品网站

一、预览 小米有品官网&#xff1a;小米有品 本作品demo预览地址&#xff1a;点击预览 二、效果图对比 1.官方效果截图&#xff1a; 2.作者实现的demo效果图&#xff1a; 首页&#xff1a; 上新精选&#xff1a; 商品详情&#xff1a; 购物车&#xff1a; 登录&#xff1a; …