有没有办法自动删除和重新创建Elasticsearch别名?

时间:2020-03-24 15:25:26

标签: python elasticsearch

我有一些可能存在竞争条件的代码。

我怀疑问题出在这里:

if self.es.indices.exists_alias(self.__class__.index_alias):
    old_index_name = (list(self.es.indices.get(self.__class__.index_alias).keys())[0])
    self.es.indices.delete_alias(index=old_index_name, name=self.__class__.index_alias)
self.es.indices.put_alias(index=self.destination_index, name=self.index_alias)

如果代码的其他部分希望同时通过其别名更新该索引,那似乎有点争用条件。

是否可以将删除和重新创建(也许是测试)组合到单个ES操作中?

我在Google上搜索了一下,但没有发现任何有趣的东西。

我还尝试了不带delete_alias的put_alias'操作,并从应用程序中得到了一些错误。不过,如果人们认为这应该有所帮助,我将再次进行讨论。

顺便说一句,当我使用curl检查索引列表时,麻烦的索引总是(几乎是?)黄色。

谢谢!

2 个答案:

答案 0 :(得分:1)

要排查黄色集群问题(这也可能是您的竞争状况的原因),您可以检查this答案。

别名链接和取消链接可以在单个原子API中完成,请使用rename alias api,您将看到:

重命名别名是一个简单的删除操作,然后在 相同的API。此操作是原子操作,无需担心时间短 别名不指向索引的时间段:

样本

POST /_aliases
{
    "actions" : [
        { "remove" : { "index" : "test1", "alias" : "alias1" } },
        { "add" : { "index" : "test1", "alias" : "alias2" } }
    ]
}

注意:此API是原子性的,因此,如果一项操作失败,它将回滚更改。

答案 1 :(得分:0)

如果您想使用 Python 中的 Elasticsearch 客户端执行别名的原子更新,请使用 ElasticSearch IndicesClient 中的 update_aliases 方法,如下例所示:

def update_aliases(es_client, indexes_wildcard, index_name, alias_name):
    body = {
        "actions": [
            {"remove": {"index": indexes_wildcard, "alias": alias_name}},
            {"add": {"index": index_name, "alias": alias_name}}
        ]
    }
    es_client.indices.update_aliases(body)

请参考 Elasticsearch Python 库 documentation