gpt4 book ai didi

ElasticSearch 的 MasterService 计算集群状态的时间太长并抛出 ProcessClusterEventTimeoutException

转载 作者:行者123 更新时间:2023-12-02 22:12:33 25 4
gpt4 key购买 nike

我们有一个每秒向我们的 ES 集群添加数千个文档的应用程序。每次我们翻转我们正在写入的索引并开始写入新索引时,我们都会收到以下错误,这些错误不允许摄取文档大约 1 分钟。 1 分钟后,一切恢复正常,直到我们再次翻转索引。

[WARN ][o.e.c.s.MasterService    ] [NODE_NAME_1] took [28.3s], which is over [10s], to compute cluster state update for [put-mapping[_doc, _doc, ...
[DEBUG][o.e.a.a.i.m.p.TransportPutMappingAction] [NODE_NAME_1] failed to put mappings on indices [[[INDEX_1/SOME_ID]]], type [_doc]
org.elasticsearch.cluster.metadata.ProcessClusterEventTimeoutException: failed to process cluster event (put-mapping) within 30s
at org.elasticsearch.cluster.service.MasterService$Batcher.lambda$onTimeout$0(MasterService.java:143) [elasticsearch-7.5.2.jar:7.5.2]
at java.util.ArrayList.forEach(ArrayList.java:1507) [?:?]
at org.elasticsearch.cluster.service.MasterService$Batcher.lambda$onTimeout$1(MasterService.java:142) [elasticsearch-7.5.2.jar:7.5.2]
at org.elasticsearch.common.util.concurrent.ThreadContext$ContextPreservingRunnable.run(ThreadContext.java:703) [elasticsearch-7.5.2.jar:7.5.2]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) [?:?]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) [?:?]
at java.lang.Thread.run(Thread.java:830) [?:?]

在第一行中,我把省略号放在末尾,因为它实际上很大,这是我们所看到的图像(如您在图像中看到的那样,该行突然结束):

enter image description here

您知道这些错误消息是关于什么的吗?

我们看到这些消息是否可能是因为我们的集群状态太大?这是否意味着我们有太多分片或节点?

谢谢。

注意:

  • 我们使用 ElasticSearch 7.5.2
  • 我们不使用 ILM,当我说“翻转我们的索引”时,我们所做的是开始写入数小时前创建但未使用的新索引。然后我们停止写入旧索引。

最佳答案

当 ES 无法应对大型集群状态时会出现此错误,并且更新集群状态的默认超时为 10 秒,但正如您的错误消息中所述,它花费了 ~30 秒。

集群状态在主节点上计算,然后通过 MasterService.java 类发布 Diff(节点存在)或整个集群状态(如果新节点加入集群) Elasticsearch 。

你有大量的分片信息,这些信息在集群状态中维护,你的主节点无法在默认 10s 内计算状态。

下面是来自 Elasticsearch 类 org.elasticsearch.cluster.service.ClusterApplierService 的代码,它尝试更新集群状态并抛出此异常。

try {
UpdateTask updateTask = new UpdateTask(config.priority(), source, new SafeClusterApplyListener(listener, logger), executor);
if (config.timeout() != null) {
threadPoolExecutor.execute(updateTask, config.timeout(),
() -> threadPool.generic().execute(
() -> listener.onFailure(source, new ProcessClusterEventTimeoutException(config.timeout(), source))));
} else {
threadPoolExecutor.execute(updateTask);
}
}

您可以检查异常类 org.elasticsearch.cluster.metadata.ProcessClusterEventTimeoutException 代码如下

public ProcessClusterEventTimeoutException(TimeValue timeValue, String source) {
super("failed to process cluster event (" + source + ") within " + timeValue);
}

你可以看看上面的代码,这将有助于你更好地理解问题。

解决问题的一些建议:

  1. 增加主节点的堆大小和 CPU,以便像您的情况一样快速计算集群状态,即使计算的第一步需要 30 秒。这意味着您的主节点没有足够的基础设施来快速计算它。
  2. 删除不必要的索引,这将减少分片数量和集群状态。
  3. 下面是发布集群状态的设置,这是第二步,如果你发现发布需要很长时间,那么如果数据节点在这段时间内不可用,你可以这样做。
cluster.publish.info_timeout = 10s default(maybe this can work)
cluster.publish.timeout = 30s by default

关于ElasticSearch 的 MasterService 计算集群状态的时间太长并抛出 ProcessClusterEventTimeoutException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60518260/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com