我有一些可能存在竞争条件的代码。
我怀疑问题出在这里:
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检查索引列表时,麻烦的索引总是(几乎是?)黄色。
谢谢!
答案 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