开发者社区> -技术小助手-> 正文

【Elastic Engineering】在 Elasticsearch 7.10 中通过提高存储效率节省空间和成本

简介: 我们很高兴地宣布,在 Elasticsearch 7.10 中创建的索引将更小了。一味求大并非都是好事,我们的内部基准测试报告显示,空间占用降幅高达 10%。
+关注继续查看

作者: Adrien Grand  Elasticsearch Tech Lead

我们很高兴地宣布,在 Elasticsearch 7.10 中创建的索引将更小了。一味求大并非都是好事,我们的内部基准测试报告显示,空间占用降幅高达 10%。 

对于小型用例来说,这个数字可能看起来不算大,但对于处理 PB 量级数据(并需要为之支付云存储费用)的团队来说,这无疑是一笔非常可观的费用。特别是,对于我们的 Elastic 可观测性Elastic 安全解决方案所创建的索引,由于其中保存的数据具有重复性,因此节省效果会最明显。

我们下面先看看这项改进的工作原理,然后再探索一下让节省变为现实的 Apache Lucene 8.7 更新



当前存储的字段是如何压缩的


存储的字段是索引的一部分,用于存储文档的 _id 及其 _source。现在,存储的字段会被拆分成独立压缩的块。

为什么我们要拆分成数据块?数据块有助于保持对数据的快速随机访问。如果您要从存储的字段中检索字节序列,只需解压缩包含此字节序列中一个或多个字节的块即可。反之,如果您一次性压缩了所有数据,那么您会别无选择,只能在读取时解压缩所有数据,即使只需要其中的一个字节也要这样做。

Elasticsearch 提供了两种压缩选项:index.codec: default,指示 Elasticsearch 使用经 LZ4 压缩的 16kB 块;index.codec: best_compression,指示 Elasticsearch 使用经 DEFLATE 压缩的 60kB 块。

这两种压缩算法的一个重要组成部分就是字符串去重。每当在流中找到先前出现过的字符串时,便会将该字符串替换为对先前出现的那个字符串的引用。实际上,这是 LZ4 唯一做的事情,而 DEFLATE 会将字符串去重与 Huffman 编码结合起来,以便进一步压缩数据。

image.png

在对可观测性用例所产生的索引空间效率进行调查后,我们注意到增加块大小会显著提高压缩比。遗憾的是,增加块大小不是没有成本的,因为它们需要在检索时解压缩更多数据,这可能会降低 _search 的性能。



消解压缩之困的字典


通过字典既可以获得增大块大小的益处,又不会牺牲检索效率。具体方案是为压缩算法提供一个数据字典,该字典也可用于字符串去重。如果要压缩的数据流和字典之间有很多重复字符串,那么您可能最终会得到更好的压缩比。您要做的只是在解压时提供完全相同的字典,以便能够解压缩数据。

image.png

从 7.10 版开始,Elasticsearch 使用了更大的数据块,这些数据块本身被拆分为一个字典和 10 个使用该字典进行压缩的子块。

image.png

检索子块中包含的文档时,需要使用这个字典解压缩字典和包含文档的子块。

index.codec: default 现在使用经 LZ4 压缩的 4kB 字典和 60kB 的子块,而 index.codec: best_compression 使用经 DEFLATE 压缩的 8kB 字典和 48kB 的子块。默认编解码器增加的块大小可能会让您感到意外,因为上面提到过,更大的块大小会增加检索时间。 

但是,我们的基准测试表明,从 16kB 增加到 60kB 可以显著提高压缩比,而对检索时间的影响却很小。因为我们的测试显示,大多数用户不会注意到任何形式的速度下降,所以我们决定使用更大的块。



这个更新什么时候最有益?


可观测性(数据日志、指标和跟踪)和安全数据(终端数据、日志)的一个特殊性在于,生成的文档包含有关所观测内容的重要元数据,并且这些元数据在各个文档之间的变化不大。即使您正在监测许多主机或终端,其中的许多系统通常也会有共同的属性(如它们的操作系统)。这就使得这些文档具有高度可压缩性,使用字典将有助于移除更多重复的字符串,因为操作系统将不再是每 60kB 重复一次(假设是 best_compression),而是每 8+10*48=488kB 重复一次。


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云ECS云服务器初始化设置教程方法
阿里云ECS云服务器初始化是指将云服务器系统恢复到最初状态的过程,阿里云的服务器初始化是通过更换系统盘来实现的,是免费的,阿里云百科网分享服务器初始化教程: 服务器初始化教程方法 本文的服务器初始化是指将ECS云服务器系统恢复到最初状态,服务器中的数据也会被清空,所以初始化之前一定要先备份好。
14318 0
Elasticsearch-通过Kibana查看索引数据
引言   当数据存储到Elasticsearch后,我们希望能方便的通过界面进行查询,有两个工具能够满足我们的需要,一个是Elasticsearch-head插件,另一个是Kibana,笔者认为两个工具各有千秋,大家可以自行体会,不过就安装步骤来说,Elasticsearch-head真心麻烦,本文主要介绍如何部署Kibana,并使用Kibana来查看Elasticsearch中的索引数据。
8272 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
30122 0
自建Elasticsearch通过Logstash全量、增量迁移阿里云
利用Logstash将自建Elasticsearch数据全量、增量迁移到阿里云Elasticsearch。部署Logstash在阿里云ECS上,Logstash ECS选择和阿里云Elasticsearch集群相同的VPC,同时Logstash需要支持同时访问源ES集群、目标ES集群。 数据迁移可以全量迁移和增量迁移,首次迁移都是全量迁移,后续写入数据选择增量迁移,增量迁移需要索引有时间戳字段。环
94 0
关于安卓开发通过Toast显示消息提示框
Toast用于在屏幕中显示一个提示信息栏,该消息栏没有任何控制按钮,并且不会获得焦点,经过一定时间后自动消失。 作用:用于显示一些快速提示信息 有两种方式可以显示提示信息框 一: 调用Toast类的make Text()方法创建一个名称为toast(自定义)的Toast对象 关键代码 1 Toast toast = Toast.
945 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
21207 0
1631
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
JS零基础入门教程(上册)
立即下载
性能优化方法论
立即下载
手把手学习日志服务SLS,云启实验室实战指南
立即下载