在ElasticSearch中更改别名返回200并确认,但不更改别名

gajydyqb  于 2023-01-25  发布在  ElasticSearch
关注(0)|答案(1)|浏览(125)

使用带有Java 17的elasticsearch 8.4.3和3个节点的集群,其中3个节点符合master条件,我们从以下情况开始:

  • 索引产品-2023 -01 -12 -0900,具有别名当前产品

然后,我们启动一个创建新索引products-2023-01-12-1520的作业,最后在客户端使用elastic-rest-clientalias API,我们执行以下调用:
2023年1月12日16时27分26,893秒:

POST _aliases
{"actions":[
   {
    "remove": { 
       "alias":"current-products",
       "index":"products-*"
    }
   },
   { 
    "add":{
       "alias":"current-products",
       "index":"products-2023-01-12-1520"}
    }
]}

我们在26米利斯后得到以下响应,HTTP响应代码为200:

{"acknowledged":true}

但是看看我们最终得到的结果,我们仍然有带有current-products别名的旧索引。
我不明白为什么会发生这种情况,而且也不是100%发生(大约10次索引中发生了2次)。这是一个已知的bug吗?还是一个常规行为?
编辑@warkolm:
GET /_cat/aliases?v索引化之前的当前版本:

alias               index                       filter routing.index routing.search is_write_index
current-products    products-2023-01-13-1510    -      -             -              -
5m1hhzi4

5m1hhzi41#

您更新别名的方式可能存在问题。当您使用“删除”和“添加”操作对_aliases端点执行POST请求时,Elasticsearch将根据执行请求时索引的当前状态更新别名。
但是,可能还有其他进程或操作也在同时修改索引或别名,这可能会导致冲突或不一致。此外,当您在“删除”操作的“索引”字段中使用通配符(*)时,它将从所有与模式匹配的索引中删除别名,这可能不是预期的行为。
要避免此问题,您可以尝试使用索引别名API而不是_aliases端点。此API允许您对别名执行原子更新,这意味着仅当所有操作成功时才会更新别名,并且在任何操作失败时将回滚。此外,您可以显式指定要从中删除别名的索引,而不是使用通配符。
以下是如何使用索引别名API更新别名的示例:

POST /_aliases
{
    "actions": [
        { "remove": { "index": "products-2023-01-12-0900", "alias": "current-products" } },
        { "add": { "index": "products-2023-01-12-1520", "alias": "current-products" } }
    ]
}

这样,别名将仅从特定索引“products-2023-01-12-0900”中移除,并添加到特定索引“products-2023-01-12-1520”中。这可以帮助避免可能由同时修改索引或别名的其他过程或动作引起的任何冲突或不一致。
此外,建议使用等于或高于8.4.3的elasticsearch版本,因为它修复了许多可能导致您所面临问题的bug。
总之,您遇到的问题可能不是已知的错误,但如果多个进程同时修改索引或别名,则这是一种常规行为,使用索引别名API并指定确切的索引来删除或添加别名可以帮助避免此问题。

相关问题