Ошибка Index lifecycle error: index_closed_exception: closed

Добрый день! В Elasticsearch 7.3.1 возникает ошибка ilm

Index lifecycle error index_closed_exception: closed

Индекс при этом открыт - 100% уверен, для надежности даже делал

POST logs-servicename-2020.05.29-001972/_open

этому индексу. Заметил что такое возникает, что если есть индексы с таким же именем (на "теплых" нодах) которые закрыты. Но эта ошибка возникает на открытом индексе на "горячей" ноде, и из-за этого индексы не ролловятся.

Делаю:

GET logs-servicename-2020.05.29-001972/_ilm/explain

получаю такой вывод:

{
  "indices" : {
    "logs-servicename-2020.05.29-001972" : {
      "index" : "logs-servicename-2020.05.29-001972",
      "managed" : true,
      "policy" : "ilm_policy_20d",
      "lifecycle_date_millis" : 1591853716850,
      "phase" : "hot",
      "phase_time_millis" : 1591885841145,
      "action" : "rollover",
      "action_time_millis" : 1591853778932,
      "step" : "ERROR",
      "step_time_millis" : 1591885892717,
      "failed_step" : "check-rollover-ready",
      "step_info" : {
        "type" : "index_closed_exception",
        "reason" : "closed",
        "index_uuid" : "wTuCyTnNTYyaXPIzm0GOfA",
        "index" : "logs-servicename-2020.05.29-001972",
        "stack_trace" : """
[logs-servicename-2020.05.29-001972/wTuCyTnNTYyaXPIzm0GOfA] IndexClosedException[closed]
	at org.elasticsearch.cluster.metadata.IndexNameExpressionResolver.concreteIndices(IndexNameExpressionResolver.java:234)
	at org.elasticsearch.cluster.metadata.IndexNameExpressionResolver.concreteIndexNames(IndexNameExpressionResolver.java:142)
	at org.elasticsearch.cluster.metadata.IndexNameExpressionResolver.concreteIndexNames(IndexNameExpressionResolver.java:75)
	at org.elasticsearch.action.support.broadcast.node.TransportBroadcastByNodeAction$AsyncAction.<init>(TransportBroadcastByNodeAction.java:253)
	at org.elasticsearch.action.support.broadcast.node.TransportBroadcastByNodeAction.doExecute(TransportBroadcastByNodeAction.java:226)
	at org.elasticsearch.action.support.broadcast.node.TransportBroadcastByNodeAction.doExecute(TransportBroadcastByNodeAction.java:77)
	at org.elasticsearch.action.support.TransportAction$RequestFilterChain.proceed(TransportAction.java:145)
	at org.elasticsearch.xpack.security.action.filter.SecurityActionFilter.lambda$apply$0(SecurityActionFilter.java:86)
	at org.elasticsearch.action.ActionListener$1.onResponse(ActionListener.java:62)
	at org.elasticsearch.xpack.security.action.filter.SecurityActionFilter.lambda$authorizeRequest$4(SecurityActionFilter.java:172)
	at org.elasticsearch.action.ActionListener$1.onResponse(ActionListener.java:62)
	at org.elasticsearch.xpack.security.authz.AuthorizationService.lambda$runRequestInterceptors$15(AuthorizationService.java:341)
	at org.elasticsearch.action.ActionListener$1.onResponse(ActionListener.java:62)
	at org.elasticsearch.common.util.concurrent.ListenableFuture$1.run(ListenableFuture.java:99)
	at org.elasticsearch.common.util.concurrent.EsExecutors$DirectExecutorService.execute(EsExecutors.java:193)
	at org.elasticsearch.common.util.concurrent.ListenableFuture.notifyListener(ListenableFuture.java:92)
	at org.elasticsearch.common.util.concurrent.ListenableFuture.lambda$done$0(ListenableFuture.java:84)
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1540)
	at org.elasticsearch.common.util.concurrent.ListenableFuture.done(ListenableFuture.java:84)
	at org.elasticsearch.common.util.concurrent.BaseFuture.set(BaseFuture.java:144)
	at org.elasticsearch.common.util.concurrent.ListenableFuture.onResponse(ListenableFuture.java:117)
	at org.elasticsearch.action.StepListener.onResponse(StepListener.java:62)
	at org.elasticsearch.xpack.security.authz.interceptor.BulkShardRequestInterceptor.intercept(BulkShardRequestInterceptor.java:71)
	at org.elasticsearch.xpack.security.authz.AuthorizationService.lambda$runRequestInterceptors$14(AuthorizationService.java:336)
	at org.elasticsearch.action.ActionListener$1.onResponse(ActionListener.java:62)
	at org.elasticsearch.common.util.concurrent.ListenableFuture$1.run(ListenableFuture.java:99)
	at org.elasticsearch.common.util.concurrent.EsExecutors$DirectExecutorService.execute(EsExecutors.java:193)
	at org.elasticsearch.common.util.concurrent.ListenableFuture.notifyListener(ListenableFuture.java:92)
	at org.elasticsearch.common.util.concurrent.ListenableFuture.lambda$done$0(ListenableFuture.java:84)
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1540)
	at org.elasticsearch.common.util.concurrent.ListenableFuture.done(ListenableFuture.java:84)
	at org.elasticsearch.common.util.concurrent.BaseFuture.set(BaseFuture.java:144)
	at org.elasticsearch.common.util.concurrent.ListenableFuture.onResponse(ListenableFuture.java:117)
	at org.elasticsearch.action.StepListener.onResponse(StepListener.java:62)
	at org.elasticsearch.xpack.security.authz.interceptor.FieldAndDocumentLevelSecurityRequestInterceptor.intercept(FieldAndDocumentLevelSecurityRequestInterceptor.java:61)
	at org.elasticsearch.xpack.security.authz.interceptor.SearchRequestInterceptor.intercept(SearchRequestInterceptor.java:19)
	at org.elasticsearch.xpack.security.authz.AuthorizationService.lambda$runRequestInterceptors$14(AuthorizationService.java:336)
	at org.elasticsearch.action.ActionListener$1.onResponse(ActionListener.java:62)
	at org.elasticsearch.common.util.concurrent.ListenableFuture$1.run(ListenableFuture.java:99)
	at org.elasticsearch.common.util.concurrent.EsExecutors$DirectExecutorService.execute(EsExecutors.java:193)
	at org.elasticsearch.common.util.concurrent.ListenableFuture.notifyListener(ListenableFuture.java:92)
	at org.elasticsearch.common.util.concurrent.ListenableFuture.lambda$done$0(ListenableFuture.java:84)
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1540)
	at org.elasticsearch.common.util.concurrent.ListenableFuture.done(ListenableFuture.java:84)
	at org.elasticsearch.common.util.concurrent.BaseFuture.set(BaseFuture.java:144)
	at org.elasticsearch.common.util.concurrent.ListenableFuture.onResponse(ListenableFuture.java:117)
	at org.elasticsearch.action.StepListener.onResponse(StepListener.java:62)
	at org.elasticsearch.xpack.security.authz.interceptor.IndicesAliasesRequestInterceptor.intercept(IndicesAliasesRequestInterceptor.java:102)
	at org.elasticsearch.xpack.security.authz.AuthorizationService.lambda$runRequestInterceptors$14(AuthorizationService.java:336)
	at org.elasticsearch.action.ActionListener$1.onResponse(ActionListener.java:62)
	at org.elasticsearch.common.util.concurrent.ListenableFuture$1.run(ListenableFuture.java:99)
	at org.elasticsearch.common.util.concurrent.EsExecutors$DirectExecutorService.execute(EsExecutors.java:193)
	at org.elasticsearch.common.util.concurrent.ListenableFuture.notifyListener(ListenableFuture.java:92)
	at org.elasticsearch.common.util.concurrent.ListenableFuture.lambda$done$0(ListenableFuture.java:84)
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1540)
	at org.elasticsearch.common.util.concurrent.ListenableFuture.done(ListenableFuture.java:84)
	at org.elasticsearch.common.util.concurrent.BaseFuture.set(BaseFuture.java:144)
	at org.elasticsearch.common.util.concurrent.ListenableFuture.onResponse(ListenableFuture.java:117)
	at org.elasticsearch.action.StepListener.onResponse(StepListener.java:62)
	at org.elasticsearch.xpack.security.authz.interceptor.FieldAndDocumentLevelSecurityRequestInterceptor.intercept(FieldAndDocumentLevelSecurityRequestInterceptor.java:61)
	at org.elasticsearch.xpack.security.authz.interceptor.UpdateRequestInterceptor.intercept(UpdateRequestInterceptor.java:23)
	at org.elasticsearch.xpack.security.authz.AuthorizationService.lambda$runRequestInterceptors$14(AuthorizationService.java:336)
	at org.elasticsearch.action.ActionListener$1.onResponse(ActionListener.java:62)
	at org.elasticsearch.common.util.concurrent.ListenableFuture$1.run(ListenableFuture.java:99)
	at org.elasticsearch.common.util.concurrent.EsExecutors$DirectExecutorService.execute(EsExecutors.java:193)
	at org.elasticsearch.common.util.concurrent.ListenableFuture.notifyListener(ListenableFuture.java:92)
	at org.elasticsearch.common.util.concurrent.ListenableFuture.lambda$done$0(ListenableFuture.java:84)
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1540)
	at org.elasticsearch.common.util.concurrent.ListenableFuture.done(ListenableFuture.java:84)
	at org.elasticsearch.common.util.concurrent.BaseFuture.set(BaseFuture.java:144)
	at org.elasticsearch.common.util.concurrent.ListenableFuture.onResponse(ListenableFuture.java:117)
	at org.elasticsearch.action.StepListener.onResponse(StepListener.java:62)
	at org.elasticsearch.xpack.security.authz.interceptor.ResizeRequestInterceptor.intercept(ResizeRequestInterceptor.java:82)
	at org.elasticsearch.xpack.security.authz.AuthorizationService.runRequestInterceptors(AuthorizationService.java:342)
	at org.elasticsearch.xpack.security.authz.AuthorizationService.handleIndexActionAuthorizationResult(AuthorizationService.java:319)
	at org.elasticsearch.xpack.security.authz.AuthorizationService.lambda$authorizeAction$9(AuthorizationService.java:260)
	at org.elasticsearch.xpack.security.authz.AuthorizationService$AuthorizationResultListener.onResponse(AuthorizationService.java:604)
	at org.elasticsearch.xpack.security.authz.AuthorizationService$AuthorizationResultListener.onResponse(AuthorizationService.java:579)
	at org.elasticsearch.action.support.ContextPreservingActionListener.onResponse(ContextPreservingActionListener.java:43)
	at org.elasticsearch.xpack.security.authz.RBACEngine.buildIndicesAccessControl(RBACEngine.java:489)
	at org.elasticsearch.xpack.security.authz.RBACEngine.lambda$authorizeIndexAction$3(RBACEngine.java:281)
	at org.elasticsearch.action.ActionListener$1.onResponse(ActionListener.java:62)
	at org.elasticsearch.xpack.security.authz.AuthorizationService$CachingAsyncSupplier.lambda$getAsync$0(AuthorizationService.java:641)
	at org.elasticsearch.action.ActionListener$1.onResponse(ActionListener.java:62)
	at org.elasticsearch.xpack.security.authz.AuthorizationService.resolveIndexNames(AuthorizationService.java:550)
	at org.elasticsearch.xpack.security.authz.AuthorizationService.lambda$authorizeAction$6(AuthorizationService.java:248)
	at org.elasticsearch.action.ActionListener$1.onResponse(ActionListener.java:62)
	at org.elasticsearch.xpack.security.authz.AuthorizationService$CachingAsyncSupplier.lambda$getAsync$0(AuthorizationService.java:641)
	at org.elasticsearch.action.ActionListener$1.onResponse(ActionListener.java:62)
	at org.elasticsearch.xpack.security.authz.RBACEngine.loadAuthorizedIndices(RBACEngine.java:312)
	at org.elasticsearch.xpack.security.authz.AuthorizationService.lambda$authorizeAction$5(AuthorizationService.java:244)
	at org.elasticsearch.xpack.security.authz.AuthorizationService$CachingAsyncSupplier.getAsync(AuthorizationService.java:639)
	at org.elasticsearch.xpack.security.authz.AuthorizationService.lambda$authorizeAction$8(AuthorizationService.java:247)
	at org.elasticsearch.xpack.security.authz.AuthorizationService$CachingAsyncSupplier.getAsync(AuthorizationService.java:639)
	at org.elasticsearch.xpack.security.authz.RBACEngine.lambda$authorizeIndexAction$4(RBACEngine.java:273)
	at org.elasticsearch.action.ActionListener$1.onResponse(ActionListener.java:62)
	at org.elasticsearch.xpack.security.authz.RBACEngine.authorizeIndexActionName(RBACEngine.java:297)
	at org.elasticsearch.xpack.security.authz.RBACEngine.authorizeIndexAction(RBACEngine.java:270)
	at org.elasticsearch.xpack.security.authz.AuthorizationService.authorizeAction(AuthorizationService.java:258)
	at
...

"""
      },
      "phase_execution" : {
        "policy" : "ilm_policy_20d",
        "phase_definition" : {
          "min_age" : "0ms",
          "actions" : {
            "rollover" : {
              "max_size" : "200gb",
              "max_age" : "1d"
            }
          }
        },
        "version" : 21,
        "modified_date_in_millis" : 1583495675815
      }
    }
  }
}

