ES调试与优化工作笔记

Posted 每日摸鱼大王

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ES调试与优化工作笔记相关的知识,希望对你有一定的参考价值。

本文主要涉及关于elastcisearch 关于内存,mapping,查询语句,系统性能查看方面基本的内容和一些调试方法的整理和收集。

参考阅读

  • 官方关于index性能优化方案

    • https://www.elastic.co/guide/en/elasticsearch/reference/current/tune-for-indexing-speed.html
  • 官方关于search性能优化方案

    • https://www.elastic.co/guide/en/elasticsearch/reference/current/tune-for-search-speed.html
  • 官方关于mapping设置的一些限制

  • 官方关于nested-field的一些限制

    • https://www.elastic.co/guide/en/elasticsearch/reference/current/nested.html#_limits_on_nested_mappings_and_objects
  • 使用enabled配置,只对数据进行保存,不进行index

    • https://www.elastic.co/guide/en/elasticsearch/reference/current/enabled.html
  • ebay的es性能优化实践

    • https://tech.ebayinc.com/engineering/elasticsearch-performance-tuning-practice-at-ebay/
  • 性能优化干货(和官方的基本类似)

    • https://developer.aliyun.com/article/706990

部分调优建议

  • 简单

    • 升级硬件性能,如要提升集群内纯大小,详细原因看后面
  • 中等

    • mapping优化(需review业务代码,修改IDE配置)

      • 不需要再es返回结果中出现的字段,不同步到es中

      • 需要在返回结果中出现,但不需要用于搜索的字段

        • 简化其mapping类型,特别是text->keyword、nested->object
        • 对字段不进行index,设置enabled: false
        • 通过自定义tokenizer 代替*搜索
    • 同步过程优化(需在IDE中实现)

      • 对不同步规模的index写数据时,动态调整每次批量写入的条目数,以及写完数据后sleep等待的时长(已实现)

      • 往ES写数据前修改index的refresh参数,或设置分区参数,写完数据再改回来

        • https://www.elastic.co/guide/en/elasticsearch/reference/current/tune-for-indexing-speed.html#_unset_or_increase_the_refresh_interval
        • https://www.elastic.co/guide/en/elasticsearch/reference/current/tune-for-indexing-speed.html#_disable_replicas_for_initial_loads
  • 复杂

    • mapping优化(需review业务代码,修改业务代码,修改IDE配置)

      • 根据数据查询场景,把复杂嵌套数据(nested)预处理成简单类型的数据(keyword或text等),预处理过程可以在业务代码进行,也可以用IDE的calculated field功能进行
      • 避免宽表,减少index到es的字段,只index需要用于查询的数据,其他数据通过es查到主键后再从db中获取

关于Nest 字段的影响

https://developer.aliyun.com/article/802096

结论: 对写入/更新速度比较大,nest 创建的子文档对硬盘size影响还好

分片,节点,索引占用磁盘大小和内存分析工具

使用help模式查看参数详情

GET _cat/segments?help
GET _cat/segments?v&h=index,si,sm
GET _cat/indices?help
GET _cat/indices?v
GET _cat/indices?v&h=i,dc,qcm,rcm,mtd,sm,fm,tm,sfbm 查看索引内存使用状况
GET _cat/nodes?help
GET _cat/nodes?v&h=rc
GET _cat/nodes?v&h=rc,sfbm

注意rc参数 "used machine memory"这个值无论现在es里面有多少doc,这个值都接近服务器最大内存
GET _cat/nodes?h=name,fm,fcm,sm,qcm,im&v
查看节点磁盘占用
GET _cat/nodes?v&h=dt,du,r

查询语法优化时候注意事项:

  1. size问题 过大的size,设计时请尽量避免size问题
  2. query_string使用没使用default_field的时,请注意在query 的field 后面使用"( ) " 的问题,

一些带空格的string查询 和 OR 查询 在没有括号的时候,系统语法会将其解析为全文查询

Titanhouse t4.large 机型大概63万talent 会占满磁盘

关于写入速度,使用现有talent数据,在bulk api 500条每次情况下,会导致ingest node 压力较大,

在ingest node 磁盘空间不够时候还会造成index宕机

关于aws 机型对批量写入数据的影响数据

Es的机型的带宽,对批量写入数据 影响挺大,

之前用的r5.large 的机型 同步数据用的1000条一组没问题

刚才用m4.large的reIndex, 500条一次支持不了,一次的写入不能超过10MB。

  • https://docs.aws.amazon.com/opensearch-service/latest/developerguide/limits.html
  • https://stackoverflow.com/questions/28841221/what-is-the-maximum-elasticsearch-document-size

Elasticsearch 数据预热,数量量与内存大小关系

https://juejin.cn/post/6844903860125827086

Aws Elasticsearch 各实例的一些说明

https://docs.aws.amazon.com/opensearch-service/latest/developerguide/limits.html

Elasticsearch 数据量与查询性能关系测试设计

  1. 设计查询用例(有条件的项目可以直接从,cloudwatch 下载已有es query 用例进行测试)
  2. 复制数据到要测试的数量(百万,亿级别)
  3. 使用脚本对每组测试用例测试10遍,以求平均速度(应为存在数据预热问题,需要多跑几次,求平均速度),记录数据返回速度和返回体大小
  4. 统计分析查询结果发回速度,返回测试报告
  5. 顺便检测比较慢的查询,和返回体较大的结果,看是否能进行优化

以上是关于ES调试与优化工作笔记的主要内容,如果未能解决你的问题,请参考以下文章

Elasticsearch 源码解析与优化实战(张超)----笔记

Elasticsearch 源码解析与优化实战(张超)----笔记

ElasticSearch 学习笔记总结

elasticsearch检索,聚合,建模,优化--《elasticsearch核心技术与实战》笔记

ElasticSearch笔记整理:CURL操作ES插件集群安装与核心概念

Elasticsearch笔记九之优化