我们有一个每秒向 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) [?:?]
Run Code Online (Sandbox Code Playgroud)
在第一行中,我在末尾添加了省略号,因为它实际上相当大,这是我们所看到的图像(正如您在图像中看到的那样,该行突然结束):
您知道这些错误消息是关于什么的吗?
我们是否有可能因为集群状态太大而看到这些消息?这是否意味着我们有太多的分片或节点?
谢谢。
笔记:
当 ES 无法应对大型集群状态时,会出现此错误,并且更新集群状态的默认超时时间为 10 秒,但正如错误消息中提到的,大约需要 30 秒。
MasterService.java集群状态在主节点上计算,然后按Elasticsearch 类发布 Diff(节点存在)或整个集群状态(如果新节点加入集群) 。
您有大量的分片信息,这些信息保存在集群状态中,您的主节点无法在 default 内计算状态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);
}
}
Run Code Online (Sandbox Code Playgroud)
您可以检查异常类org.elasticsearch.cluster.metadata.ProcessClusterEventTimeoutException代码如下
public ProcessClusterEventTimeoutException(TimeValue timeValue, String source) {
super("failed to process cluster event (" + source + ") within " + timeValue);
}
Run Code Online (Sandbox Code Playgroud)
你可以看看上面的代码,这将有助于你更好地理解问题。
解决问题的一些建议:
Run Code Online (Sandbox Code Playgroud)cluster.publish.info_timeout = 10s default(maybe this can work) cluster.publish.timeout = 30s by default
| 归档时间: |
|
| 查看次数: |
6855 次 |
| 最近记录: |