【ELK】ElasticSearch 合并segments

segments相关优点与注意事项

https://www.elastic.co/guide/en/elasticsearch/reference/7.17/ilm-forcemerge.html
https://www.elastic.co/guide/en/elasticsearch/reference/7.17/indices-forcemerge.html#forcemerge-blocks
https://opster.com/guides/elasticsearch/operations/force-merge-operations/

优点:

        优化索引性能和管理存储空间,以减少索引文件的数量、提高查询性能,从而提高搜索速度并释放磁盘空间

强制合并 注意事项:

  1. Merge是一项资源密集型操作,如果一次触发太多强制合并,可能会对您的集群产生负面影响。
  2. 只读索引:需要在已完成写入的索引进行合并(cold 或者只读索引),强制合并可以提高搜索性能并减少磁盘使用量。
  3. 基于时间的索引:对于基于时间序列(例如日志或事件数据)的索引,强制合并旧索引可能是有益的。
  4. 磁盘空间管理:强制合并可以帮助减少段数量,从而释放磁盘空间。
  5. Merge 默认是自动进行的,生产环境中避免过度依赖手动的 Merge 操作。
  6. 不会改变 index 中的age 时间,不会影响lifecycle 执行
  7. "refresh_interval" : "2m",较长的刷新间隔可以减少 Merge 的频率,从而降低系统开销。
  8. 如果是大于5GB的段,不会在执行自动合并策略,从而导致磁盘使用量增加和搜索性能变差。
  9. 强制合并期间API阻塞,后台运行不会中断,
  10. ilm 中配置forcemerge,允许的阶段:热、温。操作使索引变为只读。 在hot 节点执行 影响写入速度

目前集群基本信息