Полный вывод не поместился по причине чрезмерного количества символов.

Индексы на "теплых" нодах я закрываю. Но речь сейчас об индексах, которые лежат на "горячих" нодах, они открыты, но ilm не срабатывает по ним, и они раздуваются до больших размеров.

Как решить эту проблему, подскажите пожалуйста?

Я не очень понимаю эту фразу. Индекс - это понятие логическое и существует на уровне кластера. Индекс с определенным именем в кластере может быть только один, и он либо открыт, либо закрыт. Шарды индекса - могут быть присвоены различным нодам. Вы не могли бы более подробно объяснить ситуацию?

Да - конечно. Извиняюсь что не подробно изложил все происходящее.

Есть индекс на "горячей" ноде:

logs-servicename-2020.05.29-001972

На "теплой" лежит вот такой, перемещенный туда как раз с помощью ilm, и на этом этапе все проходит нормально, индекс отролловился, переместился на "теплую":

logs-servicename-2020.05.29-001971

я закрываю этот индекс на теплой через POST /logs-servicename-2020.05.29-001971/_close api.

При этом индекс на горячей ноде открыт, данные в него пишутся и читаются. Но через какое-то время этот открытый и находящийся на "горячей" ноде индекс, видимо когда приходит время его отролловить через ilm - выдает описанную выше ошибку. Но индекс не закрыт! Он так и остается открытым - с ошибкой и не ролловится.

