milvus Delete api写s3的流程

news2024/11/17 23:34:23

Delete api写s3的流程

milvus版本:v2.3.2

整体架构:

在这里插入图片描述

Delete 的数据流向

在这里插入图片描述

delete相关配置

dataNode:
  segment:
    insertBufSize: 16777216 # Max buffer size to flush for a single segment.
    deleteBufBytes: 67108864 # Max buffer size to flush del for a single channel
    syncPeriod: 600 # The period to sync segments if buffer is not empty.

当collection已经有flushed文件,如果后续有insert和delete操作,这个配置文件控制这个行为。

s3文件不支持进行文件内容的编辑。因此需要有一种机制能够进行insert和delete。

delete在内存中(buffer)的流程

堆栈:

start()(internal\util\flowgraph\node.go)
  |--go nodeCtx.work()(同上)
    |--n.Operate(input)(同上)
      |--dn.bufferDeleteMsg()(internal\datanode\flow_graph_delete_node.go)
        |--dn.delBufferManager.StoreNewDeletes()(同上)
func (m *DeltaBufferManager) StoreNewDeletes(segID UniqueID, pks []primaryKey,
	tss []Timestamp, tr TimeRange, startPos, endPos *msgpb.MsgPosition,
) {
    // 获取delDataBuf
	buffer, loaded := m.Load(segID)
    // 如果不存在则新建
	if !loaded {
		buffer = newDelDataBuf(segID)
	}
    // 将pks存入buffer
	size := buffer.Buffer(pks, tss, tr, startPos, endPos)

	m.pushOrFixHeap(segID, buffer)
	m.updateMeta(segID, buffer)
	m.usedMemory.Add(size)

	metrics.DataNodeConsumeMsgRowsCount.WithLabelValues(
		fmt.Sprint(paramtable.GetNodeID()), metrics.DeleteLabel).Add(float64(len(pks)))
}

pks存储的是主键值。

这是对内存的操作。

delete写入s3的流程

Start()(internal\util\flowgraph\node.go)
  |--go nodeCtx.work()(同上)
    |--n.Operate(input)(同上)
      |--dn.flushManager.flushDelData()(internal\datanode\flow_graph_delete_node.go)
        |--m.handleDeleteTask()(internal\datanode\flush_manager.go)
          |--m.getFlushQueue(segmentID).enqueueDelFlush()(同上)
            |--q.getFlushTaskRunner(pos).runFlushDel()(同上)
              |--runFlushDel()(internal\datanode\flush_task.go)
                |--task.flushDeleteData()(同上)
                  |--t.MultiWrite(ctx, t.data)(internal\datanode\flush_manager.go)

当达到syncPeriod或者buffer满或者执行flush操作,会触发写s3操作。

看看这个函数flushDelData():

// notify flush manager del buffer data
func (m *rendezvousFlushManager) flushDelData(data *DelDataBuf, segmentID UniqueID,
	pos *msgpb.MsgPosition,
) error {
	// del signal with empty data
	if data == nil || data.delData == nil {
		m.handleDeleteTask(segmentID, &flushBufferDeleteTask{}, nil, pos)
		return nil
	}

	collID, partID, err := m.getCollectionAndPartitionID(segmentID)
	if err != nil {
		return err
	}
    // 编码解码器,提供序列化,反序列化功能
	delCodec := storage.NewDeleteCodec()
    // 序列化
	blob, err := delCodec.Serialize(collID, partID, segmentID, data.delData)
	if err != nil {
		return err
	}

	logID, err := m.AllocOne()
	if err != nil {
		log.Error("failed to alloc ID", zap.Error(err))
		return err
	}

	blobKey := metautil.JoinIDPath(collID, partID, segmentID, logID)
	blobPath := path.Join(m.ChunkManager.RootPath(), common.SegmentDeltaLogPath, blobKey)
    // 合成kvs
	kvs := map[string][]byte{blobPath: blob.Value[:]}
	data.LogSize = int64(len(blob.Value))
	data.LogPath = blobPath
	log.Info("delete blob path", zap.String("path", blobPath))
	m.handleDeleteTask(segmentID, &flushBufferDeleteTask{
		ChunkManager: m.ChunkManager,
		data:         kvs,
	}, data, pos)
	return nil
}

