Elasticsearch中 refresh 和flush区别

1. 前言

Elasticsearch中有两个比较重要的操作:refreshflush

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的功能
  1. 保证在filesystem cache中的数据不会因为elasticsearch重启或是发生意外故障的时候丢失。
  2. 当系统重启时会从translog中恢复之前记录的操作。
  3. 当对elasticsearch进行CRUD操作的时候,会先到translog之中进行查找,因为tranlog之中保存的是最新的数据。
  4. translog的清除时间是进行flush操作之后(将数据从filesystem cache刷入disk之中)。
4.2 flush操作的时间点
  1. es的各个shard会每个30分钟进行一次flush操作。
  2. translog的数据达到某个上限的时候会进行一次flush操作。
4.3 关于translog和flush的一些配置项
  1. index.translog.flush_threshold_ops:当发生多少次操作时进行一次flush。默认是 unlimited。
  2. index.translog.flush_threshold_size:当translog的大小达到此值时会进行一次flush操作。默认是512mb。
  3. index.translog.flush_threshold_period:在指定的时间间隔内如果没有进行flush操作,会进行一次强制flush操作。默认是30m。
  4. index.translog.interval:多少时间间隔内会检查一次translog,来进行一次flush操作。es会随机的在这个值到这个值的2倍大小之间进行一次操作,默认是5s。
Elasticsearch ,`flush` 线程池和 `refresh` 线程池是两个不同的线程池,用于执行不同的操作。 1. **Flush 线程池**:Flush 操作是将内存的数据刷新到磁盘上的持久化存储,以确保数据的持久性和一致性。当执行索引、更新或删除操作时,数据首先被写入内存的缓冲区(称为 translog),然后通过 Flush 操作将缓冲区的数据刷新到磁盘上的索引文件。Flush 操作可以通过 `flush` API 或者自动触发来执行。 Flush 线程池负责执行 Flush 操作,它控制着 Flush 操作的并发度和资源使用。线程池的线程会按照优先级处理 Flush 请求,确保数据及时地写入磁盘,以避免数据丢失。 2. **Refresh 线程池**:Refresh 操作是使最新的写入操作对搜索可见。Elasticsearch 使用一种叫做 "近实时(Near Real-Time)" 的模型,即在文档被索引后,它并不立即对搜索可见,而是在 Refresh 操作后才能被搜索到。Refresh 操作可以通过 `refresh` API 或者自动触发来执行。 Refresh 线程池负责执行 Refresh 操作,它控制着 Refresh 操作的并发度和资源使用。线程池的线程会按照优先级处理 Refresh 请求,确保最新的写入操作能够及时对搜索可见。 总结来说,Flush 线程池负责将内存的数据刷新到磁盘,以确保数据的持久性;而 Refresh 线程池负责使最新的写入操作对搜索可见。 在默认情况下,FlushRefresh 操作都是自动执行的,并且它们在 Elasticsearch 的内部进行管理。但是,您也可以手动触发 FlushRefresh 操作,以满足特定的需求。 请注意,线程池的大小和配置对系统性能有一定影响。根据集群的负载情况和性能需求,您可能需要调整线程池的配置参数来优化系统的性能和资源利用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值