Эта ошибка у меня уже давно. Находил подобные советы, но они не помогли:

PUT /index/_settings
{
  "index.blocks.read_only_allow_delete": null
}

POST /index/_ilm/retry

Ошибка в stack_trace как будто говорит о недостатке каких-то прав, но как может не хватать прав юзеру elastic? или от кого ролловятся индексы? неужели у него нет роли superuser?

И потом, эта ошибка не всегда есть, а только когда предыдущий индекс, отролловленный и перемещенный на "теплую" ноду, я закрываю через _close api.

А CCR используется?

cross-cluster репликация не используется.

Я затрудняюсь сказать, что происходит. Судя по логу в этот момент logs-servicename-2020.05.29-001972 был закрыт, разработчик ILM утверждает, что это единственное объяснение этой ошибки, которое ему приходит в голову.

Я попробую воспроизвести эту ситуацию попозже.

Вот что мне удалось выяснить. Получив все алиасы через:

GET _aliases

я увидел, что мой алиас имеется не только у нужного мне и открытого индекса, но также и у трех других - закрытых.

Что я сделал:

POST /_aliases
{
    "actions" : [
        { "remove" : { "index" : "logs_appname-2020.05.27-000152", "alias" : "logs_appname" } },
        { "remove" : { "index" : "logs_appname-2020.05.28-000153", "alias" : "logs_appname" } }, 
        { "remove" : { "index" : "logs_appname-2020.05.09-000138", "alias" : "logs_appname" } }
        
    ]
}