delCodec.Serialize()返回的变量blob类型为*Blob。

// Blob is a pack of key&value
type Blob struct {
	Key    string
	Value  []byte
	Size   int64
	RowNum int64
}

blobPath为s3的文件路径。

files/delta_log/447918772784340274/447918772784340275/447918772784340283/447918772783939606

delta_log存储的是insert和delete增量数据。

s3的截图:

在这里插入图片描述

在这里插入图片描述

总结

1.delete/insert增量数据写入buffer。

2.满足一定条件buffer刷入s3。

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

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

相关文章

Neo4j导入数据之JAVA JDBC

目录结构 前言设置neo4j外部访问代码整理maven 依赖java 代码 参考链接 前言 公司需要获取neo4j数据库内容进行数据筛查,neo4j数据库咱也是头一次基础,辛辛苦苦安装好整理了安装neo4j的步骤,如今又遇到数据不知道怎么创建,关关难…

【wails】(4):使用wails做桌面应用开发,整合chatgpt-web项目做前端,进行本地开发,web端也可以连调,使用websocket实现

1,视频地址 【wails】(4):使用wails做桌面应用开发,整合chatgpt-web项目做前端,进行本地开发,web端也可以连调,使用websocket实现 2,演示效果 启动先是报500 错误&#…

想设计智能手环,我需要设计哪种电路?

随着电子技术的高速发展,可穿戴设备逐渐火爆,其中之一是智能手环,作为现代可穿戴技术的热门产品之一,它集成了多种功能,如健康检测、运动跟踪、通知提醒等,为了实现这些功能,需要用上哪些电路模…

蜂窝物联网咖WiFi认证解决方案

项目背景 随着目前网咖模式越来越流行,给网吧部署一套无缝漫游的WIFI网络势在必行。同时,网吧无线准入的验证码在客户机上面进行更新,以防周边的人员进行蹭网,损失网吧的外网带宽。 01 需求分析 1. 网吧服务区域全部覆盖无盲区…

免费的WP模板网站推荐

免费wordpress模板下载 高端大气上档次的免费wordpress主题,首页大图全屏显示经典风格的wordpress主题。 https://www.wpniu.com/themes/289.html wordpress免费企业主题 深蓝色经典实用的wordpress网站模板,用wordpress免费企业主题搭建网站。 http…

大模型+影像:智能手机“上春山”

这个春节假期,一首《上春山》火了。吃瓜群众热热闹闹学了一个假期的“春山学”,了解了抢占C位的各种技巧。 假期过去,开工大吉,手机行业开始抢占今年的C位。那么问题来了,今年智能手机最大的机会点在哪里?答…

华为---RSTP(一)---RSTP简介

目录 1. STP(Spanning Tree Protocol,生成树协议)的作用 2. STP的缺点 2.1 STP网络拓扑收敛慢 2.2 STP网络链路故障,端口状态切换慢 2.3 终端链路参与STP网络运算,浪费网络资源 2.4 STP网络拓扑变更机制复杂&…

C语言之mkdtemp()特定占位符:XXXXXX 用法实例(八十五)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒…

网络原理 HTTP _ HTTPS

回顾 我们前面介绍了HTTP协议的请求和响应的基本结构 请求报文是由首行请求头空行正文来组成的 响应报文是由首行形影头空行响应正文组成的 我们也介绍了一定的请求头之中的键值对的属性 Host,Content-type,Content-length,User-agent,Referer,Cookie HTTP协议中的状态码 我们先…

