kennyWWW 2024-07-15 17:37 采纳率: 0%
浏览 6

【ES】Refresh和Segment机制提问

背景:
ES中存在索引i_dm_f_da_enterprise,设置为"refresh_interval" : -1,禁用定时refresh。在索引中已经存在数据的情况下,重新进行全量导入,导致索引中存在大量标记“已删除”的文档,磁盘空间占用较大。我希望通过优化,减少索引所占用的磁盘空间,偶然发现refresh刷新(POST i_dm_f_da_enterprise/_refresh )可以达到目的,但不明原理,特此提问。
为了阐明问题,本人在下方提供了刷新前后的索引、段的信息,包括文档数量、段数量、段的committed信息等

理论背景:

  1. 根据ES官方文档,refresh操作是将ES内存(buffer)的文档合并为一个新的段,再将其导入本地系统缓存(os cache)的过程。该过程不涉及段级别的合并,而是会新增一个段。该过程不涉及flush、merge操作,对磁盘没有影响,同时也不应该导致所占磁盘空间减少。

刷新前:
1. 观察索引占用磁盘空间情况:GET /_cat/indices?v
health status index uuid pri rep docs.count docs.deleted store.size pri.store.size green open i_dm_f_da_enterprise vQJl3D2ETvKCCEfbathbXw 36 1 338486628 72052057 804.1gb 384.3gb

2. 观察segment段的数量:GET /_cat/segments/i_dm_f_da_enterprise?v=true
段的数量:3191个
`
index shard prirep ip segment generation docs.count docs.deleted size size.memory committed searchable

i_dm_f_da_enterprise 0 p 9.99.112.6 _1uc 2388 3338940 3246825 4.7gb 35454 false true

i_dm_f_da_enterprise 0 p 9.99.112.6 _1uw 2408 194240 0 144.9mb 3716 true true

i_dm_f_da_enterprise 0 p 9.99.112.6 _1vu 2442 167028 0 124.8mb 3652 true true

i_dm_f_da_enterprise 0 p 9.99.112.6 _1xl 2505 2828321 15314 2gb 17086 false true
`

**操作:refresh刷新:POST i_dm_f_da_enterprise/_refresh **

刷新后:
1. 观察索引占用磁盘空间情况:GET /_cat/indices?v
health status index uuid pri rep docs.count docs.deleted store.size pri.store.size green open i_dm_f_da_enterprise vQJl3D2ETvKCCEfbathbXw 36 1 338486628 72052057 584gb 294.9gb

2. 观察segment段的数量:GET /_cat/segments/i_dm_f_da_enterprise?v=true
段的数量:1973个
`
index shard prirep ip segment generation docs.count docs.deleted size size.memory committed searchable

i_dm_f_da_enterprise 0 p 9.99.112.6 _1uw 2408 194240 0 144.9mb 3716 true true

i_dm_f_da_enterprise 0 p 9.99.112.6 _1vu 2442 167028 0 124.8mb 3652 true true

观察总结:

  1. 通过GET /_cat/indices?v查看索引信息,发现docs.count(文档总数量)与docs.deleted(被删除的文档数量)不变,索引占用磁盘空间大幅减少,段的数量大幅减少。
  2. 通过GET /_cat/segments/i_dm_f_da_enterprise?v=true查看段信息,发现committed=false的段被删除,且刷新前后docs.count总数减少。

疑问:

  1. 为什么通过GET /_cat/indices?v和GET /_cat/segments/i_dm_f_da_enterprise?v=true观察到的doc.count变化不匹配,前者不变而后者减少?
  2. 为什么refresh会删除GET /_cat/segments中committed=false的segment?refresh操作是否会导致段的合并?根据官方文档,committed字段代表是否已经持久化至磁盘,因此应由flush过程控制,而非refresh。
    官方文档:https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-segments.html

流程图:

image.png

  • 写回答

3条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-07-15 17:42
    关注

    引自免费微信小程序:皆我百晓生

    你的问题和描述非常详细,对于Elasticsearch的刷新(refresh)机制和段(segment)管理有深入的理解。我会尝试解答你的疑问。

    首先,让我们理解一下Elasticsearch中的几个关键概念:

    • 索引(Index):Elasticsearch中用于存储文档的数据结构。
    • 段(Segment):在Elasticsearch中,文档被存储在段中。每个索引都包含多个段,每个段都是一个倒排索引,用于执行搜索操作。每个段都有自己的数据文件和元数据文件。一旦一个文档被刷新和合并到新的段中,旧的段就不再被使用。这就是为什么在刷新和合并操作后,你会看到段的数量减少。
    • Refresh操作:Refresh操作使新的文档或更新可用作搜索。它不会合并或删除任何段,而是将内存中的文档数据刷新到一个新的段中。新段是独立存在的,不影响原有的段。因此,理论上Refresh操作不应该导致磁盘空间的减少或段的数量的减少。但是,你的问题中出现了这种情况,所以我们需要进一步分析。

    关于你的问题:

    1. 为什么通过GET /_cat/indices?v和GET /_cat/segments/i_dm_f_da_enterprise?v=true观察到的doc.count变化不匹配,前者不变而后者减少?

    这个问题可能与Elasticsearch在执行刷新和合并操作时的内部机制有关。当你执行Refresh操作时,新的文档或更新可能被刷新到一个新的段中,但旧的段可能仍然存在于系统中,只是不再被使用。因此,通过GET /_cat/segments看到的文档数量可能包括旧的以及新的段中的文档数量总和,而通过GET /_cat/indices看到的文档数量只反映当前正在使用的索引中的文档数量。这可能解释为什么这两个值不同。具体的原因可能需要进一步分析Elasticsearch的内部日志或诊断信息来确定。

    1. 为什么refresh会删除GET /_cat/segments中committed=false的segment?

    Refresh操作本身不会删除任何段,无论其committed字段的值是true还是false。根据Elasticsearch的官方文档,committed字段表示该段的元数据是否已经持久化到磁盘。但这并不意味着Refresh操作会删除未提交的段。如果某些段在Refresh操作后消失,可能是因为这些段已经过期并且被自动删除或合并到新的段中了。这是Elasticsearch为了优化存储和提高性能而自动进行的操作。具体的原因可能需要你检查Elasticsearch的日志或进一步分析系统的行为来确定。

    总的来说,你的观察表明Elasticsearch在执行某些优化操作,这些操作可能导致磁盘空间的减少和段的数量的减少。然而,具体的机制和原因可能需要你进一步分析Elasticsearch的行为和日志来确定。希望这些信息能够帮助你解决问题!

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 7月15日

悬赏问题

  • ¥15 如何在vue.config.js中读取到public文件夹下window.APP_CONFIG.API_BASE_URL的值
  • ¥50 浦育平台scratch图形化编程
  • ¥20 求这个的原理图 只要原理图
  • ¥15 vue2项目中,如何配置环境,可以在打完包之后修改请求的服务器地址
  • ¥20 微信的店铺小程序如何修改背景图
  • ¥15 UE5.1局部变量对蓝图不可见
  • ¥15 一共有五道问题关于整数幂的运算还有房间号码 还有网络密码的解答?(语言-python)
  • ¥20 sentry如何捕获上传Android ndk 崩溃
  • ¥15 在做logistic回归模型限制性立方条图时候,不能出完整图的困难
  • ¥15 G0系列单片机HAL库中景园gc9307液晶驱动芯片无法使用硬件SPI+DMA驱动,如何解决?