Elasticsearch分片到达上限错误

在工作中见过后台连接的测试服elasticsearch报过如下错误:

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

查询得是elasticsearch达到默认的分片上限1000,网上一般给出的解决方法是增加这个上限,比如增加到10000:

1
2
3
4
5
6
7
8
9

PUT /_cluster/settings
{
"transient": {
"cluster": {
"max_shards_per_node":10000
}
}
}

这个方法的确能缓解这个问题,但官方是不建议一台服务器有很多分片的,分片的本质是Lucene实例,每个Lucene实例都会消耗文件句柄,内存与CPU资源。

对于每个 Elasticsearch 索引,映射和状态的相关信息都存储在集群状态中。这些信息存储在内存中,以便快速访问。因此,如果集群中的索引和分片数量过多,这会导致集群状态过大,如果映射较大的话,尤为如此。这会导致更新变慢,因为所有更新都需要通过单线程完成,从而在将变更分发到整个集群之前确保一致性。

每个节点上可以存储的分片数量与可用的堆内存大小成正比关系,但是 Elasticsearch 并未强制规定固定限值。这里有一个很好的经验法则:确保对于节点上已配置的每个 GB,将分片数量保持在 20 以下。如果某个节点拥有 30GB 的堆内存,那其最多可有 600 个分片,但是在此限值范围内,您设置的分片数量越少,效果就越好。一般而言,这可以帮助集群保持良好的运行状态。

Elasticsearch默认是当分布式集群布署,在7版本以下默认一个索引有五个主分片,而7版本以上有一个主分片,分片可以分布到不同的节点上,提高整体性能
,但对于单机测试服来说,一个索引对应一个分片就可以了。

所以,当遇到这个错误时,可以先想下索引是不是需要这么多,索引对应的分片数是不是需要减少,或者是集群是不是该添加节点。

参考:
https://www.elastic.co/guide/en/elasticsearch/guide/2.x/_add_an_index.html#_add_an_index
https://www.elastic.co/cn/blog/how-many-shards-should-i-have-in-my-elasticsearch-cluster


- - END - -


腾讯云
0%