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



使用elasticsearch 8.4.3和Java 17和一个有3个节点的集群,其中3个节点是合格的主节点,我们从以下情况开始:

  • 指数产品- 2023 - 01 - 12 - 0900它有一个别名current-products

然后启动一个作业,创建一个新的索引products-2023-01-12-1520最后在客户端使用elastic-rest-client和别名API,我们进行如下调用:

At 2023-01-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}

但是看看我们最后得到的,我们仍然有旧的索引当前产品别名。

我不明白为什么会发生这种情况,而且它并不是100%发生的(在大约10个索引中发生了2次)。这是一个已知的bug吗?还是有规律的行为?

编辑@warkolm:

/_cat/别名吗?在索引前的V:

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

您更新别名的方式似乎有问题。使用"remove"对_aliases端点执行POST请求时和";add"在执行请求时,Elasticsearch将根据索引的当前状态更新别名。

然而,有可能有其他进程或操作也在同时修改索引或别名,这可能导致冲突或不一致。此外,当您在"索引"中使用通配符(*)时。字段的"remove"操作时,它将从匹配模式的所有索引中删除别名,这可能不是预期的行为。

为了避免这个问题,您可以尝试使用Indices Aliases API而不是_aliases端点。该API允许对别名执行原子更新,这意味着只有在所有操作成功时才会更新别名,如果任何操作失败则会回滚别名。此外,可以显式指定要从中删除别名的索引,而不是使用通配符。

下面是一个如何使用Indices Aliases 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"中删除。并增加了具体指标"产品-2023-01-12-1520"。这可以帮助避免可能由同时修改索引或别名的其他进程或操作引起的任何冲突或不一致。

此外,建议使用等于或大于8.4.3的elasticsearch版本,因为它修复了许多可能导致您面临的问题的错误。

总之,你遇到的问题可能不是一个已知的错误,但如果多个进程同时修改索引或别名,这是一个正常的行为,使用索引别名API并指定确切的索引来删除或添加别名可以帮助避免这个问题。

最新更新