腾讯云Elasticsearch集群规划及性能优化实践 (4)

 

GET /_cat/pending_tasks insertOrder timeInQueue priority source 1685 855ms HIGH update-mapping [foo][t] 1686 843ms HIGH update-mapping [foo][t] 1693 753ms HIGH refresh-mapping [foo][[t]] 1688 816ms HIGH update-mapping [foo][t]

 

其中 priority 字段则表示该 task 的优先级,翻看 ES 的源码可以看到一共有六种优先级:

 

IMMEDIATE((byte) 0), URGENT((byte) 1), HIGH((byte) 2), NORMAL((byte) 3), LOW((byte) 4), LANGUID((byte) 5);

 

2. 查看分片未分配原因

 

当集群Red时候,我们可以通过下面的API来查看分片未分配的原因:

 

GET _cluster/allocation/explain

 

腾讯云Elasticsearch集群规划及性能优化实践

查看分片未分配的原因

 

其中 index和shard 列出了具体哪个索引的哪个分片未分配成功。reason 字段则列出了哪种原因导致的分片未分配。这里也将所有可能的原因列出来:

 

INDEX_CREATED:由于创建索引的API导致未分配。 CLUSTER_RECOVERED :由于完全集群恢复导致未分配。 INDEX_REOPENED :由于打开open或关闭close一个索引导致未分配。 DANGLING_INDEX_IMPORTED :由于导入dangling索引的结果导致未分配。 NEW_INDEX_RESTORED :由于恢复到新索引导致未分配。 EXISTING_INDEX_RESTORED :由于恢复到已关闭的索引导致未分配。 REPLICA_ADDED:由于显式添加副本分片导致未分配。 ALLOCATION_FAILED :由于分片分配失败导致未分配。 NODE_LEFT :由于承载该分片的节点离开集群导致未分配。 REINITIALIZED :由于当分片从开始移动到初始化时导致未分配(例如,使用影子shadow副本分片)。 REROUTE_CANCELLED :作为显式取消重新路由命令的结果取消分配。 REALLOCATED_REPLICA :确定更好的副本位置被标定使用,导致现有的副本分配被取消,出现未分配。

 

detail 字段则列出了更为详细的未分配的原因。下面我会总结下在日常运维工作中常见的几种原因。

 

如果未分配的分片比较多的话,我们也可以通过下面的API来列出所有未分配的索引和主分片:

GET /_cat/indices?v&health=red

 

3. 常见分片未分配原因总结

 

(1)磁盘满了 the node is above the high watermark cluster setting [cluster.routing.allocation.disk.watermark.high=95%], using more disk space than the maximum allowed [95.0%], actual free: [4.055101177689788%]

 

当我们执行 _cluster/allocation/explain 命令后看到上面的一行语句的话,则可以判断是该索引主分片所在的节点磁盘满了。

 

解决方法:扩容磁盘提升磁盘容量或者删除历史数据释放磁盘空间。

 

通常如果磁盘满了,ES为了保证集群的稳定性,会将该节点上所有的索引设置为只读。ES 7.x版本之后当磁盘空间提升后可自动解除,但是7.x版本之前则需要手动执行下面的API来解除只读模式:

 

PUT index_name/_settings { "index": { "blocks": { "read_only_allow_delete": null } } } (2)分片的文档数超过了21亿条限制

 

failure IllegalArgumentException[number of documents in the index cannot exceed 2147483519

 

该限制是分片维度而不是索引维度的。因此出现这种异常,通常是由于我们的索引分片设置的不是很合理。

 

解决方法:切换写入到新索引,并修改索引模版,合理设置主分片数。

  (3)主分片所在节点掉线

 

cannot allocate because a previous copy of the primary shard existed but can no longer be found on the nodes in the cluster

 

这种情况通常是由于某个节点故障或者由于负载较高导致的掉线。

 

解决方法:找到节点掉线原因并重新启动节点加入集群,等待分片恢复。

 

(4)索引所需属性和节点属性不匹配

 

node does not match index setting [index.routing.allocation.require] filters [temperature:\"warm\",_id:\"comdNq4ZSd2Y6ycB9Oubsg\"]

 

解决方法:重新设置索引所需的属性,和节点保持一致。因为如果重新设置节点属性,则需要重启节点,代价较高。

 

例如通过下面的API来修改索引所需要分配节点的温度属性:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpgjfd.html