如何在Milvus中压缩数据

695 阅读7分钟

DZone>大数据区>如何在Milvus中压缩数据

如何在Milvus中压缩数据

本文分析了Milvus 2.0中发布的新功能Compaction,它可以帮助你节省存储空间。请继续阅读,了解更多关于它如何帮助你。

Jun Gu user avatar通过

顾俊

CORE -

22年3月8日 - 大数据区 -分析

喜欢 (3)

评论

保存

鸣叫

3.00K浏览次数

加入DZone社区,获得完整的会员体验。

免费加入

如何在Milvus中压缩数据

随着Milvus 2.0 GA的正式发布,支持了一系列的新功能。其中,压实是新功能之一,可以帮助你节省存储空间。

压实是指将小片段合并成大片段,并清理逻辑上被删除的数据的过程。换句话说,压实通过清除binlogs中已删除或过期的实体来减少磁盘空间的使用。它是一个由数据协调触发的后台任务,由Milvus中的数据节点执行。

这篇文章剖析了Milvus中压缩的概念和实现。

什么是压实?

在深入探讨如何在Milvus 2.0中实现压实的细节之前,关键是要弄清楚Milvus中的压实是什么。

更多的时候,作为Milvus的用户,你可能已经被越来越多的硬盘空间使用所困扰了。另一个问题是,少于1024行的段是没有索引的,只支持粗暴的搜索来处理查询。由自动刷新或用户诱发的刷新造成的小段可能会妨碍查询效率。

因此,为了解决上面提到的两个问题,帮助减少磁盘的使用,提高查询效率,Milvus支持压缩。

LevelDBRocksDB这样的数据库将数据追加到排序字符串表(SSTables)。每次查询的平均磁盘读取量随着SSTables的数量增加,导致查询效率低下。为了减少读取放大并释放硬盘空间,这些数据库将SSTables压缩成一个。压实过程在后台自动运行。

同样地,Milvus将插入和删除的数据附加到binlogs中。随着binlogs数量的增加,更多的硬盘空间被使用。为了释放硬盘空间,Milvus压缩已删除和已插入数据的binlogs。如果一个实体被插入但后来被删除,一旦被压缩,它就不再存在于记录数据插入或删除的binlogs中。此外,Milvus也压缩--由Milvus自动创建的用于保存插入的数据的数据文件。

你如何配置压实?

Milvus的压实配置主要涉及两个参数:dataCoord.enableCompactioncommon.retentionDuration

dataCoord.enableCompaction 指定是否启用压实功能。它的默认值是 。true

common.retentionDuration 指定一个不运行压实的时期。它的单位是秒。当你压缩数据时,所有被删除的实体将无法用时间旅行进行搜索。因此,如果你打算用时间旅行进行搜索,你必须指定一个时间段,在这个时间段内,压实工作不运行,也不影响已删除的数据。为了确保用时间旅行搜索的准确结果,Milvus保留了在 。也就是说,在这个时期操作的数据将不会被压实。更多的细节,请看common.retentionDuration使用时间旅行的搜索

在Milvus中默认启用压实功能。如果你禁用了压实功能,但后来想手动启用它,你可以按照下面的步骤进行。

  1. 调用collection.compact() 方法来手动触发一个全局压实过程。然而,请注意,这个操作可能需要很长的时间。
  2. 调用该方法后,会返回一个压实ID。通过调用collection.get_compaction_state() 方法查看压实状态。

启用压实后,它在后台自动运行。由于压实过程可能需要很长的时间,压实请求被异步处理以节省时间。

如何实现压实

在Milvus中,你可以手动或自动实现压实。

手动压实binlogs或片段不需要满足任何触发条件。因此,如果你手动调用压实,无论如何都会压实binlogs或段。

然而,如果你想启用自动压实,需要满足某些压实触发条件,以便系统压实你的段或binlogs。

一般来说,在Milvus中,有两种类型的对象可以被压实:Binglogs和segment。

二进制日志压实

binlog是一个二进制日志,或者说是段中的一个较小的单元,它记录并处理Milvus矢量数据库中数据的更新和变化。一个区段的数据被持久化在多个binlog中。Binlog压缩在Milvus中涉及两种类型的binlog:插入binlog和delta binlog。

当数据被删除时,会产生Delta binlogs,而插入binlogs是在以下三种情况下产生。

  • 当插入的数据被追加时,该段达到了大小的上限并被自动刷新到磁盘。
  • DataCoord会自动刷新那些长时间未密封的段。
  • 一些API,如collection.num_entitiescollection.load() ,等等,都会自动调用刷新来把段写到磁盘上。

因此,binlog压缩,顾名思义,是指压缩段内的binlogs。更具体地说,在binlog压缩过程中,所有没有被保留的delta binlog和insert binlog都被压缩了。

当一个段被刷入磁盘,或者当Milvus要求全局压实,因为压实已经很久没有运行了,至少需要满足以下两个条件之一,才能触发自动压实。

  1. delta binlogs的行数超过总行数的20%。
  2. delta binlog的大小超过10MB。

段落压实

段落是一个由Milvus自动创建的数据文件,用于保存插入的数据。在Milvus中有两种类型的段:生长段和密封段。

一个增长的段一直在接收新插入的数据,直到它被密封。一个密封的段不再接收任何新的数据,并将被刷新到对象存储中,留下新的数据被插入到一个新创建的生长段中。

因此,段压实是指压实多个密封段。更具体地说,在段压实过程中,小段被压实成大段。

压实后产生的每个段不能超过段大小的上限,默认情况下是512MB。阅读系统配置,了解如何修改段大小的上限。

当一个段冲到磁盘上,或者当Milvus请求全局压实,因为压实已经很久没有运行了,需要满足以下条件才能触发自动压实。

  • 分段小于0.5*MaxSegmentSize ,大于10。

下一步是什么?

在学习了Milvus中压实的基础知识后,下一步是什么?目前,并不是所有配置压实的参数都在milvus.yaml 文件中,而且计划生成策略也比较基本。如果你有兴趣,请来为Milvus这个开源项目做贡献吧

另外,这也是介绍Milvus 2.0新功能的博客系列文章之一。在这个博客系列中阅读更多。

还有一篇关于负载平衡的文章将很快发表。请继续关注!

主题。

压实, 开源, AI, 大数据, 数据库操作, 新版本, binlog, 分段, 存储

经顾骏许可,发表于DZone。点击这里查看原文。

DZone贡献者所表达的观点属于他们自己。

DZone上的热门文章


评论

大数据 合作伙伴资源