1. forcemerge接口
强制段合并,设置为1时,是期望最终只有1个索引段。但实际情况是,合并的结果是段的总数会减少,但仍大于1,可以多次执行强制合并的命令。
设置的的目标值越小。合并消耗的时间会越久。
curl -XPOST http://127.0.0.1:9200/logstash-2015-06.10/_forcemerge?max_num_segments=1
段合并会消耗较多的磁盘IO资源,不要在大量建立索引时,查询较多时,执行该操作。
2.段合并参数设置
- index.merge.policy.floor_segment 默认 2MB,小于这个大小的 segment,优先被归并。
- index.merge.policy.max_merge_at_once 默认一次最多归并 10 个 segment
- index.merge.policy.max_merge_at_once_explicit 默认 forcemerge 时一次最多归并 30 个 segment。
- index.merge.policy.max_merged_segment 默认 5 GB,大于这个大小的 segment,不用参与归并。forcemerge 除外。
根据这段策略,其实我们也可以从另一个角度考虑如何减少 segment 归并的消耗以及提高响应的办法:加大 flush 间隔,尽量让每次新生成的 segment 本身大小就比较大。
fresh和flush的概念。fresh默认为1s,意味着近乎实时查询,索引建立好后1s后就可以进行查询。这时是将索引放到了文件系统的缓存中,虽然可以查询,但是并没有真正写入到磁盘中,存在数据丢失的风险。所以es引入了translog,内存中的数据在写入文件系统的缓存中时,同时在translog中记录一份,一旦es重启,未写入磁盘中的数据还可以从translog中进行恢复。
flush会触发lucene commit,并清空translog文件,这个过程称为flush。
默认情况下ES每隔5s会去检测要不要flush translog,默认条件是:每 30 分钟主动进行一次 flush,或者当 translog 文件大小大于 200MB主动进行一次 flush。