1. 前言
Elasticsearch中有两个比较重要的操作:refresh
和 flush
2. refresh
操作
当我们向ES发送请求的时候,我们发现es貌似可以在我们发请求的同时进行搜索。而这个实时建索引并可以被搜索的过程实际上是一次es 索引提交(commit
)的过程,如果这个提交的过程直接将数据写入磁盘(fsync
)必然会影响性能,所以es中设计了一种机制,即:先将index-buffer
中文档(document
)解析完成的segment
写到filesystem cache
之中,这样避免了比较损耗性能d的io
操作,又可以使document
可以被搜索。以上从index-buffer
中取数据到filesystem cache
中的过程叫做refresh
。
refresh
操作可以通过API设置:
POST /index/_settings
{“refresh_interval”: “10s”}
当我们进行大规模的创建索引操作的时候,最好将将refresh关闭。
POST /index/_settings
{“refresh_interval”: “-1″}
es默认的refresh
间隔时间是1s
,这也是为什么ES可以进行近乎实时的搜索。
3. flush
操作与translog
我们可能已经意识到如果数据在filesystem cache
之中是很有可能在意外的故障中丢失。这个时候就需要一种机制,可以将对es的操作记录下来,来确保当出现故障的时候,保留在filesystem
的数据不会丢失,并在重启的时候可以从这个记录中将数据恢复过来。elasticsearch提供了translog
来记录这些操作。
当向elasticsearch发送创建document
索引请求的时候,document
数据会先进入到index buffer
之后,与此同时会将操作记录在translog
之中,当发生refresh
时(数据从index buffer
中进入filesystem cache
的过程)translog
中的操作记录并不会被清除,而是当数据从filesystem cache
中被写入磁盘之后才会将translog
中清空。而从filesystem cache
写入磁盘的过程就是flush。可能有点晕,我画了一个图帮大家理解这个过程:
4. 总结
4.1 translog
的功能
- 保证在
filesystem cache
中的数据不会因为elasticsearch重启或是发生意外故障的时候丢失。 - 当系统重启时会从
translog
中恢复之前记录的操作。 - 当对elasticsearch进行
CRUD
操作的时候,会先到translog
之中进行查找,因为tranlog
之中保存的是最新的数据。 translog
的清除时间是进行flush
操作之后(将数据从filesystem cache
刷入disk
之中)。
4.2 flush
操作的时间点
- es的各个
shard
会每个30分钟
进行一次flush
操作。 - 当
translog
的数据达到某个上限的时候会进行一次flush
操作。
4.3 关于translog和flush的一些配置项
index.translog.flush_threshold_ops
:当发生多少次操作时进行一次flush。默认是 unlimited。index.translog.flush_threshold_size
:当translog的大小达到此值时会进行一次flush操作。默认是512mb。index.translog.flush_threshold_period
:在指定的时间间隔内如果没有进行flush操作,会进行一次强制flush操作。默认是30m。index.translog.interval
:多少时间间隔内会检查一次translog,来进行一次flush操作。es会随机的在这个值到这个值的2倍大小之间进行一次操作,默认是5s。