Elasticsearch面试系列-03

1. Elasticsearch 中 refresh 和 flush 有什么区别?

整体流程:

1、数据写入buffer缓冲和translog日志文件中。当写一条数据document的时候,一方面写入到mem buffer缓冲中,一方面同时写入到translog日志文件中。

2、buffer满了或者每隔1秒(可配),refresh将mem buffer中的数据生成index segment文件并写入os cache,此时index segment可被打开以供search查询读取,这样文档就可以被搜索到了(注意,此时文档还没有写到磁盘上);然后清空mem buffer供后续使用。可见,refresh实现的是文档从内存移到文件系统缓存的过程。

3、重复上两个步骤,新的segment不断添加到os cache,mem buffer不断被清空,而translog的数据不断增加,随着时间的推移,translog文件会越来越大。

4、当translog长度达到一定程度的时候,会触发flush操作,否则默认每隔30分钟也会定时flush,其主要过程:

1)执行refresh操作将mem buffer中的数据写入到新的segment并写入os cache,然后打开本segment以供search使用,最后再次清空mem buffer。

2)一个commit point被写入磁盘,这个commit point中标明所有的index segment。

3)filesystem cache(os cache)中缓存的所有的index segment文件被fsync强制刷到磁盘os disk,当index segment被fsync强制刷到磁盘上以后,就会被打开,供查询使用。

4)translog被清空和删除,创建一个新的translog。

refresh

最原始的ES版本里,必须等待fsync将segment刷入磁盘,才能将segment打开供search使用,这样的话,从一个document写入到它可以被搜索,可能会超过一分钟,主要瓶颈是在fsync实际发生磁盘IO写数据进磁盘,是很耗时的,这就不是近实时的搜索了。为此,引入refresh操作的目的是提高ES的实时性,使添加文档尽可能快的被搜索到,同时又避免频繁fsync带来性能开销,依靠的原理就是文件系统缓存OS cache里缓存的文件可以被打开(open/reopen)和读取,而这个os cache实际是一块内存区域,而非磁盘,所以操作是很快的。

写入流程改进:

1)数据写入到内存buffer队列中

2)每隔一定时间,buffer中的数据被写入segment文件,然后先写入os cache

3)只要segment数据写入os cache,那就直接打开segment供search使用,而不必调用fsync将segment刷新到磁盘

将缓存数据生成segment后刷入os cache,并被打开供搜索的过程就叫做refresh,默认每隔1秒。也就是说,每隔1秒就会将buffer中的数据写入一个新的index segment file,先写入os cache中。所以,es是近实时的,输入写入到os cache中可以被搜索,默认是1秒,所以从数据插入到被搜索到,最长是1秒(可配)。

flush操作与translog

但是,需要注意, index segment刷入到os cache后就可以打开供查询,这个操作是有潜在风险的,因为os cache中的数据有可能在意外的故障中丢失,而此时数据必备并未刷入到os disk,此时数据丢失将是不可逆的,这个时候就需要一种机制,可以将对es的操作记录下来,来确保当出现故障的时候,已经落地到磁盘的数据不会丢失,并在重启的时候可以从操作记录中将数据恢复过来。elasticsearch提供了translog来记录这些操作,结合os cached segments数据定时落盘来实现数据可靠性保证(flush)。

当向e

相关推荐

  1. Elasticsearch面试系列-01

    2024-03-23 13:34:03       17 阅读
  2. JVM面试系列-03

    2024-03-23 13:34:03       28 阅读
  3. MySQL面试系列-03

    2024-03-23 13:34:03       24 阅读
  4. MongoDB面试系列-03

    2024-03-23 13:34:03       30 阅读
  5. Spring Boot面试系列-03

    2024-03-23 13:34:03       19 阅读
  6. JVM面试系列-02

    2024-03-23 13:34:03       31 阅读
  7. MySQL面试系列-01

    2024-03-23 13:34:03       32 阅读
  8. MySQL面试系列-02

    2024-03-23 13:34:03       30 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-03-23 13:34:03       19 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-23 13:34:03       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-23 13:34:03       20 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-23 13:34:03       20 阅读

热门阅读

  1. 你用对const了吗?C++中const小结

    2024-03-23 13:34:03       18 阅读
  2. 鸿蒙开发 模拟器启动失败问题

    2024-03-23 13:34:03       33 阅读
  3. vue2【详解】mixins —— 抽离公共逻辑

    2024-03-23 13:34:03       16 阅读
  4. Selenium WebDriver使用EC来定义显式等待的条件

    2024-03-23 13:34:03       18 阅读
  5. Linux学习笔记16 - 系统命令

    2024-03-23 13:34:03       15 阅读
  6. Android 静默安装二(无障碍服务版)

    2024-03-23 13:34:03       17 阅读
  7. Windows C++ 监听注册表是否发生变化

    2024-03-23 13:34:03       20 阅读
  8. ChatGPT助力写作:论文写作新利器

    2024-03-23 13:34:03       21 阅读
  9. 001-Windows下PyTorch极简开发环境配置(上)

    2024-03-23 13:34:03       18 阅读
  10. js知识总结

    2024-03-23 13:34:03       20 阅读
  11. 多目标优化算法帕累托前沿的指标

    2024-03-23 13:34:03       21 阅读
  12. 前端需要掌握的 mysql 基础知识

    2024-03-23 13:34:03       23 阅读