二、数据写入过程
Lucene 把每次生成的倒排索引,叫做一个段(segment)。然后另外使用一个
commit 文件,记录索引内所有的 segment。而生成 segment 的数据来源,则是
内存中的 buffer。
1、数据写入 --> 进入 ES 内存 buffer (同时记录到 translog)--> 生成倒排索引分
片(segment)
2、将 buffer 中的 segment 先同步到文件系统缓存中,然后再刷写到磁盘
Elasticsearch 的 flush 操作主要通过以下几个参数控制:
默认设置为:每 30 分钟主动进行一次 flush,或者当 translog 文件大小大于
512MB 时主动触发 flush。
index.translog.flush_threshold_period 每 隔 多 长 时 间 执 行 一 次 flush ( 默 认
30m)
index.translog.flush_threshold_size 当事 务日志 大小 到达 此预设 值, 则执行
flush。(默认 512mb)
index.translog.flush_threshold_ops 当事务日志累积到多少条数据后 flush 一次。
三、segment merge 对写入性能的影响
ES 会不断在后台运行任务,主动将这些零散的 segment 做数据归并,尽量让索
引内只保有少量的,每个都比较大的,segment 文件。这个过程是有独立的线
程来进行的,并不影响新 segment 的产生。
当归并完成,较大的这个 segment 刷到磁盘后,commit 文件做出相应变更,
删除之前几个小 segment,改成新的大 segment。等检索请求都从小 segment
转到大 segment 上以后,删除没用的小 segment。这时候,索引里 segment 数
量就下降了
segment 归并的过程,需要先读取 segment,归并计算,再写一遍 segment,
最后还要保证刷到磁盘。可以说,这是一个非常消耗磁盘 IO 和 CPU 的任务。
所以,ES 提供了对归并线程的限速机制,确保这个任务不会过分影响到其他任
务。
用于控制归并线程的数目,推荐设置为 cpu 核心数的一半。 如果觉得自己磁盘
性能跟不上,可以降低配置,免得 IO 情况瓶颈。
评论0