elasticsearch 的 segment 详解

本文由 简悦 SimpRead 转码, 原文地址 blog.csdn.net

es 的 segment 详解

1:segment 介绍

服务器总内存除过给 jvm 配置的其余都给了 lucene,占用 page cache 内存,page cache 保存对文件数据 segment 的缓存。 free -g 可查看内存使用,es 节点只有 es 服务,基本 cache 就是缓存的 segment segment : 每个 shard 分片是一个 lucene 实例,每个分片由多个 segment 组成!!每个 segment 占用内存,文件句柄等。 https://img-blog.csdnimg.cn/2020091010521423.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkzMDg2NQ==,size_16,color_FFFFFF,t_70#pic_center

1.1:flush 总结

1:es 的各个 shard 会每个 30 分钟进行一次 flush 操作。 2:当 translog 的数据达到某个上限的时候会进行一次 flush 操作。 3:flush 后清除 translog

1.2:segment 配置

写入时 segment 的大小和数量由 refresh_interval 决定

1
2
POST /index/_settings
{“refresh_interval”: “10s”}

2:segment 影响

2.1:segment 增多的影响

一个分片一个 lucene 实例(多个 segment)。lucene 内部的数据是由一个个 segment 组成的,es 写入经过了 refresh 间隔,将该时间段写入的全部数据 refresh 成一个 segment,segment 多了之后会进行 merge 成更大的 segment,默认最大 5G,所有会产生过多的 segment。

2.2:segment 占用查看

1
2
3
查看segment总的情况:get cat/segment 
查看节点的segment总占用内存情况(sm):GET _cat/nodes?v&h=ip,ram.percent,sm
某查看索引的segment:get index/segment:

1:对内存系统影响 每个 segment 的 catch 内存是随着 gc 不会释放掉的!!!!所以过大过多的 segnment 会导致系统运行没有内存,进而导致查询超时等等。

2:数据查询影响 lucene 查询时会遍历每个 segment 完成,所以过多的 segment 会导致查询速度下降,没有内存甚至导致超时

3:segment 优化

优化的目的是释放 catch 的内存! 1:删除不用的索引。 delete index 2: 关闭索引(文件仍然存在于磁盘,只是释放掉内存)。需要的时候可以重新打开。

1
2
post index/_close
post index/_open

3:force merge 强制合并 force merge 本质是对分片上的 segment 强制合并,节省大量的 memory. 该操作占用大量的 io,避免在热索引(正写入数据的索引)进行操作。

合并一般包括 api 合并和手动命令合并

1
手动:post index/_forcemerge?max_num_segments=1