问题分析

这是Logstash向ES请求创建新索引时,Logstash日志出现以下报错信息。

[2021-01-11T13:23:52,381][WARN ][logstash.outputs.elasticsearch][main][08029a8bd56dc10a64b84e502acbac75
f20dc2c03ac3454af5ea5a31d7aade2c] Could not index event to Elasticsearch. {:status=>400, :action=>["ind
ex", {:_id=>nil, :_index=>"catalina-prod-openapi-2021.01.11", :routing=>nil, :_type=>"_doc"}, #<LogStas
h::Event:0x3a2c6612>], :response=>{"index"=>{"_index"=>"catalina-prod-2021.01.11", "_type"
=>"_doc", "_id"=>nil, "status"=>400, "error"=>{"type"=>"validation_exception", "reason"=>"Validation Fa
iled: 1: this action would add [2] total shards, but this cluster currently has [1000]/[1000] maximum s
hards open;"}}}}

从日志可以找到报错信息,如下:

Failed: 1: this action would add [2] total shards, but this cluster currently has [1000]/[1000] maximum
shards open;

ES当前最大的分片数只有1000,并且已经占用满了,但是此时ES创建新索引时还需要2个分片。也就是说ES的分片数不够用了。

 

问题解决

从Elasticsearch7.X版本开始,每个node默认只允许有1000个分片,所以上述报错是因为集群分片数不足引起的。

修改ES的分片数量

1、通过配置文件elasticsearch.yml修改节点(集群)分片数量,需要重启服务。(永久生效)

cluster.max_shards_per_node: 5000

2、通过curl命令修改分片数量

集群更新 API 有两种工作模式:

临时(Transient)

这些变更在集群重启之前一直会生效。一旦整个集群重启,这些配置就被清除。

永久(Persistent)

这些变更会永久存在直到被显式修改。即使全集群重启它们也会存活下来并覆盖掉静态配置文件里的选项。

临时或永久配置需要在 JSON 体里分别指定。

  • 临时生效
curl -XPUT -H "Content-Type:application/json" http://localhost:9200/_cluster/settings -d '{ "transient": { "cluster": { "max_shards_per_node": 5000 } } }'
  • 永久生效
curl -XPUT -H "Content-Type:application/json" http://localhost:9200/_cluster/settings -d '{ "persistent": { "cluster": { "max_shards_per_node": 5000 } } }'

 

查看分片数量

$ curl -XGET http://localhost:9200/_cluster/settings?pretty
{
"persistent" : {
"cluster" : {
"max_shards_per_node" : "5000"
}
},
"transient" : {
"cluster" : {
"max_shards_per_node" : "5000"
}
}
}

 

参考文档