集群 bulk 拒绝的含义
bulk 即集群索引写入,bulk 拒绝表示集群当前节点的 bulk 请求超出了节点的默认 queue 容量,默认容量为1024。出现 bulk 拒绝时,说明集群已经达到了 bulk 操作处理能力的上限,或集群出现异常,应及时排查出现 bulk 拒绝的原因并解决,否则会影响业务的 bulk 操作,甚至出现数据丢失情况。
定位集群 bulk 拒绝的原因
1、判断集群 bulk 拒绝情况
通过观察集群的监控和日志,判断集群当前是否发生了 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. 在遵循单分片设计原则的前提下,预测出索引最终大小,并根据集群节点数设计索引分片数量,使分片尽量平均分布在各个节点。