POST logs_appname-2020.05.29-000154/_ilm/retry

GET logs_appname-2020.05.29-000154/_ilm/explain

{
  "indices" : {
    "logs_appname-2020.05.29-000154" : {
      "index" : "logs_appname-2020.05.29-000154",
      "managed" : true,
      "policy" : "ilm_policy_7d",
      "lifecycle_date_millis" : 1591896868100,
      "phase" : "hot",
      "phase_time_millis" : 1591896857310,
      "action" : "complete",
      "action_time_millis" : 1591896871583,
      "step" : "complete",
      "step_time_millis" : 1591896871583,
      "phase_execution" : {
        "policy" : "ilm_policy_7d",
        "phase_definition" : {
          "min_age" : "0ms",
          "actions" : {
            "rollover" : {
              "max_size" : "200gb",
              "max_age" : "1d"
            }
          }
        },
        "version" : 27,
        "modified_date_in_millis" : 1583498046946
      }
    }
  }
}

Так ilm сработал. При чем алиасы удалились у закрытых индексов, в чем я сомневался, но это сработало. Но дело в том, что у меня сейчас несколько сотен таких индексов.

Есть ли какая-то возможность массово удалить алиасы у всех индексов которые "is_write_index" : false?

И почему это не происходит при шаге ilm?

Так вы alias, что-ли, закрывали вместо индекса?

Посмотрите, пожалуйста, вторую половину секции Description документации Rollover.

Игорь, добрый день!

Так вы alias, что-ли, закрывали вместо индекса?

нет, я закрывал именно определенные индексы, например так:

POST logs-servicename-2020.05.29-001972/_close

Выглядит это странным образом - как баг в ilm в этой версии (7.3.1), словно ilm не убирает alias с отролловленного индекса - хотя навешивает на новый тоже.

Решил это удалением алиасов у всех закрытых индексов:

curl -s -u elastic:passwd -XGET "es_node:9200/_cat/indices" | grep "close" | awk '{print $3}' | xargs -I{} curl -s -u elastic:passwd -XDELETE "es_node:9200/{}/_aliases/*"

This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.