nginx-------- 高性能的 Web服务端 (三) 验证模块 页面配置

一、http设置 1.1 验证模块 需要输入用户名和密码 htpasswd 此命令来自于 httpd-tools 包,如果没有安装 安装一下即可 也可以安装httpd 直接yum install httpd -y 也一样 第一次生成文件htpasswd -c 文件路径 姓名 交互式生成密码 htpasswd -bc 文…

【Vue3】学习computed计算属性

💗💗💗欢迎来到我的博客,你将找到有关如何使用技术解决问题的文章,也会找到某个技术的学习路线。无论你是何种职业,我都希望我的博客对你有所帮助。最后不要忘记订阅我的博客以获取最新文章,也欢…

Vision Transfomer系列第二节---Tricks测试

目录 学习式和固定式位置编码测试dropout的作用测试block深度的作用测试embeding维度大小的作用测试多头的作用测试Overlap Patch的作用 学习式和固定式位置编码测试 主要测试无位置编码\可学习位置编码和固定式位置编码的训练效果: 其中固定式位置编码采用之前博客的正余弦位…

动态规划算法学习(基础)

做题步骤: 确定dp数组的含义(一维或者二维) 获取递推公式 dp数组如何初始化 确定遍历顺序 打印dp数组(检查) 题目: 1. 斐波那契数 509 斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列 …

【C++】类和对象---友元,内部类,匿名对象详解

目录 友元 友元函数 友元类 内部类 匿名对象 ⭐友元 友元提供了一种突破封装的方式,有时提供了便利。但是友元会增加耦合度,破坏了封装,所以 友元不宜多用。 友元分为:友元函数和友元类。 ⚡友元函数 先看一个问题&#x…

React18源码: Fiber树中的全局状态与双缓冲

Fiber树构造 在React运行时中,fiber树构造位于 react-reconciler 包在正式解读 fiber 树构造之前,再次回顾一下renconciler的4个阶段 1.输入阶段:衔接react-dom包,承接fiber更新请求2.注册调度任务:与调度中心(schedu…

Nginx网络服务四-----日志、Nginx压缩和ssl

1.自定义访问日志 如果访问出错---404,可以去看error.log日志信息 访问日志是记录客户端即用户的具体请求内容信息,而在全局配置模块中的error_log是记录nginx服务器运行时的日志保存路径和记录日志的level,因此两者是不同的,而且…

机器视觉【3】非线性求解相机几何参数

线性求解相机几何参数的缺点 上一章节介绍学习了(DLT)线性求解相机几何参数,了解到线性求解法当中比较明显的缺点: 没有考虑到镜头畸变的影响不能引入更多的约束条件融入到DLT算法当中优化最关键的是,代数距离并不是…

Python入门学习——基础语法

一、Python解释器 1. Python解释器的作用是&#xff1a; 将Python代码翻译成计算机认识的O和1并提交计算机执行在解释器环境内可以一行行的执行我们输入的代码也可以使用解释器程序&#xff0c;去执行".py"代码文件 2. Python解释器程序在&#xff1a; <Python…

Jenkins详解

目录 一、Jenkins CI/CD 1、 Jenkins CI/CD 流程图 2、介绍 Jenkins 1、Jenkins概念 2、Jenkins目的 3、特性 4、产品发布流程 3、安装Jenkins 1、安装JDK 2、安装tomcat 3.安装maven 4安装jenkins 5.启动tomcat&#xff0c;并页面访问 5.添加节点 一、Jenkins CI/…

【Docker】免费使用的腾讯云容器镜像服务

需要云服务器等云产品来学习Linux可以移步/-->腾讯云<--/官网&#xff0c;轻量型云服务器低至112元/年&#xff0c;新用户首次下单享超低折扣。 目录 1、设置密码 2、登录实例&#xff08;sudo docker login xxxxxx&#xff09; 3、新建命名空间&#xff08;每个命名空…