问题
this action would add [20] total shards, but this cluster currentlyhas [1986]/[2000] maximum shards
原因是因为 本次需要生成20个分片,分片数达到了上限,默认只允许2000个分片,问题是因为集群分片数不足引起的。
分析
从Elasticsearch v7.0.0 开始,集群中的每个节点默认限制 1000 个shard,如果你的es集群有2个数据节点,那么最多2000 shards。
Elasticsearch中的数据组织成索引。每一个索引由一个或多个分片组成。每个分片是Luncene索引的一个实例,你可以把实例理解成自管理的搜索引擎,用于在Elasticsearch集群中对一部分数据进行索引和处理查询。
当然并不是分片数越多越好,一般分片数多少与内存挂钩,
您可以在集群节点上保存的分片数量与您可用的堆内存大小成正比,
一个很好的经验法则是:
确保每个节点的分片数量保持在低于每1GB堆内存对应集群的分片在20-25之间。
因此,具有30GB堆内存的节点最多可以有600-750个分片,但是进一步低于此限制,您可以保持更好。 这通常会帮助群体保持处于健康状态。
提示:避免有非常大的分片,因为大的分片可能会对集群从故障中恢复的能力产生负面影响。
对于多大的分片没有固定的限制,但是分片大小为50GB通常被界定为适用于各种用例的限制。
解决办法
curl -XPUT -H "Content-Type:application/json"
http://localhost:9200/_cluster/settings -d
'{"transient":{"cluster":{"max_shards_per_node":2000}}}'
curl -XGET -u admin:Admin http://xxx:9200/_cluster/settings