ElasticSearch 学习记录之ES如何操作Lucene段

时间:2021-07-28 15:24:24

近实时搜索

  • 提交(Commiting)一个新的段到磁盘需要一个 fsync 来确保段被物理性地写入磁盘,这样在断电的时候就不会丢失数据。但是每次提交的一个新的段都fsync 这样操作代价过大。可以使用下面这种更轻量的方式
  • 在内存缓冲区中包含了新文档的 Lucene 索引
    • ElasticSearch 学习记录之ES如何操作Lucene段

    • Lucene 允许新段被写入和打开--使其包含的文档在未进行一次完整提交时便对搜索可见
  • 缓冲区的内容已经被写入一个可被搜索的段中,但还没有进行提交
    • ElasticSearch 学习记录之ES如何操作Lucene段

    • 这里新段会被先写入到文件系统缓存--这一步代价会比较低,稍后再被刷新到磁盘--这一步代价比较高
  • 默认情况下每个分片会每秒自动刷新一次
    • 近 实时搜索: 文档的变化并不是立即对搜索可见,但会在一秒之内变为可见
    • POST /_refresh // 刷新Refresh 所有的索引
    • POST /blogs/_refresh // 只刷新Refresh blogs 索引

      可以在settings 设置对定时刷新频率的大小

    PUT /my_logs

    {

    "settings": {

    "refresh_interval": "30s" //30秒刷新一次

    "refresh_interval": "-1" //关闭自动刷新

    "refresh_interval": "1s"//每秒自动刷新

    }

    }

    持久化变更

    在没有 fsync 把数据从内存刷新到硬盘中,我们不能保证数据在断电或程序退出时之后依然存在

  • 即时每秒刷新,也不能实现近实时搜索。我们任然有另外的方法确保从失败中回复数据
  • ES 增加一个translog,或者叫做事务日志。在每次操作是均进行日志记录
  • 整个流程是如下的操作
    1. 一个文档被索引之后,就会被添加到内存缓冲区,并且 追加到了 translog

      -ElasticSearch 学习记录之ES如何操作Lucene段

    2. 刷新(refresh)使分片处于缓存被清空,但是事务日志不会的状态
      • 内存缓冲区的文档被写入新的段中,但是没有进行fsync
      • 段被打开,且可被搜索到
      • 内存缓冲区被清空
      • ElasticSearch 学习记录之ES如何操作Lucene段
    3. 进程继续进行,更多的文档被添加到内存缓冲区和追加的事务日志中
      • ElasticSearch 学习记录之ES如何操作Lucene段
    4. 每隔一段时间,translog太大 或 索引被刷新。一个新的translog被创建,并且被全量提交

      -ElasticSearch 学习记录之ES如何操作Lucene段

      • 所有内存缓冲区的文档都被写入一个新的段中
      • 缓冲区内清空
      • 一个提交点被写入硬盘
      • 文件系统缓存通过fsync被刷新
      • 老的translog 被删除
  • translog 提供所有没有被刷新到磁盘操作的一个持久化记录。当ES启动时,会根据最后一个提交点去恢复已知的段
  • translog 也可供用来提供实时的CRUD。但我们进行一些CRUD操作时,它会首先检查translog任何最近的变更。
  • flush API 执行一次提交,并截断translog的操作
    • 分片默认每30M自动flush一次。translog太大也会自动flush
    • 可通过自己执行flush API操作

      POST /blogs/_flush //刷新索引

      POST /_flush?wait_for_ongoing //刷新索引并等待所有的刷新结果返回

段合并
  • 段合并的时候会将那些旧的已删除的文档从文件系统中删除,被删除或者被更新的文档不会被复制到新的大段中
  • 段合并的流程

    -ElasticSearch 学习记录之ES如何操作Lucene段

    • 当索引的时候,刷新(refresh)操作会创建新的段
    • 合并的时候会选择一部分大小相似的段,并且将其合并到更大的段中
    • 段的合并结束,老的段就要被删除
  • optimized API 的作用
    • optimize API大可看做是 强制合并 API 。