如何在Milvus中压缩数据
本文分析了Milvus 2.0中发布的新功能Compaction,它可以帮助你节省存储空间。请继续阅读,了解更多关于它如何帮助你。
CORE -
22年3月8日 - 大数据区 -分析
喜欢 (3)
评论
保存
鸣叫
3.00K浏览次数
加入DZone社区,获得完整的会员体验。
如何在Milvus中压缩数据
随着Milvus 2.0 GA的正式发布,支持了一系列的新功能。其中,压实是新功能之一,可以帮助你节省存储空间。
压实是指将小片段合并成大片段,并清理逻辑上被删除的数据的过程。换句话说,压实通过清除binlogs中已删除或过期的实体来减少磁盘空间的使用。它是一个由数据协调触发的后台任务,由Milvus中的数据节点执行。
这篇文章剖析了Milvus中压缩的概念和实现。
什么是压实?
在深入探讨如何在Milvus 2.0中实现压实的细节之前,关键是要弄清楚Milvus中的压实是什么。
更多的时候,作为Milvus的用户,你可能已经被越来越多的硬盘空间使用所困扰了。另一个问题是,少于1024行的段是没有索引的,只支持粗暴的搜索来处理查询。由自动刷新或用户诱发的刷新造成的小段可能会妨碍查询效率。
因此,为了解决上面提到的两个问题,帮助减少磁盘的使用,提高查询效率,Milvus支持压缩。
像LevelDB和RocksDB这样的数据库将数据追加到排序字符串表(SSTables)。每次查询的平均磁盘读取量随着SSTables的数量增加,导致查询效率低下。为了减少读取放大并释放硬盘空间,这些数据库将SSTables压缩成一个。压实过程在后台自动运行。
同样地,Milvus将插入和删除的数据附加到binlogs中。随着binlogs数量的增加,更多的硬盘空间被使用。为了释放硬盘空间,Milvus压缩已删除和已插入数据的binlogs。如果一个实体被插入但后来被删除,一旦被压缩,它就不再存在于记录数据插入或删除的binlogs中。此外,Milvus也压缩段--由Milvus自动创建的用于保存插入的数据的数据文件。
你如何配置压实?
Milvus的压实配置主要涉及两个参数:dataCoord.enableCompaction 和common.retentionDuration 。
dataCoord.enableCompaction 指定是否启用压实功能。它的默认值是 。true
common.retentionDuration 指定一个不运行压实的时期。它的单位是秒。当你压缩数据时,所有被删除的实体将无法用时间旅行进行搜索。因此,如果你打算用时间旅行进行搜索,你必须指定一个时间段,在这个时间段内,压实工作不运行,也不影响已删除的数据。为了确保用时间旅行搜索的准确结果,Milvus保留了在 。也就是说,在这个时期操作的数据将不会被压实。更多的细节,请看common.retentionDuration使用时间旅行的搜索。
在Milvus中默认启用压实功能。如果你禁用了压实功能,但后来想手动启用它,你可以按照下面的步骤进行。
- 调用
collection.compact()方法来手动触发一个全局压实过程。然而,请注意,这个操作可能需要很长的时间。 - 调用该方法后,会返回一个压实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_entities,collection.load(),等等,都会自动调用刷新来把段写到磁盘上。
因此,binlog压缩,顾名思义,是指压缩段内的binlogs。更具体地说,在binlog压缩过程中,所有没有被保留的delta binlog和insert binlog都被压缩了。
当一个段被刷入磁盘,或者当Milvus要求全局压实,因为压实已经很久没有运行了,至少需要满足以下两个条件之一,才能触发自动压实。
- delta binlogs的行数超过总行数的20%。
- delta binlog的大小超过10MB。
段落压实
段落是一个由Milvus自动创建的数据文件,用于保存插入的数据。在Milvus中有两种类型的段:生长段和密封段。
一个增长的段一直在接收新插入的数据,直到它被密封。一个密封的段不再接收任何新的数据,并将被刷新到对象存储中,留下新的数据被插入到一个新创建的生长段中。
因此,段压实是指压实多个密封段。更具体地说,在段压实过程中,小段被压实成大段。
压实后产生的每个段不能超过段大小的上限,默认情况下是512MB。阅读系统配置,了解如何修改段大小的上限。
当一个段冲到磁盘上,或者当Milvus请求全局压实,因为压实已经很久没有运行了,需要满足以下条件才能触发自动压实。
- 分段小于0.5*
MaxSegmentSize,大于10。
下一步是什么?
在学习了Milvus中压实的基础知识后,下一步是什么?目前,并不是所有配置压实的参数都在milvus.yaml 文件中,而且计划生成策略也比较基本。如果你有兴趣,请来为Milvus这个开源项目做贡献吧
另外,这也是介绍Milvus 2.0新功能的博客系列文章之一。在这个博客系列中阅读更多。
还有一篇关于负载平衡的文章将很快发表。请继续关注!
主题。
压实, 开源, AI, 大数据, 数据库操作, 新版本, binlog, 分段, 存储
经顾骏许可,发表于DZone。点击这里查看原文。
DZone贡献者所表达的观点属于他们自己。
DZone上的热门文章
评论