elasticsearch的段合并机制

es创建一个document的时候会向translog和in memory buffer中写入,为了近实时性,会将buffer中的数据写入到segment,进入了segment的数据才能被搜索到。

  1. es默认每秒钟refresh创建一个segment
    elasticsearch的段合并机制_第1张图片
  2. 后台将这些小的segment合并成大的segment。每次的文档删除操作,会仅仅标记 Segment 中该文档 为删除状态, 而不会真正的立马物理删除,在段合并的时候不会把已删除的文档拷贝到新的segment中。

elasticsearch的段合并机制_第2张图片
(上图中两个已经通过flush提交到磁盘的segment和一个未提交的segment一起合并到一个大的segment)

  1. 新的segment被flush到磁盘,写入一个包含新段且排除旧的和较小的段的新提交点。然后删除老的段

elasticsearch的段合并机制_第3张图片
Elasticsearch 在默认情况下会对合并流程进行资源限制,为了给搜索功能留足够的资源。默认的限速配置为20mb,如果磁盘转速高可以适当调大

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

optimize API是一个合并的api,它会将一个分片强制合并到 max_num_segments 参数指定 大小的段数目

POST /logstash-2014-10/_optimize?max_num_segments=1
#java中
forceMergeRequest.maxNumSegments(1)

segment归并策略policy:
可以在setting中配置

#默认2MB,小于这个大小的 segment,优先被归并
"index.merge.policy.floor_segment": "10mb"
#归并的线程数
"index.merge.scheduler.max_thread_count": "1"
#默认一次最多归并 10 个segment
"index.merge.policy.max_merge_at_once": "10"
#默认optimize 时一次最多归并30个segment。
"index.merge.policy.max_merge_at_once_explicit": "10"
#默认5GB,大于这个大小的segment,不参与归并。optimize除外
"index.merge.policy.max_merged_segment": "5gb"

官方文档:https://www.elastic.co/guide/cn/elasticsearch/guide/current/merge-process.html

你可能感兴趣的:(搜索引擎,#,elasticsearch,elasticsearch,搜索引擎)