【ELK】节省存储 之 压缩存储方式调整

news2025/3/19 6:01:57

目录

集群版本: 7.17.6

解释几个概念:

段(Segment)

合并(Merge)

索引设置:

压缩方式(index.codec):

测试设置前提条件

对比 在创建的时候指定压缩类型(index.codec)

对比 在写入完成后的索引更改压缩类型

线上索引更改压缩方式前后对比

测试总结

API调用

查看状态

查看索引配置

创建索引配置

更新索引配置

强制合并索引

为什么默认启用 LZ4 压缩,而不是best_compression

通过共享存储的方式节省存储的成本


集群版本: 7.17.6

解释几个概念:

段(Segment)

可以理解为 是ES 索引存储数据的最小单位,索引 --> 分片--> 段,Elasticsearch 中的分片是 Lucene 索引,而 Lucene 索引又被分解为多个段。段是索引中的内部存储元素,用于存储索引数据,

合并(Merge)

主要指段合并,段是不可变的。较小的段会定期合并到较大的段中,以控制索引大小并清除删除的内容。段合并的触发一般会:

  1. 在索引的数据调整(写入/删除)操作
  2. 在后台定期触发,为了减少开销,不需要用户干预,比如说ILM 、refresh_interval
  3. 用户触发调整:强制合并(常用)、减少索引分片 和 分割索引分片
强制合并的几点建议:
    不要并行过多请值合并,Merge是一项资源密集型操作。
    不要合并出超过5G的段,影响性能
    不要在hot节点上执行,影响写入速度,在cold节点 或者只读索引
索引设置:

