【最佳实践】巡检项:Elasticsearch Service(ES)集群 bulk 拒绝诊断

2023-04-19 11:11:57 浏览数 (1)

集群 bulk 拒绝的含义

bulk 即集群索引写入,bulk 拒绝表示集群当前节点的 bulk 请求超出了节点的默认 queue 容量,默认容量为1024。出现 bulk 拒绝时,说明集群已经达到了 bulk 操作处理能力的上限,或集群出现异常,应及时排查出现 bulk 拒绝的原因并解决,否则会影响业务的 bulk 操作,甚至出现数据丢失情况。

定位集群 bulk 拒绝的原因

1、判断集群 bulk 拒绝情况

通过观察集群的监控和日志,判断集群当前是否发生了 bulk 拒绝

写入拒绝率大于0即发生了写入拒绝写入拒绝率大于0即发生了写入拒绝
日志中出现“rejected”“queue“相关字段即发生了 bulk 拒绝日志中出现“rejected”“queue“相关字段即发生了 bulk 拒绝

2、确认当前拒绝的请求量

代码语言:javascript复制
GET _cat/thread_pool/write?s=queue:desc&v
当前节点发生拒绝的请求量当前节点发生拒绝的请求量

3、排查 bulk 拒绝的原因

(1)确认是否有写入突增

查看相关监控指标,确认集群在问题时间点是否有相应的写入突增

集群出现写入突增集群出现写入突增

确认集群当前的写入并发是否达到集群瓶颈,根据经验,理想状态下单个 4C16G 的节点可对应承载1W QPS 的纯写入,如果同时伴随查询,集群可承载的 QPS 相对会更低。因此,若集群的写入已达到集群瓶颈,即会发生写入拒绝,建议升级配置。

(2)确认是否 bulk body 设置不合理

确认单个 bulk body 是否合理,以 logstash 为例,bulk_size 默认大小为5000,若写入的单条数据平均大小为2kB,则单次请求的 bulk body 为10mb。

(3)确认是否索引分片设置不合理

确认集群索引分片是否有分布不均的情况

代码语言:javascript复制
GET /_cat/shards?s=node,store:desc

根据相应的问题提供解决方案

1、集群写入到达瓶颈

根据官网提供的“集群规格和容量配置评估”文档,测算当前集群规格是否能满足写入要求https://cloud.tencent.com/document/product/845/19551

若根据文档难以计算,可灵活使用“新建集群”——“elasticsearch集群配置评估工具”获取合适的集群规格

2、bulk 请求体设置不合理

原厂建议单个 body 请求体在 5m-15m 之间,根据经验,单个 body 为10m 最为合适。如过大,则会导致单个 bulk 请求处理时间过长,导致队列排满;如过小,则会导致 bulk 请求数过多,导致队列排满。

3、索引分片设置不合理

索引分片分配建议:

1、主 shard 数与副 shard 数之和需要是集群数据节点的整数倍;

2、分片容量,主要分为写入和查询两个场景

(写多读少场景)索引单分片10g~20g,多分片有利于写入;

(读多写少场景)索引单分片20g~40g,尽量减少分片数,可以降低热点,因为当分片数过多时,就容易出现长尾子请求,即有可能部分子请求因节点异常或 Old GC、网络抖动等延迟响应,导致整个请求响应缓慢。另一方面,拆分过多的子请求无法提升数据节点请求吞吐,不能充分利用 CPU。在尽量减少主分片数的情况下,同时也可以适当增加副本数,从而提升查询吞吐;

3、在遵循单分片设计原则的前提下,预测出索引最终大小,并根据集群节点数设计索引分片数量,使分片尽量平均分布在各个节点。

4. 索引尽量增加时间后缀,按时间创建索引,若单日数据量较小,可考虑按周或按月生成索引;

5. 在遵循单分片设计原则的前提下,预测出索引最终大小,并根据集群节点数设计索引分片数量,使分片尽量平均分布在各个节点。

0 人点赞