参考:https://www.phpmianshi.com/?id=242

背景

最近发现es占用的磁盘存储大小一直在增加,本来1mb的东西,隔了1-2天达到100mb多,如下

分析

elasticsearch是建立在Apache Lucene 基础上的实时分布式搜索引擎,Lucene为了提高搜索的实时性,采用不可再修改(immutable)方式将文档存储在一个个segment中。也就是说,一个segment在写入到存储系统之后,将不可以再修改。那么Lucene是如何从一个segment中删除一个被索引的文档呢?简单的讲,当用户发出命令删除一个被索引的文档#ABC时,该文档并不会被马上从相应的存储它的segment中删除掉,而是通过一个特殊的文件来标记该文档已被删除。当用户再次搜索到#ABC时,Elasticsearch在segment中仍能找到#ABC,但由于#ABC文档已经被标记为删除,所以Lucene会从发回给用户的搜索结果中剔除#ABC,所以给用户感觉的是#ABC已经被删除了。

我们已经知道在elasticsearch中每个shard每隔1秒都会refresh一次,每次refresh都会生成一个新的segment,按照这个速度过不了多久segment的数量就会爆炸,所以存在太多的segment是一个大问题,因为每一个segment都会占用文件句柄,内存资源,cpu资源,更加重要的是每一个搜索请求都必须访问每一个segment,这就意味着存在的segment越多,搜索请求就会变的更慢。

那么elaticsearch是如何解决这个问题呢?

根据ES的写入原理分析,默认每秒从memory buffer里面搬运数据到filesystem  cache,生产一个segments段,由后台程序定期分梯队进行合并,后台线程根据Lucene的合并规则定期进行segment merging合并操作,一般不需要用户担心或者采取任何行动。被删除的文档在segment合并时,才会被真正删除掉。在此之前,它仍然会占用着JVM heap和操作系统的文件cache等资源。在某些情况下,我们需要强制Elasticsearch进行segment merging,已释放其占用的大量系统资源。如果不加控制,合并一个大的segment会消耗比较多的io和cpu资源,同时也会搜索性能造成影响,所以默认情况下es已经对合并线程做了资源限额以便于它不会搜索性能造成太大影响。

限制如下:(不限制可以设置为 none)

PUT /_cluster/settings
{
   "persistent" : {
       "indices.store.throttle.max_bytes_per_sec" : "100mb"
   }
}

结合具体的业务,我们每次全量同步就会产生大量的segments,并标识为deleted,所以磁盘占用越来越大。因为ES还有定期合并功能,所以过一段时间还会再减少下来。

查看索引segments状态

GET _cat/segments/live_v4?v

合并参数详解

参数名称

说明

max_num_segments

设置需要合并的段数。如果需要整个索引完全合并,则将该值设置为1。默认情况下会检查合并操作是否需要执行,如果需要才执行,否则就不执行。

only_expunge_deletes

合并过程是否仅操作哪些包含了被删除文档的段,将这些段中未标识为删除的内容放到一个新创建的段中,然后将这些包含了被删除文档的段全部删除。

注:这不会覆盖index.merge.policy.expunge_deletes_allowed阈值。

flush

是否应在强制合并后执行刷新,默认为true。

POST /live_v4/_forcemerge?max_num_segments=1&only_expunge_deletes=true

_forcemerge 命令可强制进行segment合并,将要合并的segment读取出来,再写入到新的segment,然后删除所有标记为删除的文档。Segment merging要消耗CPU,以及大量的I/O资源,所以一定要在你的ElasticSearch集群处于维护窗口期间,并且有足够的I/O空间的(如:SSD)的条件下进行;否则很可能造成集群崩溃和数据丢失。

为了保证合并顺利进行,在此期间暂停了所有对其进行的写操作,仅有少量的读操作。加大磁盘,或者限制索引合并的线程数量,减小每次合并的segment数量。

这里需要注意: expunge操作是一种不得已而为之的操作,即在Elasticsearch不能有效自动清除删除文件的情况下才执行该操作。同时建议在此操作期间,最好停止对集群的所有读/写操作,并暂停止shard的自动分配 (cluster.routing.allocation.enable= none),以防有节点被踢出后shard自动分配造成的数据丢失。

下面两个设置可以用于控制清除时的处理速度,其中给出值是默认值,可以根据需求进行调整,具体请参见Merge。此外, 还可以临时将所有索引的replica设置为0,这样只用针对Primary进行expunge,以减小I/O压力。

PUT /{index}/_settings
{
    "settings": {
        "index.merge.policy.expunge_deletes_allowed": "10",
        "index.merge.policy.max_merge_at_once_explicit" : "30"
    }
}

通过/_cat/indices/ api查看所有index的段情况和当前正在进行merge的文档数。

GET /_cat/indices/?s=segmentsCount:desc&v&h=index,segmentsCount,segmentsMemory,memoryTotal,mergesCurrent,mergesCurrentDocs,storeSize,p,r

查看各个节点forceMerge的线程数

GET _cat/thread_pool/force_merge?v&s=name

查看forceMerge任务详情

GET _tasks?detailed=true&actions=*forcemerge

查看某个index的forceMerge情况

