tencent cloud

文档反馈

集群负载不均的问题如何解决?

最后更新时间:2021-08-11 11:17:23

    问题现象

    集群在某些情况下会个别节点 CPU 使用率远高于其他节点的现象,具体表现为 ES 集群控制台节点监控上可以明显看到某些节点 CPU 使用率很高。

    问题原因

    • 索引分片设计不合理
    • Segment 大小不均
    • 存在典型的冷热数据需求场景

    原因分析及解决方案

    Shard 设置不合理

    1. 登录 Kibana 控制台,在开发工具中执行以下命令,查看索引的 shard 信息,确认索引的 shard 在负载高的节点上呈现的数量较多,说明 shard 分配不均。
      GET _cat/shards?v
      
    2. 登录 Kibana 控制台,在开发工具中执行以下命令,查看索引信息。结合集群配置,确认存在节点 shard 分配不均的现象。
      GET _cat/indices?v
      
    3. 重新分配分片,合理规划 shard,确保主 shard 数与副 shard 数之和是集群数据节点的整数倍。
      注意:

      Elasticsearch 在检索过程中也会检索 .del 文件,然后过滤标记有 .del 的文档,这会降低检索效率,耗费规格资源,建议在业务低峰期进行强制合并操作,具体请参见 force merge

    shard 规划建议

    Shard 大小和数量是影响 Elasticsearch 集群稳定性和性能的重要因素之一。Elasticsearch 集群中任何一个索引都需要有一个合理的 shard 规划。合理的 shard 规划能够防止因业务不明确,导致分片庞大消耗 Elasticsearch 本身性能的问题。以下是 shard 规划时的几个建议:

    • 尽量遵循索引单分片20g - 50g的设计原则。
    1. 索引尽量增加时间后缀,按时间滚动,方便管理。
    2. 在遵循单分片设计原则的前提下,预测出索引最终大小,并根据集群节点数设计索引分片数量,使分片尽量平均分布在各个节点。
    注意:

    主分片不是越多越好,因为主分片越多,Elasticsearch 性能开销也会越大。建议单节点 shard 总数按照单节点内存×30进行评估,如果 shard 数量太多,极易引起文件句柄耗尽,导致集群故障。

    Segment 大小不均

    1. 在查询 body 中添加 "profile": true,检查 test 索引是否存在某个 shard 查询时间比其他 shard 长。
    2. 查询中分别指定 preference=_primarypreference=_replica,在 body 中添加 "profile": true,分别查看主副 shard 查询消耗的时间。检查较耗时的 shard 主要体现在主 shard 上还是副 shard 上。
    3. 登录 Kibana 控制台,在开发工具中执行以下命令,查看 shard,并根据其中 segment 信息分析问题所在,确认负载不均与 segment 大小不均有关。
      GET _cat/segments/index?v&h=shard,segment,size,size.momery,ip
      GET _cat/shards?v
      
    4. 参考以下两种方法其中一种解决问题:
      • 在业务低峰期进行强制合并操作,具体请参见 force merge,将缓存中的 delete.doc 彻底删除,将小 segment 合并成大 segment。
      • 重启主 shard 所在节点,触发副 shard 升级为主 shard。并且重新生成副 shard,副 shard 复制新的主 shard 中的数据,保持主副 shard 的 segment 一致。

    存在典型的冷热数据需求场景

    如果查询中添加了 routing 或查询频率较高的热点数据,则必然导致数据出现负载不均。

    联系我们

    联系我们,为您的业务提供专属服务。

    技术支持

    如果你想寻求进一步的帮助,通过工单与我们进行联络。我们提供7x24的工单服务。

    7x24 电话支持