京东ES支持ZSTD压缩算法上线了:高性能,低成本
liebian365 2024-10-31 15:18 10 浏览 0 评论
京东 ES 支持 ZSTD 压缩算法上线了,这是一种高性能、低成本的压缩算法,能够提高数据存储和传输的效率,同时降低存储和带宽成本。ZSTD 算法是一种快速压缩算法,可提供比其他压缩算法更高的压缩比和更快的压缩速度。这意味着,京东 ES 用户可以更高效地存储和传输数据,同时节省存储和带宽成本。此外,ZSTD 算法还具有更好的可扩展性和鲁棒性,可满足大规模分布式系统的需求。因此,京东 ES 支持 ZSTD 压缩算法上线,将为用户带来更高的性能、更低的成本和更好的体验。
01 前言
在今年的敏捷团队建设中,我通过 Suite 执行器实现了一键自动化单元测试。Juint 除了 Suite 执行器还有哪些执行器呢?由此我的 Runner 探索之旅开始了!
在 2022 年 10 月份《ElasticSearch 降本增效常见的方法》一文中曾提到过 zstd 压缩算法 [1],一步一个脚印,我们终于在京东 ES 上线支持了 zstd;我觉得促使目标完成主要以下几点原因:
1.Elastic 官方原因:zstd 压缩算法没有在 Elastic 官方的开发计划中;Elastic 的 licenes 变更,很多功能使用受限
2.ES 产品竞争力:提升京东 ES 产品在业界的竞争力,两大云友商和其他大厂都在陆续支持,在对外比拼的时候,我们需要提升我们这方面的能力
- 信创大背景:我们需要对开源组件有更好的自主管控和建设能力
- 京东零售 ES 与云 ES 产品融合:有更好的机会去打磨我们的 ES 内核
- 降本增效:ztsd 压缩算法,能够在降低存储成本的前提下,保证性能几乎不受损,写入性能还有所提升
02 测试结果
测试集群配置:4c8g; 3 个数据节点;
测试索引设置:3 主分片 1 副本
测试数据 mapping: keyword 字段 14 个,geo_point 字段 3 个,integer 字段 2 个,text 字段 1 个,date 字段:2 个,ip 类型字段 1 个,boolean 字段 1 个
在考虑到读写性能和压缩比均衡的情况下,我们推荐使用 jd_zstd (压缩等级 3):
jd_zstd (压缩等级 3) 写入性能相对于 best_compression 提升 38.46%,相对于 lz 提升 5.88%;
jd_zstd (压缩等级 3) 存储相对于 lz4 节省 24%,与 best_compression 基本持平,单位写的 gb 实际是要比 best_compression 的存储量小。
下表为 es6.8.23 版本,在 cpu 压测到 100% 时,不通压缩算法下 ES 的 bulk、termquery、rangequery、matchquery 等 TPS 以及压缩比测试结果:
注意??:测试数据仅供参考,实际情况与用户数据有关
03 适用场景
写多读少的场景,比如日志和监控场景。
04 使用方法
云上 ES 等待上线后,可以进行申请
目前我们暂时只在内部泰山零售 ES 上线,支持 7.X 和 6.8.23 版本;后续会在云舰 ES 和公有云 ES 上线,由于 licenes 的限制,我们将只推出 6.8.23 版本。
Q1: 如何申请?
A1: 内部用户:之前在泰山平台申请的杰斯 ES,如果使用的是 7.X 和 6.8.23,可以选择版本升级到最新版本。新建集群,直接提工单申请
Q2 ztsd 如何使用?
A2: 我们在 ES 中支持两种 zstd 压缩等级,用户可以根据自己的业务和数据特性选择合适的压缩等级;ES 创建索引时指定 index.codec:jd_zstd(压缩等级为 3)或者 jd_zstd_6(压缩等级为 6) 即可,其余没有其他任何特殊之处。
注意??:index.codec 的压缩算法不支持动态修改,必须创建索引时设定好。
创建索引zstdtest 压缩等级为 3
PUT zstdtest
{
“settings”: {
“index”: {
“codec”: “jd_zstd”
}
}
}
创建索引zstdtest_6 压缩等级为 3
PUT zstdtest_6
{
“settings”: {
“index”: {
“codec”: “jd_zstd_6”
}
}
}
05 技术实现
首先我们介绍下 ES 与 Lucene 的关系;如下图所示,在集群层面:一个 ES 集群由多个节点组成。数据层面:1 个索引是由多个分片组成的,一个分片可以看是一个 Lucene 实例;一个分片包含多个 segement,一个 segement 即一组数据的最小单元,包含很多的数据文件。
1.Lucene 文件
lucene [2] 的数据文件主要由以下文件组成:
上述的文件大致可以分为以下几类:
行存相关文件:主要包括原文存储文件.fdt 和原文索引文件.fdx。用户写入的原始数据都被存储于.fdt,占比是最大的,Lucene 在原文存储上支持 LZ4 和 ZIP (best_compression) 压缩。在写入数据时,ES 把 doc 原始数据的整个 json 结构体当做一个 string,存储为_source 字段,因此原文存储文件.fdt 中_source 字段占比最大;部分场景为了节省磁盘存储,直接将该字段关闭,数据查询时仍可通过 ES 的 docvalue_fields 获取所有字段的值;
“_source”: {
“enabled”: false
}
注意??:关闭_source 后, update, update_by_query, reindex 等功能无法正常使用,因此有 update 等需求的索引不能关闭_source.
列存相关文件:.dvd 文件,常用于 OLAP 分析,ES 使用列存来支持 sorting, aggregations 和 scripts 功能。不同文档 Document 中的同一列 (Field) 数据相邻存放,加速列聚合分析性查询。相邻每列类型相同,在存储的时候可以进行统一性的编码优化,提高压缩率,减少存储磁盘空间的占用。ES 中字段使用 doc_values 字为 true,即为开启列存储。
索引相关文件:主要文件包括字典数据文件.tim 和倒排索引.doc 文件。ES 依靠分词器产生倒排索引,从而具备强大的全文检索能力。索引配置分词器后,将从摄入文档数据中提取分词信息并存储于.tim 文件。同一列的分词信息相邻存放,按块组织;.doc 文件也被称为 “倒排拉链表”,记录每一个词项所关联的文档 id 列表,实现词项到文档的快速倒排查找。倒排索引也会进行压缩,其压缩算法主要有 Frame Of Reference、Roaring Bitmap 和 fst 等。
向量数据文件:矢量索引 tvx 和矢量数据.tvd 文件,支持以图搜图,和音频的查找等。通过对摄入实体进行矢量化,然后使用向量搜索算法进行检索。相关向量搜索算法有 HNSW [3],近似向量搜索 knn [4];elastic 公司在今年 5 月份左右推出用于人工智能的 Elasticsearch 相关性引擎 ESRE [5]。
zstd 主要压缩为行存储相关文件.fdm、.fdt 和.fdx;如下代码块为压缩文件对比,可以看出在不同的压缩算法中,这几个文件的大小是不同的。
为了节省篇幅部分文件省略
lz4压缩算法索引testlz4 0 号分片
total 2.4G
-rw-r–r-- 1 admin admin 1.2K Nov 16 16:19 _32.fdm
-rw-r–r-- 1 admin admin 1.3G Nov 16 16:19 _32.fdt
-rw-r–r-- 1 admin admin 76K Nov 16 16:19 _32.fdx
-rw-r–r-- 1 admin admin 85M Nov 16 16:21 _32.kdd
-rw-r–r-- 1 admin admin 149M Nov 16 16:21 _32_Lucene80_0.dvd
…
-rw-r–r-- 1 admin admin 401 Nov 16 16:21 segments_b
-rw-r–r-- 1 admin admin 0 Oct 16 16:05 write.lock
best_compression压缩算法索引 testbestcompression 0 号分片
total 1.9G
-rw-r–r-- 1 admin admin 287 Nov 16 17:01 _2b.fdm
-rw-r–r-- 1 admin admin 781M Nov 16 17:01 _2b.fdt
-rw-r–r-- 1 admin admin 17K Nov 16 17:01 _2b.fdx
-rw-r–r-- 1 admin admin 85M Nov 16 17:03 _2b.kdd
-rw-r–r-- 1 admin admin 148M Nov 16 17:03 _2b_Lucene80_0.dvd
…
-rw-r–r-- 1 admin admin 401 Nov 16 17:03 segments_a
-rw-r–r-- 1 admin admin 0 Oct 16 16:27 write.lock
zstd压缩等级为3 索引testzstd3 0 号分片
total 1.9G
-rw-r–r-- 1 admin admin 286 Nov 16 17:26 _8e.fdm
-rw-r–r-- 1 admin admin 758M Nov 16 17:26 _8e.fdt
-rw-r–r-- 1 admin admin 15K Nov 16 17:26 _8e.fdx
-rw-r–r-- 1 admin admin 84M Nov 16 17:29 _8e.kdd
-rw-r–r-- 1 admin admin 148M Nov 16 17:29 _8e_Lucene80_0.dvd
-rw-r–r-- 1 admin admin 3.5K Nov 16 17:29
…
-rw-r–r-- 1 admin admin 402 Nov 16 17:29 segments_9
-rw-r–r-- 1 admin admin 0 Nov 15 16:50 write.lock
zstd压缩等级为6 索引testzstd6 0 号分片
total 1.9G
-rw-r–r-- 1 admin admin 286 Nov 16 16:56 _29.fdm
-rw-r–r-- 1 admin admin 742M Nov 16 16:56 _29.fdt
-rw-r–r-- 1 admin admin 9.8K Nov 16 16:56 _29.fdx
-rw-r–r-- 1 admin admin 86M Nov 16 16:58 _29.kdd
-rw-r–r-- 1 admin admin 148M Nov 16 16:58 _29_Lucene80_0.dvd
…
-rw-r–r-- 1 admin admin 412 Nov 16 16:58 segments_a
-rw-r–r-- 1 admin admin 0 Oct 16 16:04 write.lock
zstd压缩等级为9 索引testzstd9 0 号分片
total 1.9G
-rw-r–r-- 1 admin admin 286 Nov 16 17:21 _gp.fdm
-rw-r–r-- 1 admin admin 738M Nov 16 17:21 _gp.fdt
-rw-r–r-- 1 admin admin 13K Nov 16 17:21 _gp.fdx
-rw-r–r-- 1 admin admin 85M Nov 16 17:23 _gp.kdd
-rw-r–r-- 1 admin admin 149M Nov 16 17:23 _gp_Lucene80_0.dvd
…
-rw-r–r-- 1 admin admin 402 Nov 16 17:23 segments_8
-rw-r–r-- 1 admin admin 0 Nov 15 16:50 write.lock
2.ES 侧实现
理论上来说 index.codec 支持的压缩算法最好下沉到 lucene 代码中,目前我们并没有维护 lucene 代码,因此我们直接 ES 侧面代码实现。zstd [1] 算法是基于 C++ 实现,而 ES 是基于 java 编写,因此借助开源的力量,引入 zstd-jni 来实现 zstd 压缩能力。
zstd_jni版本 1.5.5-1
api “com.github.luben:zstd-jni:${versions.zstd_jni}”
在 ES 代码中编写自定义的 index.codec; 扩展 CompressionMode 压缩模式,自定义实现 ZstdCompressor 压缩和 ZstdDecompressor 解压缩方法,可以在这设定 zstd 的压缩等级以及控制读写数据块大小;最后通过 java 的 spl 机制实现加载我们自定义的压缩算法实现类
在 server/src/main/resources/META-INF/services/org.apache.lucene.codecs.Codec 文件中定义如下。
org.elasticsearch.index.codec.custom.ZstdCodec
注意??:由于 ES 节点启动的时候,有 security 检查机制,因此我们需要在 server/src/main/resources/org/elasticsearch/bootstrap/security.policy 文件中添加代码权限授权策略
grant codeBase “${codebase.zstd-jni}” {
permission java.lang.RuntimePermission “loadLibrary. ";
permission java.lang.RuntimePermission "libzstd. ”;
};
相关推荐
- 快递查询教程,批量查询物流,一键管理快递
-
作为商家,每天需要查询许许多多的快递单号,面对不同的快递公司,有没有简单一点的物流查询方法呢?小编的回答当然是有的,下面随小编一起来试试这个新技巧。需要哪些工具?安装一个快递批量查询高手快递单号怎么快...
- 一键自动查询所有快递的物流信息 支持圆通、韵达等多家快递
-
对于各位商家来说拥有一个好的快递软件,能够有效的提高自己的工作效率,在管理快递单号的时候都需要对单号进行表格整理,那怎么样能够快速的查询所有单号信息,并自动生成表格呢?1、其实方法很简单,我们不需要一...
- 快递查询单号查询,怎么查物流到哪了
-
输入单号怎么查快递到哪里去了呢?今天小编给大家分享一个新的技巧,它支持多家快递,一次能查询多个单号物流,还可对查询到的物流进行分析、筛选以及导出,下面一起来试试。需要哪些工具?安装一个快递批量查询高手...
- 3分钟查询物流,教你一键批量查询全部物流信息
-
很多朋友在问,如何在短时间内把单号的物流信息查询出来,查询完成后筛选已签收件、筛选未签收件,今天小编就分享一款物流查询神器,感兴趣的朋友接着往下看。第一步,运行【快递批量查询高手】在主界面中点击【添...
- 快递单号查询,一次性查询全部物流信息
-
现在各种快递的查询方式,各有各的好,各有各的劣,总的来说,还是有比较方便的。今天小编就给大家分享一个新的技巧,支持多家快递,一次能查询多个单号的物流,还能对查询到的物流进行分析、筛选以及导出,下面一起...
- 快递查询工具,批量查询多个快递快递单号的物流状态、签收时间
-
最近有朋友在问,怎么快速查询单号的物流信息呢?除了官网,还有没有更简单的方法呢?小编的回答当然是有的,下面一起来看看。需要哪些工具?安装一个快递批量查询高手多个京东的快递单号怎么快速查询?进入快递批量...
- 快递查询软件,自动识别查询快递单号查询方法
-
当你拥有多个快递单号的时候,该如何快速查询物流信息?比如单号没有快递公司时,又该如何自动识别再去查询呢?不知道如何操作的宝贝们,下面随小编一起来试试。需要哪些工具?安装一个快递批量查询高手快递单号若干...
- 教你怎样查询快递查询单号并保存物流信息
-
商家发货,快递揽收后,一般会直接手动复制到官网上一个个查询物流,那么久而久之,就会觉得查询变得特别繁琐,今天小编给大家分享一个新的技巧,下面一起来试试。教程之前,我们来预览一下用快递批量查询高手...
- 简单几步骤查询所有快递物流信息
-
在高峰期订单量大的时候,可能需要一双手当十双手去查询快递物流,但是由于逐一去查询,效率极低,追踪困难。那么今天小编给大家分享一个新的技巧,一次能查询多个快递单号的物流,下面一起来学习一下,希望能给大家...
- 物流单号查询,如何查询快递信息,按最后更新时间搜索需要的单号
-
最近有很多朋友在问,如何通过快递单号查询物流信息,并按最后更新时间搜索出需要的单号呢?下面随小编一起来试试吧。需要哪些工具?安装一个快递批量查询高手快递单号若干怎么快速查询?运行【快递批量查询高手】...
- 连续保存新单号功能解析,导入单号查询并自动识别批量查快递信息
-
快递查询已经成为我们日常生活中不可或缺的一部分。然而,面对海量的快递单号,如何高效、准确地查询每一个快递的物流信息,成为了许多人头疼的问题。幸运的是,随着科技的进步,一款名为“快递批量查询高手”的软件...
- 快递查询教程,快递单号查询,筛选更新量为1的单号
-
最近有很多朋友在问,怎么快速查询快递单号的物流,并筛选出更新量为1的单号呢?今天小编给大家分享一个新方法,一起来试试吧。需要哪些工具?安装一个快递批量查询高手多个快递单号怎么快速查询?运行【快递批量查...
- 掌握批量查询快递动态的技巧,一键查找无信息记录的两种方法解析
-
在快节奏的商业环境中,高效的物流查询是确保业务顺畅运行的关键。作为快递查询达人,我深知时间的宝贵,因此,今天我将向大家介绍一款强大的工具——快递批量查询高手软件。这款软件能够帮助你批量查询快递动态,一...
- 从复杂到简单的单号查询,一键清除单号中的符号并批量查快递信息
-
在繁忙的商务与日常生活中,快递查询已成为不可或缺的一环。然而,面对海量的单号,逐一查询不仅耗时费力,还容易出错。现在,有了快递批量查询高手软件,一切变得简单明了。只需一键,即可搞定单号查询,一键处理单...
- 物流单号查询,在哪里查询快递
-
如果在快递单号多的情况,你还在一个个复制粘贴到官网上手动查询,是一件非常麻烦的事情。于是乎今天小编给大家分享一个新的技巧,下面一起来试试。需要哪些工具?安装一个快递批量查询高手快递单号怎么快速查询?...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- wireshark怎么抓包 (75)
- qt sleep (64)
- cs1.6指令代码大全 (55)
- factory-method (60)
- sqlite3_bind_blob (52)
- hibernate update (63)
- c++ base64 (70)
- nc 命令 (52)
- wm_close (51)
- epollin (51)
- sqlca.sqlcode (57)
- lua ipairs (60)
- tv_usec (64)
- 命令行进入文件夹 (53)
- postgresql array (57)
- statfs函数 (57)
- .project文件 (54)
- lua require (56)
- for_each (67)
- c#工厂模式 (57)
- wxsqlite3 (66)
- dmesg -c (58)
- fopen参数 (53)
- tar -zxvf -c (55)
- 速递查询 (52)