GET /_cat/segments/test-000032?v&s=prirep,shard

参考

https://www.elastic.co/guide/en/elasticsearch/reference/7.x/indices-forcemerge.html

elasticsearch中forcemerge清除文件占用的磁盘空间相关推荐

  1. 查看 SQL Server 2000 中数据表所占用的磁盘空间

    数据库收缩----------+ ALTER DATABASE  数据库名称 Set  RECOVERY SIMPLE Go DBCC SHRINKDATABASE  数据库名称) Go ALTER ...

  2. 删除文件后,磁盘空间没有释放的处理记录

    问题说明:IDC里的一台服务器的/分区使用率爆满了!已达到100%!经查看发现有个文件过大(80G),于是在跟有关同事确认后rm -f果断删除该文件.但是发现删除该文件后,/分区的磁盘空间压根没有释放 ...

  3. linux中如何解决文件已删除但空间不释放的案例

    一般来说不会出现删除文件后空间不释放的情况,但是也存在例外,比如文件被进程锁定,或者有进程一直在向这个文件写数据等,要理解这个问题,就需要知道 下文件的存储机制和存储结构. 1.错误现象 运维的监控系 ...

  4. linux中的tar打包、压缩多个文件、磁盘查看和分区类、du查看文件和目录占用的磁盘空间

    文章目录 1.8.3 tar 打包 1.8.3.1压缩多个文件 1.8.3.2压缩目录 1.8.3.3解压到当前目录 1.8.3.4解压到指定目录 1.9 磁盘查看和分区类 1.9.1 du查看文件和 ...

  5. lsof查看进程占用文件_Linux 利用lsof命令查找已经删除的文件来释放磁盘空间

    测试环境一台服务器/ 根目录空间使用率达到94%,但是通过du -sh * 发现实际空间没没用用到那么多,初步怀疑,之前删除的文件,有运行中的进程一直占用,导致空间没有释放,如图通过du -sh * ...

  6. 【已解决】docker overlay2占用大量磁盘空间处理方法

    在使用docker容器的时候遇到了容量上的问题,做一个记录 处理方式1: 在使用docker时,往往会出现磁盘空间不足,导致该问题的通常原因是因为docker中部署的系统输出了大量的日志内容. 此时, ...

  7. docker overlay2占用大量磁盘空间处理方法

    在使用docker时,往往会出现磁盘空间不足,导致该问题的通常原因是因为docker中部署的系统输出了大量的日志内容. 此时,可通过手动或定时任务进行清除. 针对/var/lib/docker/ove ...

  8. [转帖]Docker 清理占用的磁盘空间

    Docker(二十七)-Docker 清理占用的磁盘空间 https://www.cnblogs.com/zhuochong/p/10076599.html docker system docker ...

  9. 如何清理Docker占用的磁盘空间?

    摘要:用了Docker,好处挺多的,但是有一个不大不小的问题,它会一不小心占用太多磁盘,这就意味着我们必须及时清理. 作为一个有信仰的技术公司,我们Fundebug的后台采用了酷炫的全Docker化架 ...

  10. 释放sqlite文件占用的多余空间

    当删除sqlite文件里的数据之后,会发现sqlite文件占的磁盘空间并不会缩小,那是因为: 当你从Sqlite删除数据后,未使用的磁盘空间被添加到一个内在的"空闲列表"中用于存储 ...

最新文章

  1. 贝叶斯网络之父:当前的机器学习其实处于因果关系之梯的最低层级
  2. 计算机应用基础知识点.pdf,《计算机应用基础》复习知识点.pdf
  3. 阿里云mysql写入性能_插入mysql类型
  4. pthread_once()函数详解
  5. 在asp.net core 下定义统一的入参和出参格式
  6. 【剑指offer】面试题47:礼物的最大价值(Java)
  7. mac 更换brew镜像源
  8. ACWING830 单调栈
  9. hive 复合结构Map、Struct详解
  10. 安川机器人dx200编程手册_【安川 】一文带了解DX200如何编程(上)
  11. Notepad++的列编辑模式_小技巧
  12. 软件工程项目实训02
  13. python math库函数
  14. Python分支+简单循环
  15. 九爷带你玩转 php单元测试
  16. 春节了,上张祝福图片,顺祝大家新年好运,工作顺利!
  17. mac mysql 未能载入偏好设置面板“MySQL”
  18. Warframe Rank考核
  19. SQL学习之使用order by 按照指定顺序排序或自定义顺序排序
  20. stm32 ST-Link V2下载出现 No target connected问题

热门文章

  1. RTS Threshold
  2. php 浏览器 保存网页图片,PHP实现浏览器文件下载图片或者php文件
  3. vh和vw是什么单位?
  4. 物联网技术,主要应用在哪些领域?
  5. Ubuntu 16.04 状态栏实时显示网速、CPU、内存等
  6. python语言百分号的含义_python中百分号意思的是什么
  7. LIMEWIRE公司COO(首席运营官)Greg Bildson访谈
  8. 雷达原理(一):雷达波形
  9. 有点意思!“古董级” 诺基亚功能机跑 Linux
  10. mysql 查询重复数据并删除