配置分为为静态(static)和 动态(dynamic

  • static:只能在索引创建时 或 在关闭的索引上设置。
  • dynamic:可以使用API 实时进行更改 。
7.17 版本中:关闭的索引更改其静态或者动态配置时可能会导致索引错误,只能不删除并重新创建索引。
8.17 版本中:索引reopen 设置 true(默认为 false)可以修改静态配置。
index.number_of_shards 此设置只能在创建索引时设置。无法在已关闭的索引上更改。8.17 版本 也是一样
压缩方式(index.codec)
The default value compresses stored data with LZ4 compression, but this can be set to best_compression which uses DEFLATE for a higher compression ratio, at the expense of slower stored fields performance. If you are updating the compression type, the new one will be applied after segments are merged. Segment merging can be forced using force merge.
  • 存储数据压缩方式 ,属于静态(static)配置
  • 存储数据默认是 LZ4压缩,best_compression 压缩率比LZ4 要好(8.17 版本中最多可降低约 28% 的存储使用量),
  • 代价是读写性能会降低,优先 选择cold 状态的 只读索引测试
  • 在新建索引和段合并过程中更改压缩类型

测试设置前提条件

  • es-lucene本身的压缩率受index字段的影响,暂不讨论,只讨论best_compressiondefault两种方式的压缩后存储存在多大的差别。
  • 计算存储:是计算的store.size大小, 包含副本索引,测试中所有的副本(number_of_replicas)都设置为1。
  • max_num_segments=1 不是整个索引的segments.count等于1 ,而是每个分片的segments.count等于1。所以测试中索引_forcemerge后 segments.count等于4 是正常的。
  • 在已有索引情况下更改压缩类型,如果索引比较大,就不适合使用max_num_segments=1强制合并成一个大的段,这样就有可能涉及到某些比较大的段不再触发段合并。所以可能存在一个索引存在两种压缩方式

对比 在创建的时候指定压缩类型(index.codec)

best_compressiondefault
不存在指定lz4的选项 "unknown value for [index.codec] must be one of [default, best_compression] but was: lz4"
#创建my-index-00【1-4】四个索引,分别10000条写入相同的数据。
my-index-001,my-index-004    best_compression
my-index-002,my-index-003    default

#写入前GET /_cat/indices/my-index-*?v&h=index,pri,rep,docs.count,store.size,pri.store.size,segments.count&bytes=b
index        pri rep docs.count store.size pri.store.size segments.count
my-index-001   2   1          0       904b           452b              0
my-index-002   2   1          0       904b           452b              0
my-index-003   2   1          0       904b           452b              0
my-index-004   2   1          0       904b           452b              0

写入后  best_compression方式存储使用为default方式的 91% 左右。
index        pri rep docs.count store.size pri.store.size segments.count
my-index-001   2   1     100000    6328997        3118873             24
my-index-002   2   1     100000    6954883        3464912             28
my-index-003   2   1     100000    6934591        3433258             28
my-index-004   2   1     100000    6328400        3112546             26

#进行强制合并 max_num_segments=1 后, best_compression方式存储使用为default方式的 88% 左右。
index        pri rep docs.count store.size pri.store.size segments.count
my-index-001   2   1     100000    6058071        3015574              4
my-index-002   2   1     100000    6817828        3408515              4
my-index-003   2   1     100000    6810228        3402639              4
my-index-004   2   1     100000    6036888        3004366              4

结论:在创建索引的时候就指定best_compression 压缩方式 只占用default方式的 91% 左右的存储空间,通过段合并存储空节省能提升到12% 左右

对比 在写入完成后的索引更改压缩类型

问题:
an't update non dynamic settings [[index.codec]] for open indices [[my-index-002/WYo5u-cITcuOWQH3P3RQ6A]]
需要对先进行关闭处理,配置完成后打开,8.17的reopen策略可以自动帮助用户关闭切重新打开,7.17没有此功能。
#创建my-index-00【5-6】四个索引,分别10000条写入相同的数据。ps:my-index-*6个索引的数据都是重复且相同
my-index-002,my-index-003    index.codec:default

写入后存储情况
index        pri rep docs.count store.size pri.store.size segments.count
my-index-001   2   1     100000    6058071        3015574              4
my-index-002   2   1     100000    6817828        3408515              4
my-index-003   2   1     100000    6810228        3402639              4
my-index-004   2   1     100000    6036888        3004366              4
my-index-005   2   1     100000    6823873        3430651             14
my-index-006   2   1     100000    6836865        3434722             16

关闭索引
POST /my-index-005,my-index-006/_close?wait_for_active_shards=0
#更改压缩类型
PUT /my-index-005,my-index-006/_settings
{
    "index.codec" : "best_compression"
}
#重新打开
POST /my-index-005,my-index-006/_open

#进行强制合并 max_num_segments=1 后, 与创建是的压缩方式就指定为best_compression 空间存储使用基本保持一致。
index        pri rep docs.count store.size pri.store.size segments.count
my-index-001   2   1     100000    6058071        3015574              4
my-index-002   2   1     100000    6817828        3408515              4
my-index-003   2   1     100000    6810228        3402639              4
my-index-004   2   1     100000    6036888        3004366              4
my-index-005   2   1     100000    6012083        3007382              4
my-index-006   2   1     100000    6001636        3001571              4

结论:在写入完成后的索引更改压缩方式与创建是的压缩方式就指定为best_compression 空间存储使用基本保持一致,基本都节省 10% 左右的存储空间

线上索引更改压缩方式前后对比
更改前index.codec:default
index              pri rep docs.count  store.size pri.store.size segments.count
applog-2025.02.15   1   1   10514847  6809313634     3404656817             58
applog-2025.02.16   1   1    9974249  6491719356     3245859678             46
applog-2025.02.23   1   1   11139687  7139016590     3569508295             56
applog-2025.02.22   1   1   10958802  7089500416     3544750208             52

#下面两个所以通过重启的方式更改压缩方式
applog-2025.02.16,applog-2025.02.23    index.codec:best_compression

#进行强制合并 max_num_segments=1 后
index              pri rep docs.count  store.size pri.store.size segments.count
applog-2025.02.15   1   1   10514847  6776067954     3388033977              4
applog-2025.02.16   1   1    9974249  4963880914     2481940457              4
applog-2025.02.23   1   1   11139687  5358329648     2679164824              4
applog-2025.02.22   1   1   10958802  7056313752     3528156876              4

结论:更改best_compression压缩方式与强制合并后,applog-2025.02.16,applog-2025.02.23两个索引 存储空间节省可以达到24%~25%。

测试总结

  • 关于读性能: 多次查询测试,性能基本不受best_compression压缩方式的影响。
  • 关于写性能: 集群写入压力较小,没有明显差别。生产环境建议还是需要使用只读索引。
  • 关于降存储使用量:可降低约 25%~10% 的存储使用量。
  • 关于操作:将index.codec 配置到template模版中是比较方便的,修改已完成写入操作的索引需要额外的管理操作,7.17版本涉及到手动重启

API调用

查看状态
GET /_cat/indices/my-index?v   #查看索引信息
GET /_cat/shards/my-index?v    #查看分片信息
GET /_cat/segments/my-index?v   #查看段信息
GET /_cat/indices/my-index-*?v&h=index,pri,rep,docs.count,store.size,pri.store.size,segments.count  #查看索引/段/分片信息
查看索引配置
#https://www.elastic.co/guide/en/elasticsearch/reference/7.17/indices-get-settings.html

GET my-index-*/_settings?pretty&include_defaults&flat_settings=true
       ...
      "index.codec" : "default",
       ...
创建索引配置
PUT /my-index-000001
{
  "settings": {
    "index": {
      "number_of_shards": 2,  
      "number_of_replicas": 1,
      "codec": "best_compression",  
      "refresh_interval" : "2s"
    }
  }
}

#删除索引
DELETE  my-index-000001
更新索引配置
#https://www.elastic.co/guide/en/elasticsearch/reference/7.17/indices-update-settings.html

#更新动态配置不需要关闭索引

#更新静态配置的前提条件 该索引必须是只读的
POST /my-index-000001/_close?wait_for_active_shards=0

PUT /my-index-000001/_settings
{
    "index.codec" : "best_compression"
}

POST /my-index-000001/_open
强制合并索引
#https://www.elastic.co/guide/en/elasticsearch/reference/7.17/indices-forcemerge.html

POST /my-index-000001/_forcemerge?max_num_segments=1

为什么默认启用 LZ4 压缩,而不是best_compression

在许多情况下,人们会很乐意放弃压缩所需的额外 CPU 来换取磁盘空间 Part 2.0: The true story behind Elasticsearch storage requirements

通过共享存储的方式节省存储的成本

金山云:基于 JuiceFS 的 Elasticsearch 温冷热数据管理实践

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

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

相关文章

博客图床 VsCode + PigGo + 阿里云OSS

关键字 写博客,图床,VsCode,PigGo,阿里云OSS 背景环境 我想把我在本地写的markdown文档直接搬到CSDN上和博客园上,但是图片上传遇到了问题。我需要手动到不同平台上传文件,非常耗费时间和经历。 为了解决…

C++之list类及模拟实现

目录 list的介绍 list的模拟实现 定义节点 有关遍历的重载运算符 list的操作实现 (1)构造函数 (2)拷贝构造函数 (3)赋值运算符重载函数 (4)析构函数和clear成员函数 (5)尾…

SwinTransformer 改进:添加DoubleAttention模块提升上下文语义提取能力

目录 1. DoubleAttention模块 2. SwinTransformer + DoubleAttention 3. 完整代码 Tips:融入模块后的网络经过测试,可以直接使用,设置好输入和输出的图片维度即可 1. DoubleAttention模块 DoubleAttention 是一种用于计算机视觉任务的注意力机制,旨在通过双重注意力机制…

MacBook部署达梦V8手记

背景 使用Java SpringBootDM开发Web应用,框架有License,OSX加载dll失败,安装了Windows 11,只有一个C盘,达梦安装后因为C盘权限问题,创建数据库失败,遂采用Docker容器方式部署。 下载介质 官网在…

外贸 B2B 平台没落?多语言批发系统正在崛起

近年来,全球外贸行业正在发生快速变化,传统的 B2B 平台正面临越来越多的挑战,尤其是在面对新兴的多语言批发系统时。这种变化不仅影响了供应商和买家之间的交易方式,也正在推动外贸行业的数字化升级和转型。今天,让我们…

[spring] Spring JPA - Hibernate 多表联查 1

[spring] Spring JPA - Hibernate 多表联查 之前在 [spring] spring jpa - hibernate 名词解释&配置 和 [spring] spring jpa - hibernate CRUD 简单的学习了一下怎么使用 Hibernate 实现 CRUD 操作,不过涉及到的部分都是逻辑上比较简单的实现——只在一张表上…

鸿蒙Next开发实战教程—电影app

最近忙忙活活写了不少教程,但是总感觉千篇一律,没什么意思,大家如果有感兴趣的项目可以私信给幽蓝君写一写。 今天分享一个电影App。 这个项目也比较简单,主要是一些简单页面的开发和本地视频的播放以及横竖屏切换。 页面搭建以…

停车场停车位数据集,标注停车位上是否有车,平均正确识别率99.5%,支持yolov5-11, coco json,darknet,xml格式标注

停车场停车位数据集,标注停车位上是否有车,平均正确识别率98.0%,支持yolov5-11, coco json,darknet,xml格式标注 数据集-识别停车场所有车辆的数据集 数据集分割 一共184张图片 训练组 89&am…

ssm框架之mybatis框架讲解

1,Mybatis 1.1 Mybatis概述 1.1.1 Mybatis概念 MyBatis 是一款优秀的持久层框架,用于简化 JDBC 开发 MyBatis 本是 Apache 的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2…

CEF 多进程模式时,注入函数,获得交互信息

CEF 控制台添加一函数,枚举 注册的供前端使用的CPP交互函数有哪些-CSDN博客 上篇文章,是在模拟环境,单进程中设置的,这篇文章,将其改到正常多进程环境中设置。 对应于工程中的 CEF_RENDER项目 一、多进程模式中,改写 修改步骤 1、注入函数 client_app_render.cpp 在…

Androidstudio出现警告warning:意外的元素

这些警告信息通常与 Android SDK 或系统镜像的配置文件有关,可能是由于 SDK 工具或系统镜像的版本不兼容或配置文件格式发生了变化。以下是解决这些警告的步骤: 1. 更新 Android SDK 工具 确保你使用的是最新版本的 Android SDK 工具: 打开…

深入了解Linux —— git三板斧

版本控制器git 为了我们方便管理不同版本的文件,就有了版本控制器; 所谓的版本控制器,就是能够了解到一个文件的历史记录(修改记录);简单来说就是记录每一次的改动和版本迭代的一个管理系统,同…

【软件系统架构】单体架构

一、引言 在软件开发的漫长历程中,架构的选择一直是至关重要的决策。单体架构作为一种经典的架构模式,曾经在许多项目中发挥着不可替代的作用。虽然如今微服务等架构逐渐流行,但理解单体架构对于深入掌握软件架构体系仍然有着重要意义。 二、…

【求助】【建议放弃】【谷粒商城版】Kubernetes

本文作者: slience_me 文章目录 Kubernetes【谷粒商城版】【建议放弃】1. docker安装2. kubernetes安装前3. kubeadm,kubelet,kubectl3.1 简介kubeadmkubeletkubectl常用指令 3.2 安装3.3 kubeadm初始化3.4 加入从节点(工作节点)3.5 安装Pod网络插件(CNI…

C# Unity 唐老狮 No.10 模拟面试题

本文章不作任何商业用途 仅作学习与交流 安利唐老狮与其他老师合作的网站,内有大量免费资源和优质付费资源,我入门就是看唐老师的课程 打好坚实的基础非常非常重要: Unity课程 - 游习堂 - 唐老狮创立的游戏开发在线学习平台 - Powered By EduSoho C# 1. 内存中,堆和…

第十五届蓝桥杯2024JavaB组省赛试题A:报数游戏

简单的找规律题目。题目给得数列,第奇数项是20的倍数,第偶数项时24的倍数。题目要求第n 202420242024 项是多少。这一项是偶数,所以答案一定是24的倍数,并且偶数项的个数和奇数项的个数各占一半,所以最终的答案ans( n…

Matlab 汽车二自由度转弯模型

1、内容简介 Matlab 187-汽车二自由度转弯模型 可以交流、咨询、答疑 2、内容说明 略 摘 要 本文前一部分提出了侧偏角和横摆角速度作为参数。描述了车辆运动的运动状态,其中文中使用的参考模型是二自由度汽车模型。汽车速度被认为是建立基于H.B.Pacejka的轮胎模…

学c++的人可以几天速通python?

学了俩天啊,文章写纸上了 还是蛮有趣的

Rocky Linux 9.x 基于 kubeadm部署k8s 1.32

一、部署说明 1、主机操作系统说明 序号操作系统及版本备注1Rocky Linux release 9下载链接:https://mirrors.163.com/rocky/9.5/isos/x86_64/Rocky-9.5-x86_64-minimal.iso 2、主机硬件配置说明 作用IP地址操作系统配置关键组件k8s-master01192.168.234.51Rocky…

解决git init 命令不显示.git

首先在自己的项目代码右击 打开git bash here 输入git init 之后自己的项目没有.git文件,有可能是因为.git文件隐藏了,下面是解决办法