ElasticSearch — переиндексация ваших данных без простоев

https://www.elastic.co/blog/change-mapping-with-zero-downtime/

С помощью этого руководства я пытаюсь создать новый индекс и переиндексировать свои данные с нулевым временем простоя.

Теперь у меня есть индекс под названием "Photoshooter", и я следую инструкциям

1) Создайте новый индекс "photoshooter_v1" с новым сопоставлением... (Готово)

2) Создать псевдоним...

curl -XPOST localhost:9200/_aliases -d '

{
    "actions": [
        { "add": {
            "alias": "photoshooter",
            "index": "photoshooter_v1"
        }}
    ]
}

и я получаю эту ошибку...

{
    "error": "InvalidAliasNameException[[photoshooter_v1] Invalid alias name [photoshooter], an index exists with the same name as the alias]",
    "status": 400
}

Я думаю, что я что-то теряю с логикой..


person Michalis    schedule 08.04.2015    source источник
comment
Удалось ли вам это осуществить? В документах ES никогда не упоминалось, что то, что вы пытаетесь сделать, невозможно, но их пример явно добавляет псевдоним к нескольким индексам как часть одной операции.   -  person tishma    schedule 18.05.2016
comment
Эй, я не прочитал сообщение об ошибке должным образом :) Я понимал, что это не позволит вам применить один и тот же псевдоним к более чем 1 индексу.   -  person tishma    schedule 18.05.2016


Ответы (2)


Допустим, ваш текущий индекс называется «фотострелок», если я правильно угадал, хорошо.

Теперь сначала создайте псевдоним для этого индекса - ОК

     {
            "actions": [
                { "add": {
                    "alias": "photoshooter_docs",
                    "index": "photoshooter"
                }}
            ]
        }

проверить это - curl -XGET 'localhost:9200/photoshooter_docs/_search'

Примечание. Теперь вы будете использовать «photoshooter_docs» в качестве имени индекса для взаимодействия с вашим индексом, который на самом деле является «photoshooter».

Теперь мы создаем новый индекс с вашим новым сопоставлением, скажем, назовем его «photoshooter_v2», теперь скопируйте данные индекса «photoshooter» в новый индекс (photoshooter_v2)

После того, как вы скопировали все свои данные, просто удалите псевдоним из предыдущего индекса в новый индекс -

      curl -XPOST localhost:9200/_aliases -d '
        {
            "actions": [
                { "remove": {
                    "alias": "photoshooter_docs",
                    "index": "photoshooter"
                }},
                { "add": {
                    "alias": "photoshooter_docs",
                    "index": "photoshooter_v2"
                }}
            ]
        }

проверить еще раз -> curl -XGET 'localhost:9200/photoshooter_docs/_search'

Поздравляем, вы изменили свое сопоставление без нулевого простоя.

И для копирования данных вы можете использовать такие инструменты

    https://github.com/mallocator/Elasticsearch-Exporter 

Примечание. Эти инструменты также копируют сопоставление из старого индекса в новый индекс, чего вы, возможно, не хотите делать. Чтобы вы прочитали его документацию или отредактировали ее в соответствии с вашим использованием.

Спасибо

Надеюсь это поможет

person Akash Yadav    schedule 08.04.2015
comment
Как я могу скопировать данные из старого в новый индекс. Должен ли я изменить имя индекса из моего приложения? - person Michalis; 08.04.2015
comment
Чтобы скопировать данные из одного индекса в другой, вы можете использовать такие инструменты, как этот github.com/mallocator/Elasticsearch-Exporter Есть много других доступных инструментов, вы можете использовать любой из них. Просто прочитайте документацию по этому инструменту и запустите его в соответствии с потребностями вашего проекта. - person Akash Yadav; 08.04.2015
comment
Для копирования данных в elasticsearch есть опция с базовым _reindex. Не пробовала. elastic.co/guide/en/elasticsearch/reference/ 7.3/ - person user1769790; 07.08.2019

Это очень просто, вы не можете создать псевдоним с именем уже существующего индекса.

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

Если вы хотите делать это ежедневно, вы можете добавить, скажем, дату к имени вашего индекса и включать его каждый день.

person eliasah    schedule 08.04.2015
comment
если я удалю старый, я потеряю все данные!! я хочу нулевое время простоя... Если новые данные добавляются или изменяются в моем индексе при копировании моих данных в новый индекс... это будет проблемой - person Michalis; 08.04.2015
comment
вам нужно переиндексировать данные в новом, а затем удалить старый индекс. Другого пути нет. - person eliasah; 08.04.2015
comment
Вот так... elastic.co/guide /en/elasticsearch/guide/master/, но я кое-что упускаю... Для начала создайте индекс my_index_v1 и настройте псевдоним my_index, чтобы он указывал на него: но когда я попробую это... я получаю эту ошибку... {ошибка: InvalidAliasNameException[[photoshooter_v1] Неверный псевдоним [photoshooter], существует индекс с тем же именем, что и псевдоним], статус: 400} - person Michalis; 08.04.2015
comment
потому что вы создаете псевдоним с тем же именем, что и у существующего индекса! Как я уже ответил. можете ли вы попытаться обновить свой вопрос с помощью таблицы индексов, которая у вас есть, вместе с псевдонимами, используя cat API - person eliasah; 08.04.2015