• Elasticsearch和Lucene分段


    1. Lucene分段

    当Elasticsearch接收到应用发送的文档时,他会将其索引到内存中称为分段(segments)的倒排索引,这些分段不能被改变,只能被删除,这是为了系统更好的缓存分段,较小的分段会定期合并为较大的分段,合并后的分段会被标记删除。然后这些分段会不时的写入磁盘。

    Elasticsearch对分段的处理有以下几种方式:

    • 刷新(refresh)和冲刷(flush)的频率:刷新会让 Elasticsearch重新打开索引,让新建的文档可用于搜索。冲刷是将索引的数据从内存写入磁盘。从性能的角度来看,刷新和冲刷操作都是非常消耗资源的。
    • 合并的策略:Lucene(Elasticsearch也是如此)将数据存储在不可变的一组文件中,也就是分段中。随着索引的数据越来越多,系统会创建更多的分段。由于在过多的分段中搜索是很慢的,因此在后台小分段会被合并为较大的分段,保持分段的数量可控。不过,合并也是十分消耗性能的,对于IO子系统尤其如此。你可以调节合并的策略,来确定合并多久发生一次,而且分段应该合并到多大。
    • 存储和存储限流:Elasticsearch调节每秒写入的字节数,来限制合并对于IO系统的影响。

    1.1 刷新和冲刷

    Elasticsearch被称为近实时(或准实时)索引系统,是因为默认每秒执行一次刷新操作,将未被索引的数据(新建的索引或文档)刷新到内存中。其不足是每次刷新都会影响性能:某些缓存将失效,拖慢请求,重新打开索引的过程也需要一些处理能力,拖慢了索引的建立。因此可根据项目具体情况设置刷新频率。

    刷新的过程和内存分段写入磁盘的过程是相互独立的。实际上,数据首先索引到内存中,经过一次刷新后,Elasticsearch就会搜索相应的内存分段。将内存中的分段提交到磁盘上的 Lucene索引的过程,被称为冲刷
    (fush),无论分段是否能被搜到,冲刷都会发生。

    为了确保某个节点宕机或分片移动位置的时候,内存数据不会丢失,Elasticsearch将使用事物日志来跟踪尚未冲刷的索引操作。除了将内存分段提交到磁盘,冲刷还会清理事物日志。

    触发冲刷的条件如下:

    • 内存缓冲区已满
    • 自上一次冲刷后超过了一定的时间
    • 事务日志达到了一定的阈值

    image-20201119141052901

    当冲刷发生的时候,它会在磁盘上创建一个或多个分段。执行一个查询的时候,Elasticsearch
    (通过 Lucene)查看所有的分段,然后将结果合并到一个整体的分片中。搜索的时候每个分片上的结果将被聚集为一个完整的结果集合,然后返回给应用程序。
    关于分段,这里需要记住的关键点是你需要搜索的分段越多,搜索的速度就越慢。为了防止分段的数量失去控制,Elasticsearch(也是通过 Lucene)在后台将多组较小的分段合并为较大的分段。

    1.2 段的合并及合并策略

    由于分段是不变的,它们很容易被缓存,使得搜索更快。此外,修改数据集时,如添加一篇文档,无须重建现有分段中的数据索引。这使得新文档的索引也是很快的。

    但是更新文档不能修改实际的文档,只是索引一篇新的文档。如此处理还需要删除原有的文档。而且删除也不能从分段中移除文档(这需要重建倒排索引),只是在单独的.del文件中将其标记为“已被删除”。文档只会在分段合并的时候真正地被移除。

    因此合并分段的两个目的:第一个是将分段的总数量保持在受控的范围内(这用来保障查询的性能)。第二个是真正地删除文档。
    按照已定义的合并策略,分段是在后台进行的。默认的合并策略是分层配置,合并发生在索引、更新或者删除文档的时候,如图10-4所示,该策略将分段划分为多个层次,如果你的分段多于某一层中所设置的最大分段数,该层的合并就会被触发。

    image-20201119142257277

    优化索引:有了刷新和冲刷,你可以手动触发一次合并。一次强制性的合并也被称为优化(optimize),之所以起这样的名字是因为通常是在一个今后不会更改的索引上运行这个操作,将其优化到一定
    (较低)数量的分段,使得更快的搜索成为可能。

  • 相关阅读:
    pandas去重方法
    原生表单组件
    html表单
    html表格基本标签
    文档和网站架构
    文本格式
    【Leetcode链表】奇偶链表(328)
    【Leetcode链表】移除链表元素(203)
    【Leetcode链表】旋转链表(61)
    【Leetcode链表】反转链表 II(92)
  • 原文地址:https://www.cnblogs.com/code-duck/p/14005429.html
Copyright © 2020-2023  润新知