本文由 简悦 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 占用内存,文件句柄等。
1.1:flush 总结
1:es 的各个 shard 会每个 30 分钟进行一次 flush 操作。 2:当 translog 的数据达到某个上限的时候会进行一次 flush 操作。 3:flush 后清除 translog
1.2:segment 配置
写入时 segment 的大小和数量由 refresh_interval 决定
|
|
2:segment 影响
2.1:segment 增多的影响
一个分片一个 lucene 实例(多个 segment)。lucene 内部的数据是由一个个 segment 组成的,es 写入经过了 refresh 间隔,将该时间段写入的全部数据 refresh 成一个 segment,segment 多了之后会进行 merge 成更大的 segment,默认最大 5G,所有会产生过多的 segment。
2.2:segment 占用查看
|
|
1:对内存系统影响 每个 segment 的 catch 内存是随着 gc 不会释放掉的!!!!所以过大过多的 segnment 会导致系统运行没有内存,进而导致查询超时等等。
2:数据查询影响 lucene 查询时会遍历每个 segment 完成,所以过多的 segment 会导致查询速度下降,没有内存甚至导致超时
3:segment 优化
优化的目的是释放 catch 的内存! 1:删除不用的索引。 delete index 2: 关闭索引(文件仍然存在于磁盘,只是释放掉内存)。需要的时候可以重新打开。
|
|
3:force merge 强制合并 force merge 本质是对分片上的 segment 强制合并,节省大量的 memory. 该操作占用大量的 io,避免在热索引(正写入数据的索引)进行操作。
合并一般包括 api 合并和手动命令合并
|
|