报错现象
集群中的某些节点的资源使用率远高于其他节点。
通过监控观察:
1分钟负载的最大值和和平均值相差较大
通过 cerebro 观察:
部分节点负载情况明显高于其他节点
报错分析
热点主要是以下几种原因造成:
1、分片在节点之间分布不均匀,导致业务请求 ES 集群时负载不均;
2、用户侧业务存在热点,频繁请求某些数据分片造成热点;
3、索引未配置副本,导致查询请求聚集于分片所处的节点。
注:在分片分布均匀的情况下,如果查询请求中指定了routing参数,也会导致查询请求聚集于某一部分分片,造成请求不均匀。
解决方案
临时解决方案(以下操作均建议在有副本的情况下使用):
1、节点监控中找到负载最高的节点,重启高负载节点;
2、登录 cerebro 将高负载节点上的副本分片迁移至低负载节点。
长期优化建议:
1、单个索引的主分片与副本分片数之和是集群数据节点的整数倍;
2、分片容量,主要分为写入和查询两个场景
【写多读少场景】索引单分片10g~20g,多分片有利于写入。同时若对数据高可用性要求不高,可以不设置副本;
【读多写少场景】索引单分片20g~40g,尽量减少分片数,可以降低热点。当分片数过多时,就容易出现长尾子请求,即有可能部分子请求因节点异常或 Old GC、网络抖动等延迟响应,导致整个请求响应缓慢。另一方面,拆分过多的子请求无法提升数据节点请求吞吐,不能充分利用 CPU。在尽量减少主分片数的情况下,同时也可以适当增加副本数,从而提升查询吞吐;
3、在遵循单分片设计原则的前提下,预测出索引最终大小,并根据集群节点数设计索引分片数量,使分片尽量平均分布在各个节点。