Есть ли способ удалить и воссоздать псевдоним Elasticsearch атомарно? - PullRequest
1 голос
/ 24 марта 2020

У меня есть некоторый код с вероятным состоянием гонки.

Я подозреваю, что проблема заключается здесь:

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?

Я немного погуглил, но ничего интересного не нашел.

Я также попытался просто положить put_alias без delete_alias и получил несколько ошибок из приложения. Я вернусь к этому, хотя, если люди думают, что это должно помочь.

Кстати, проблемный индекс (почти?) Всегда желтый, когда я проверяю список индексов с помощью curl.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 25 марта 2020

Согласно документации python - здесь - вы можете использовать метод update_aliases():

def update_my_alias(index_name, new_alias, old_alias):
    body = {"actions" : [{ "remove" : { "index" : index_name, "alias" : old_alias} },{ "add" : { "index" : index_name, "alias" : new_alias } }]}
    es.indices.update_aliases(body)


if self.es.indices.exists_alias(self.__class__.index_alias):
     update_my_alias(index_name =self.destination_index, new_alias=self.index_alias, old_alias=self.__class__.index_alias)
0 голосов
/ 24 марта 2020

Для устранения проблемы с желтым кластером, которая также может быть причиной вашего состояния гонки, вы можете проверить этот ответ.

Псевдоним и удаление ссылок можно выполнить в один API, который атомом c, пожалуйста, используйте переименовать псевдоним API и, как вы можете прочитать:

Переименование псевдонима является простой операцией удаления и добавления в тот же API. Эта операция выполняется атомно c, не нужно беспокоиться о коротком промежутке времени, когда псевдоним не указывает на индекс:

Пример

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

Примечание. Этот API-интерфейс атомом c, поэтому он может откатить изменения, если одна операция не удалась.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...