elasticsearch中 refresh 和flush区别(转)

elasticsearch中有两个比较重要的操做:refresh 和 flush

refresh操做
当咱们向ES发送请求的时候,咱们发现es貌似能够在咱们发请求的同时进行搜索。而这个实时建索引并能够被搜索的过程其实是一次es 索引提交(commit)的过程,若是这个提交的过程直接将数据写入磁盘(fsync)必然会影响性能,因此es中设计了一种机制,即:先将index-buffer中文档(document)解析完成的segment写到filesystem cache之中,这样避免了比较损耗性能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能够进行近乎实时的搜索。
 
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。可能有点晕,我画了一个图帮你们理解这个过程:
总结一下translog的功能:
1.保证在filesystem cache中的数据不会由于elasticsearch重启或是发生意外故障的时候丢失。
2.当系统重启时会从translog中恢复以前记录的操做。
3.当对elasticsearch进行CRUD操做的时候,会先到translog之中进行查找,由于tranlog之中保存的是最新的数据。
4.translog的清除时间时进行flush操做以后(将数据从filesystem cache刷入disk之中)。
 
 
再总结一下flush操做的时间点:
1.es的各个shard会每一个30分钟进行一次flush操做。
2.当translog的数据达到某个上限的时候会进行一次flush操做。
 
 
有关于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。
相关文章
相关标签/搜索