GET _cluster/stats  1013 ms
"indices" : {
    "count" : 6067,
    "shards" : {
      "total" : 35000,
      "primaries" : 17500,
    "docs" : {
      "count" : 144555016341,
      "deleted" : 721947650
    },
    "store" : {
      "size_in_bytes" : 283243198204802,
      "total_data_set_size_in_bytes" : 283243198204802,
      "reserved_in_bytes" : 0
    },
    "mem" : {
        "total_in_bytes" : 26835101253632,
        "free_in_bytes" : 3831963340800,
        "used_in_bytes" : 23003137912832,
        "free_percent" : 14,
        "used_percent" : 86
      }
"segments" : {
      "count" : 609766,
      "memory_in_bytes" : 12125386176,
      "terms_memory_in_bytes" : 10213429672,
      "stored_fields_memory_in_bytes" : 800820848,
      "term_vectors_memory_in_bytes" : 0,
      "norms_memory_in_bytes" : 115028864,
      "points_memory_in_bytes" : 0,
      "doc_values_memory_in_bytes" : 996106792,
      "index_writer_memory_in_bytes" : 13139378392,
      "version_map_memory_in_bytes" : 429915824,
      "fixed_bit_set_memory_in_bytes" : 2942835072,
      "max_unsafe_auto_id_timestamp" : 1706247568250,
      "file_sizes" : { }


Disk Available 61.19% 106.7 TB / 174.3 TB
JVM Heap 44.68% 969.6 GB / 2.1 TB

关于调整前后 请求速度优化总览

集群显示情况:因为大部分请求都是基于热数据请求,索引前后对比可能不明显,

关于自动Merge 配置

自动Merge不需要人为参与,forcemerge也尽量不要超过自动Merge的条件,所以保持默认即可
#index settings
"merge" : {
    "scheduler" : {"max_thread_count" : "1"   #线程为1,非ssd保持默认即可
    }},

PUT _ilm/policy/my_policy
{ ···
    "forcemerge" : { "max_num_segments": 1   #最大合并为1,需要结合Rollover 才能生效

forcemerge配置

关于只读索引测试

索引只读一般会涉及到如下三个配置:
"index.blocks.read_only_allow_delete": true,   #只读时允许删除,磁盘使用达到disk.watermark.low是集群会自动配置 ---不影响forcemerge 执行

"index.blocks.read_only": true,                   #索引和索引元数据只读,disk.watermar也会自动配置和删除此配置    ---影响forcemerge 执行
     POST /my-index-000001/_forcemerge
     提示: "reason" : "index [my-index-000001] blocked by: [FORBIDDEN/5/index read-only (api)];"

"index.blocks.write": true                       #lifecycle中可以配置                                           ---不影响forcemerge 执行
一般 在forcemerge 中强调只读索引,本身在执行的过程中并不会设置索引只读
不过在lifecycle中配置中,必须使用 rollover ,并且rollover过程中 会将index 设置成 read-only
https://www.elastic.co/guide/en/elasticsearch/reference/7.17/ilm-forcemerge.html
Force merge
Phases allowed: hot, warm.
Force merges the index into the specified maximum number of segments. This action makes the index read-only.
To use the forcemerge action in the hot phase, the rollover action must be present. If no rollover action is configured, ILM will reject the policy.

GET my-*/_settings/?filter_path=**.blocks
     "index.blocks.write": "true"  

ps:rollover 生成的空索引状态一直为 "step" : "check-rollover-ready"不会forcemerge也不会转移到warm或者cold节点

相关测试接口

GET _cluster/stats  #集群整体状态

#查询index数据和配置信息
GET my-*/_settings/?filter_path=**.blocks
GET my-*/_stats/?filter_path=indices.*.total.merges
GET my-index-000001/

#任务
GET /_cat/pending_tasks?v&format=json
GET /_cluster/pending_tasks
GET /_cat/tasks?v

DELETE  my-index-000001  #删除index
PUT /my-index-000001  #创建 index
POST my-index-000001/_doc/  #写入index
{
  "title": "Another Document",
  "content": "This is another document added to the index."
}

#segments 查询
GET _cat/segments/my-index-000001?v
GET /my-index-000001/_segments
GET /_cat/indices/my-index-000001?h=index,pri,rep,docs.count,pri.store.size,segments.count&format=json

#/_forcemerge
POST /my-index-000001/_forcemerge
POST /my-index-000001/_forcemerge?max_num_segments=1
POST /my-index-000001/_forcemerge?only_expunge_deletes=true

#ilm
POST /my-index-000001/_ilm/retry  #重试
GET _ilm/policy/my-index-000001   #查看
PUT _ilm/policy/my-index-000001   #创建

#kibana-template
PUT /_index_template/template-my-index-000001  #创建

关于forcemerge 参数

#! 不赞成同时设置only_expunge_delete和max_num_segments,并且在将来的版本中将被拒绝
#POST /my-index-000001/_forcemerge?max_num_segments=1&only_expunge_deletes=true

max_num_segments:要合并到的段数 最大为1
only_expunge_deletes: 默认为false. 这只会合并删除文档比例较高的段,从而减少对性能的影响,index.merge.policy.expunge_deletes_allowed:默认为 10%
flush:强制合并后对索引执行刷新。默认为true.
expand_wildcards:默认是open 状态的索引

关于forcemerge 前后磁盘与内存占用、执行时间 在脚本中实现统计

规则视实际情况可以做出对应的调整

notice: index 匹配条件: *-%Y.%m.%d格式  且为10天-17前的,  cold节点的索引
                        必须是 "index.blocks.write": "true"
                        merges.total != 0  # 忽略 减少对性能的影响,后期可以调整
                        index大小(pri.store.size) 大于100G  不处理

            # 根据shards 数量 配置max_num_segments数量,选择不同处理方式
            #     level1: 设置于max_num_segments=1
            #     level2: 保持默认参数
            #     level3: 设置 only_expunge_deletes=true 只会合并删除文档比例较高的段,从而减少对性能的影响
            #     leveln: 动态设置于max_num_segments=n
            #
            #   index大小(pri.store.size) 大于500G    不处理
            #   index大小(pri.store.size) 200G~500G  level3
            #   index大小(pri.store.size) 100G~200G  level2
            #   index大小(pri.store.size) 2G~100G
            #        segments 小于2G 配置成2G
            #   index大小(pri.store.size) 小于2G      level1

        每天 4:30-7:30执行

Force Merge 为什么 pri.store.size 却上升了

"Force Merge" 是指在 Elasticsearch 中对索引执行强制合并(force merge)操作,这个操作将减少索引片段的数量,并且可以提高查询性能和减少磁盘空间占用。
当你执行 force merge 操作后,你可能会观察到 pri.store.size 上升的情况。这是因为 force merge 操作会创建新的合并段(merged segment),这些合并段通常比原始的片段更大。虽然 force merge 操作会减少索引的碎片化程度,但是在合并过程中可能会产生一些临时的额外存储占用。
另外,force merge 操作会产生额外的 I/O 负载,因为它需要读取旧的索引片段并将它们合并成更大的新片段。这可能导致临时的存储空间占用和增加的磁盘写入。
总的来说,虽然 force merge 操作会在某些情况下提高查询性能和减少存储空间占用,但它也可能导致临时的存储空间上升和额外的 I/O 开销。因此,在执行 force merge 操作时,你需要权衡这些因素,并根据具体情况进行评估和监控。
  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值