原子别名交换失败,index_not_found_exception完全不相关的索引



我想用零停机时间替换和索引,如 ES 文档中所述。

我这样做是:

  • 使用新数据创建新的索引my_index_v2
  • 刷新新索引
  • 然后通过执行以下请求在原子操作中交换它们:

POST /_aliases

{
"actions": [
{ "remove": { "index": "*", "alias": "my_index" }},
{ "add":    { "index": "my_index_v2", "alias": "my_index" }}
]
}

这按预期工作,除非它随机失败并发出 404 响应。错误消息是:

{
"error": {
"root_cause": ... (same)
"type": "index_not_found_exception",
"reason": "no such index",
"resource.type": "index_or_alias",
"resource.id": "my_unrelated_index_v13",
"index": "my_unrelated_index_v13"
},
"status": 404
}
之后,仅
  • 当交换有效时,我们才会删除与此别名关联的现在未使用的索引,并且仅删除此别名。

整个操作每隔几分钟定期发生一次。与所述类似的操作可能会同时在集群中的其他别名/索引上发生。该错误每隔几个小时随机发生一次。

这些操作会相互干扰有什么原因吗?这是怎么回事?

编辑:澄清了最后的删除步骤。

这很难在本地环境中重现,因为它似乎只发生在高度并发的场景中。然而。。。正如 @Eirini Graonidou 在评论中指出的那样,这看起来确实像一个 ES 错误,在 PR 23153 中解决了

从拉取请求(强调我的):

当错误请求发送到Elasticsearch(如果一个名为"bad-request"的索引不存在,那么它 生成"找不到索引"异常,否则响应 名为"错误请求"的索引的索引设置)。

这并不能解释"错误请求"的情况,但绝对解释了为什么错误消息没有意义。

更重要的是:升级 elasticsearch 解决了这个问题

最新更新